esp programmierung - ist mein Vorhaben machbar ?

OP #7380669
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.

Persönliche Seite #7380899
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.

OP #7381034
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.

OP #7381176
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.

Beitrag #7381872 wurde von einem Moderator gelöscht.
Moderator (Firma: Titel) Persönliche Seite #7381886
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?

OP #7382037
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
OP #7383362
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren