Forum: Mikrocontroller und Digitale Elektronik esp programmierung - ist mein Vorhaben machbar ?


von Jochen B. (kleiner_schelm)


Lesenswert?

Ich habe 2 Pulse Sensoren, die ich mit ESP8266 oder ESP32 auswerten 
kann.

Die zwei Sensoren schalten zeitverzögert, aber fast direkt 
hintereinander oder sogar überlagert.

Ich brauche eine Erkennung, welcher Sensor zuerst geschaltet hat.

Mit den ESP Mikrocontrollern habe ich erst seit kurzem zu tun. Nutze das 
mit Home Assistant und ESP Home.
Früher habe ich beruflich sehr viel SPS-Steuerungen programmiert, kenne 
mich in visual Basic auch etwas aus.
Das hier ist neu und deshalb frage ich nach, ob das überhaupt zu 
realisieren ist. Gibt das die Microcontrollerprogrammierung her ?
Ich kann mich da rein fuchsen, will aber wissen, ob das überhaupt 
machbar ist.

Meine Vorstellung in VBA:
1
Dim M1 as boolean
2
Dim M2 as boolean
3
dim reset as double
4
5
if Sensor1 = true then
6
  if M2 = true then
7
  M1 = false
8
  else
9
  M1 = true
10
  M2 = false
11
  Reset = 0
12
  end if
13
end if
14
15
if Sensor2 = true then
16
  if M1 = true then
17
  M2 = false
18
  else
19
  M2 = true
20
  M1 = false
21
  Reset = 0
22
  end if
23
end if  
24
25
if Reset = 100000 then
26
M1 = false
27
M2 = false
28
Reset = 0
29
end if

Wird vielleicht auch nicht alles mit ESP Home machbar sein, was mit 
direkter programmierung möglich ist.

Die Daten werden jede Minute an home Assistant gegeben. dort werte ich 
dann die Anzahl der Pulse aus sowie den Zustand von M1 und M2

Vielen Dank für eure Hilfe.

: Bearbeitet durch Moderator
von Ron-Hardy G. (ron-hardy)


Lesenswert?

das sollte man in diesem Fall besser über flankengesteuerte Interrupts 
machen und nicht über polling

von Jochen B. (kleiner_schelm)


Lesenswert?

Hallo,

danke für die Hilfe. Ich guck mir den Befehl an.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Jochen B. schrieb:
> Die zwei Sensoren schalten zeitverzögert, aber fast direkt
> hintereinander oder sogar überlagert.

Wie kritisch ist die Auflösung? Wenn der eine Sensor 1us vor dem anderen 
schaltet, muss das korrekt erkannt werden oder reicht es dann auch das 
als "gleichzeitig" zu erkennen?

Ron-Hardy G. schrieb:
> flankengesteuerte Interrupts machen und nicht über polling

Interrupts haben eine gewisse Latenz und werden u.U. nicht in der 
richtigen Reihenfolge abgearbeitet. Wenn die Signale also sehr schnell 
aufeinander folgen kann man das so nicht auflösen.

Wenn es also sehr genau sein muss könnte es sein dass das mit den ESP 
nicht geht. Da bräuchte es einen Mikrocontroller mit besserer 
Timer-Peripherie, z.B. STM32, oder etwas externe digitale Logik.

von Peter D. (peda)


Lesenswert?

Jochen B. schrieb:
> Ich brauche eine Erkennung, welcher Sensor zuerst geschaltet hat.

In welchen Zeitdimensionen (fs, µs, s, min, h, d, a ...)?

Jochen B. schrieb:
> Meine Vorstellung in VBA:

Was soll das werden?
"reset" ist überflüssig, da es immer 0 ist.

Man sollte sich Code auch logisch durchdenken oder besser erstmal einen 
Programmablaufplan erstellen.

von Steve van de Grens (roehrmond)


Lesenswert?

Sind die ESP Module bei ESP Home überhaupt frei programmierbar?
Willst du die "Zentrale" oder die ESP Module programmieren?
Hängen beide Sensoren zusammen am selben ESP chip?

: Bearbeitet durch User
von Jochen B. (kleiner_schelm)


Lesenswert?

Hallo,

vielen Dank für Eure Unterstützung.

Die zwei Sensoren sind an einem ESP8266. Auf D5 und D6 zum Beispiel.
Die Signale kommen verzögert mindestens 500 ms versetzt.
Überlagert bedeutet, dass Signal 2 auf high geht, während Signal 1 noch 
high ist.
Das ganze muss auf dem ESP8266 programmiert werden.
Ich habe da ins blaue den vba Code gemacht, damit ihr ne Vorstellung 
bekommt, was das werden soll.

Der Einwand, dass Reset immer Null ist, ist korrekt. Denn ich habe im 
Code die Zeile : Reset = Reset + x  vergessen.

