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
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?
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.
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?
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.
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.
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.
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.
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