Die zwei Sensoren schalten intervallmäßig, die Merker müssen nach Zeit x 
resetet werden. Nur so ist eine Änderung der Richtung erkennbar. gibt 2 
Möglichkeiten: S2 folgt auf S1 und S1 folgt auf S2. je nachdem welcher 
Sensor zuerst schaltet. Das kann sich ändern.

von Udo S. (urschmitt)


Lesenswert?

Jochen B. schrieb:
> mindestens 500 ms

Also ewig und 3 Tage für einen Mikrocontroller.
Dann polle mit 100ms beide Eingänge. Dazwischen kann der µC stromsparend 
schlafen.

von Rainer W. (rawi)


Lesenswert?

Jochen B. schrieb:
> Ich habe da ins blaue den vba Code gemacht, damit ihr ne Vorstellung
> bekommt, was das werden soll.

Lese beide Sensoren gemeinsam (über einen Bytezugriff) ein und nicht 
"Sensor1 hier und Sensor2 dort". Danach wertest du in aller Ruhe durch 
Vergleich mit dem Zustand beim vorherigen Auslesen aus.

von Peter D. (peda)


Lesenswert?

Jochen B. schrieb:
> Die zwei Sensoren schalten intervallmäßig, die Merker müssen nach Zeit x
> resetet werden.

Das ist fehlerträchtig, wenn sich die Signale nicht exakt an Deinen 
Ablauf halten.
Warum nicht einfach nur auswerten, wenn einer auf 1 geht, während der 
andere auf 0 ist.

von Jochen B. (kleiner_schelm)


Lesenswert?

Peter D. schrieb:
> Jochen B. schrieb:
>> Die zwei Sensoren schalten intervallmäßig, die Merker müssen nach Zeit x
>> resetet werden.
>
> Das ist fehlerträchtig, wenn sich die Signale nicht exakt an Deinen
> Ablauf halten.
> Warum nicht einfach nur auswerten, wenn einer auf 1 geht, während der
> andere auf 0 ist.

So den Reset zu machen war meine erste Idee. Die Pausenzeit zwischen den 
Pulsen ist auch Faktor 10. Nach dem jeweileigen 1x Puls pro Sensor kommt 
eine 10fache Pausenzeit, dann wieder 1x ein Puls je Sensor. Ich dachte , 
die Zeit über Versuche ermitteln zu können.

Vielen Dank für die Ideen. Ich gucke mir da gerade die Befehle von ESP 
Home an.
Was vereinfacht die Byteauswertung ? Ich muss das erkennen, welches Bit 
zuerst gesetzt wurde. Ich müsste das Byte abfragen, dann merken, dass 
ein Bit gesetzt wurde, danach, wenn das zweite Bit gesetzt wird, 
auswerten. Aber wenn die Bit einzeln hintereinander ohne Überschneidung 
kommen ?

Bin trotzdem für jede Idee dankbar.

Jedenfalls bin ich sicher, dass der ESP8266 das kann. Sonst hättet ihr 
mein Vorhabnen längst zerrissen. Ich bekomme das hin, ist auch nix 
kompliziertes.

: Bearbeitet durch User
Beitrag #7381872 wurde vom Autor gelöscht.
von Jochen B. (kleiner_schelm)


Angehängte Dateien:

Lesenswert?

so, es ist fertig. ich habe switch statt globals genommen. War einfach, 
das in Home Assistant zu kontrollieren, ob der Code geht.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Jochen B. schrieb:
> Die zwei Sensoren sind an einem ESP8266. Auf D5 und D6 zum Beispiel.
> Die Signale kommen verzögert mindestens 500 ms versetzt.
In 500ms kann der Prozessor auf dem ESP eine Endlosschleife locker 3x 
komplett durchzählen...

Jochen B. schrieb:
> ob der Code geht.
Wenigstens ein PNG und kein JPEG.

Dir ist aber grundsaätzlich schon klar, dass ein normales Textfile oder 
ein Codeschnipsel zwischen [code]-Tags viel leichter bearbeitbar wäre?

: Bearbeitet durch Moderator
von Daniel F. (df311)


Lesenswert?

Lothar M. schrieb:
> In 500ms kann der Prozessor auf dem ESP eine Endlosschleife locker 3x
> komplett durchzählen...

steckt da etwa ein kleiner chuck norris drinnen? ;-)

von Jochen B. (kleiner_schelm)


Lesenswert?

Lothar M. schrieb:
>
> Dir ist aber grundsaätzlich schon klar, dass ein normales Textfile oder
> ein Codeschnipsel zwischen Tags viel leichter bearbeitbar wäre?

hatte das vorher probiert, aber das "/" am ende Code vergessen. so wurde 
die Formatierung zerlegt. Deshalb habe ich ein Bild gepostet. Ich hab 
früher viel in Access Foren geschrieben, da auch immer als Code 
gepostet.

Der Zweck heiligt die Mittel. Wenn der Code geht ist gut. Ich hab bisher 
nix mit esp Programmierung und auch ESP Home zu tun gehabt. Und auch nix 
im internet gefunden, das problem hatte bis jetzt wohl niemand. Wenn 
sich jemand hier her verirrt, hier der Code zum kopieren. Ihr braucht 
das aber sicher nicht, das ist ja was Home Assistant spezielles. D8 ist 
nicht belegt, wird als dummy benutzt.
1
captive_portal:
2
3
switch:
4
  - platform: gpio
5
    pin: D8
6
    name: "swMerker vorwarts"
7
    id: sw_vorwarts
8
9
  - platform: gpio
10
    pin: D8
11
    name: "swMerker zuruck"
12
    id: sw_zuruck    
13
14
  - platform: gpio
15
    pin: D8
16
    name: "laufrichtung"
17
    id: laufrichtung    
18
19
20
binary_sensor:
21
  - platform: gpio
22
    pin: D5
23
    name: "binMerker vorwarts"
24
    id: bin_M_v
25
    on_press:
26
      then:
27
        - switch.turn_on: sw_vorwarts      # hier wird der Switch "vorwärts" eingeschaltet 
28
        - delay: 5s                        # nach 5 Sekunden wird der Switch wieder ausgeschaltet
29
        - switch.turn_off: sw_vorwarts
30
    on_state:
31
      - if:
32
          condition:                        # hier wird die Laufrichtung auf False = vorwärts geschaltet
33
            switch.is_on: sw_zuruck
34
          then:
35
            - switch.turn_on: laufrichtung
36
          else:
37
          - switch.turn_off: laufrichtung    
38
39
  - platform: gpio
40
    pin: D6
41
    name: "binMerker zuruck"
42
    id: bin_M_z
43
    on_press:
44
      then:
45
        - switch.turn_on: sw_zuruck        # hier wird der Switch "rückwärts" eingeschaltet 
46
        - delay: 5s                        # nach 5 Sekunden wird der Switch wieder ausgeschaltet
47
        - switch.turn_off: sw_zuruck
48
    on_state:
49
      - if:
50
          condition:                        # hier wird die Laufrichtung auf True = rückwärts geschaltet
51
            switch.is_on: sw_vorwarts
52
          then:
53
            - switch.turn_off: laufrichtung
54
          else:
55
            - switch.turn_on: laufrichtung

: Bearbeitet durch User
von Jochen B. (kleiner_schelm)


Lesenswert?

Code geändert, die Timer sind raus. wird jetzt nur durch die Flanken 
getriggert. Das mit den Timern ist nicht ganz sauber.
1
binary_sensor:
2
  - platform: gpio
3
    pin: D5
4
    name: "binMerker vorwarts"
5
    id: bin_M_v
6
    on_press:
7
      - if:
8
          condition:                        # nur wenn vorher kein anderer Merker gesetzt wurde, den Merker setzen
9
            switch.is_on: sw_zuruck
10
          then:
11
            - switch.turn_on: laufrichtung   # laufrichtung rückwärts aktivieren
12
          else:
13
          - switch.turn_off: laufrichtung    # laufrichtung vorwärts aktivieren +
14
          - switch.turn_on: sw_vorwarts      # Merker vorwärts setzen
15
    
16
    on_release: 
17
      - if:
18
          condition:                         # bei fallender Flanke Merker zurück setzen
19
            switch.is_on: sw_zuruck
20
          then:
21
            - switch.turn_off: sw_vorwarts   # wenn der Merker zurück als erstes gesetzt war, beide Merker zurück setzen 
22
            - switch.turn_off: sw_zuruck 
23
            - switch.turn_on: laufrichtung   # laufrichtung setzen = True = rückwärts   
24
          else:
25
            - switch.turn_on: sw_vorwarts    # Merker vorwärts setzen   
26
27
  - platform: gpio
28
    pin: D6
29
    name: "binMerker zuruck"
30
    id: bin_M_z
31
    on_press:
32
     - if:
33
          condition:                         # nur wenn vorher kein anderer Merker gesetzt wurde, den Merker setzen
34
            switch.is_on: sw_vorwarts
35
          then:
36
            - switch.turn_off: laufrichtung  # laufrichtung vorwärts aktivieren
37
          else:
38
          - switch.turn_on: laufrichtung     # laufrichtung rückwärts aktivieren +
39
          - switch.turn_on: sw_zuruck        # Merker rückwärts setzen
40
    
41
    on_release: 
42
      - if:
43
          condition:                         # bei fallender Flanke Merker zurück setzen
44
            switch.is_on: sw_vorwarts
45
          then:
46
            - switch.turn_off: sw_vorwarts   # wenn der Merker vorwärts als erstes gesetzt war, beide Merker zurück setzen 
47
            - switch.turn_off: sw_zuruck 
48
            - switch.turn_off: laufrichtung  # laufrichtung setzen = False = vorwärts   
49
          else:
50
            - switch.turn_on: laufrichtung   # laufrichtung setzen = True = rückwärts

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.