NEWS
Rotary encoder
-
Original post
So hat das angefangen:Tja, da kommt der Elektroniker wieder durch... Bin zwar schon Jahre aus der Materie draussen, habe aber mit iobroker/ Tasmota ESP8266 wieder angefangen. Nun das nächste Projekt. Steuerung meiner zwei LED- Stripes (weiss) am Schreibtisch. Bis jetzt gesteuert über NE555 mit Poti. 2x Taster (Steuerung von 2 NOUS A1T für Server und PC per MQTT) Die Idee war jetzt folgende Konfiguration: 1x Wemos D1 2x 2N2222 für die LED's 2x Rotary Encoder für Helligkeit und On/Off 2x Taster ein paar Widerstände, Spannungsregler, Schraubklemmen. Gehäuse 100x60x25 von Amazon Klick Entsprechende Blockly- Scripte und fertig... Das ganze in dem Gehäuse zwischen meiner Tastaturschublade und meinem Lötarbeitsplatz. Der Elektroniker kriegt den ganzen Lötkram natürlich hin, aber funktioniert das auch? Ich könnte auch entsprechende Schaltpläne aus EAGLE bereit stellen... und jetzt???
-
Ob du das mit tasmota auf einem! Wemos hinkriegst ? Ich bin nicht sicher. Müsste eine Kombination sein aus dem oben angesprochenen tasmota/rotaryEncoder und https://tasmota.github.io/docs/Lights/#switched-lights-aka-relays.
Ich nehme an programmieren / Arduino ist nicht so dein Ding. Sollte dir niemand hier weiterhelfen können, würde ich dir anbieten dir (mit Wartezeit) eine Software für den Wemos zu schreiben. Aber die Lösung mit dem NE555 finde, da ich aus der 'Bastlergeneration' stamme, eigentlich sehr charmant. -
Muss man den Rotary Encoder eigentlich zwingend mit Tasmota erledigen, oder könnte man die i/o Signale des Encoders nicht an iobroker durchreichen lassen, wo dann die Drehrichtungserkennung und das Zählen der Pulse erfolgt? Platzproblemen im Programmspeicher des ESP könnte man aber auch ausweichen, indem man statt eines ESP8266 einen ESP32 mit ordentlich Speicher anschafft
-
Ok.
Das bedeutet das der esp8266 wohl zu träge ist, die signale vom encoder zeitrelevant zu verarbeiten (schnell genug).
Verstanden...
Man müsste den encoder also per ttl verarbeiten und den aktuellen Wert an den esp durchreichen...
Mit setzen des startwertes bei stromausfall und Begrenzung.
Oder braucht das dann drei Pins an einem 8086 mit entsprechendem Programm?
Bis jetzt löse ich das über 3 Taster mit Script...
2 für up/down einer für on/off
Wäre mit dem encoder eleganter/ hübscher...Ich glaube ich beerdige das Projekt encoder erst mal...
-
Also Google spuckt eine Anleitung nebst Code für folgende Suchanfrage aus:
tasmota script für rotary encoder, variable hoch/runterzählen und per mqtt sendenDann noch eine Erweiterung hinterher und das Grundgerüst steht:
Erst senden, wenn der rotary encoder 500 ms nicht bewegt wurdeVerwunden Sie Tasmota-Schalter (Switch) für die Impulse des Drehgebers und das Tasmota Scripting im Bereich Consoles -> Edit Script, um eine Variable beim Drehen zu verändern und per MQTT zu senden.1. GPIO-Konfiguration (Web-Oberfläche)Stellen Sie sicher, dass die Pins des Rotary Encoders (CLK und DT) als Schalter konfiguriert sind:Switch1 (Pin für CLK, z. B. GPIO12)Switch2 (Pin für DT, z. B. GPIO13)(Optional) Switch3 (Taster des Encoders, z. B. GPIO14)Setzen Sie in der Tasmota-Konsole folgende Befehle, um das Schalterverhalten zu entkoppeln:textSetOption98 1 Verwende Code mit Vorsicht.2. Tasmota Script CodeFügen Sie diesen Code in den Editor für das Skript ein:text>D v=0 old_v=0 step=1 min_v=0 max_v=100 >B v=50 >S ; Auslesen der Switches (angenommen Switch1 = Pin A, Switch2 = Pin B) ; Wenn sich Switch1 ändert, wird die Richtung anhand von Switch2 ermittelt #sw1=sw[1] #sw2=sw[2] if chg(sw1)>0 then if sw2==1 then v += step else v -= step endif if v > max_v then v = max_v endif if v < min_v then v = min_v endif endif ; Wenn sich der Wert geändert hat, per MQTT senden if v != old_v then old_v = v mqttc [tele/rotary/RESULT] {"Count":%v%} endif >J ,"Rotary": {"Count": %v%} Verwende Code mit Vorsicht.3. Erklärung der Sektionen>D: Deklaration der Variablen (v für den Zähler, step für die Schrittweite, min_v/max_v als Limits).>B: Initialisierung (Startwert des Zählers beim Booten auf 50 gesetzt).>S: Die Hauptschleife prüft Flankenwechsel an Switch1 (sw[1]) und bestimmt über den Zustand von Switch2 die Richtung. Bei einer Änderung wird die Variable innerhalb der Grenzen angepasst und via mqttc direkt gesendet.>J: Optional – fügt den aktuellen Zählerstand in die regulären JSON-Telemetriedaten (SENSOR) von Tasmota ein.Soll der Drehgeber unendlich zählen (ohne min_v/max_v) oder möchten Sie den internen Taster nutzen, um den Zähler auf 0 zurückzusetzen?KI-Antworten können Fehler enthalten Erst senden, wenn der rotary encoder 500 ms nicht bewegt wurdeUm das Senden zu verzögern, nutzen wir einen Timer. Bei jeder Bewegung des Drehgebers wird der Timer auf 500 Millisekunden zurückgesetzt. Erst wenn der Timer abläuft (keine Bewegung mehr), wird die MQTT-Nachricht gesendet.Aktualisierter Tasmota-Skript-CodeErsetzen Sie Ihr bisheriges Skript durch diese Version:text>D v=0 old_v=0 step=1 min_v=0 max_v=100 ; Timer-Variable (0 bedeutet Timer läuft nicht) t_send=0 >B v=50 >S #sw1=sw #sw2=sw ; Bewegung erkennen und Wert anpassen if chg(sw1)>0 then if sw2==1 then v += step else v -= step endif if v > max_v then v = max_v endif if v < min_v then v = min_v endif ; Wenn sich der Wert geändert hat, Timer auf 500 ms setzen (5 * 100 ms) if v != old_v then t_send = 5 endif endif ; Der Tasmota-Sekundentakt (>S) läuft ca. alle 100ms ; Timer herunterzählen, wenn er aktiv ist if t_send > 0 then t_send -= 1 ; Wenn der Timer genau jetzt abläuft (0 erreicht) if t_send == 0 then old_v = v mqttc [tele/rotary/RESULT] {"Count":%v%} endif endif >J ,"Rotary": {"Count": %v%} Verwende Code mit Vorsicht.Funktionsweise der Verzögerungt_send = 5: Die Sektion >S wird in Tasmota-Skripten standardmäßig alle 100 Millisekunden ausgeführt. Ein Wert von 5 entspricht daher genau einer Verzögerung von 500 ms.Dauer-Drehen: Wenn Sie den Encoder schnell drehen, wird t_send bei jedem Rastpunkt sofort wieder auf 5 gesetzt. Der Timer erreicht die 0 erst, wenn Sie 500 ms lang aufgehört haben zu drehen.MQTT-Schonung: Es wird pro Dreh-Vorgang nur noch ein einziges JSON-Paket über Ihr Netzwerk gesendet.Möchten Sie die Verzögerungszeit flexibel anpassen oder soll der aktuelle Wert während des Drehens zumindest auf einem angeschlossenen Display sofort sichtbar sein? -
So, jetzt...
Einrichtung über:Tasmota Englisch über Tasmotizer tasmota.bin von Github, Timestamp 20260622 16:26 WLAN einrichten (ohne MQTT!!!) Module type Generic (18) d1 Rotary B, d2 Rotary A, d5 Button Backlog SetOption43 1; SetOption98 1 Rule1 ON Rotary1#Pos1==1 DO ADD1 1 1 ENDON ON Rotary1#Pos1==0 DO SUB1 1 1 ENDON ON Var1#State DO Publish stat/%topic%/ROTARY {"value":%value%} ENDON Rule1 1Funktioniert erst mal ..
00:00:00.001 HDW: ESP8266EX 00:00:00.027 UFS: FlashFS mounted with 1984 kB free 00:00:00.093 CFG: Loaded from File, Count 37 00:00:00.098 FRC: Some settings have been reset (3) 00:00:00.109 Project tasmota - Desd Version 15.5.0(release-tasmota-4M)-2.7.8(2026-06-22T13:58:09) 00:00:01.001 WIF: Connecting to AP1 FRITZ!Box JP 2,4 Channel 11 BSSId 38:10:D5:43:BD:5E (LastUsed) in mode 11n as Desd... 00:00:02.515 WIF: Connected 00:00:02.767 HTP: Web server active on Desd with IP address 192.168.2.243 10:21:44.030 MQT: Attempting connection... 10:21:44.048 MQT: Connected 10:21:44.051 MQT: tele/Encoder/LWT = Online (retained) 10:21:44.053 MQT: cmnd/Encoder/POWER = 10:21:44.059 MQT: tele/Encoder/INFO1 = {"Info1":{"Module":"Generic","Version":"15.5.0(release-tasmota-4M)","FallbackTopic":"cmnd/Encoder_fb/","GroupTopic":"cmnd/tasmotas/"}} 10:21:44.073 MQT: tele/Encoder/INFO2 = {"Info2":{"WebServerMode":"Admin","Hostname":"Desd","IPAddress":"192.168.2.243"}} 10:21:44.082 MQT: tele/Encoder/INFO3 = {"Info3":{"RestartReason":"External System","BootCount":11}} 10:21:46.278 QPC: Reset 10:21:48.232 MQT: tele/Encoder/STATE = {"Time":"2026-08-09T10:21:48","Uptime":"0T00:00:10","UptimeSec":10,"Heap":23,"SleepMode":"Dynamic","Sleep":50,"LoadAvg":19,"MqttCount":1,"Wifi":{"AP":1,"SSId":"FRITZ!Box JP 2,4","BSSId":"38:10:D5:43:BD:5E","Channel":11,"Mode":"11n","RSSI":86,"Signal":-57,"LinkCount":1,"Downtime":"0T00:00:04"},"Hostname":"Desd","IPAddress":"192.168.2.243"} 10:21:58.186 RUL: ROTARY1#POS1==1 performs 'ADD1 1 1' 10:21:58.192 MQT: stat/Encoder/RESULT = {"Add1":"1.000"} 10:21:58.216 RUL: VAR1#STATE performs 'Publish stat/Encoder/ROTARY {"value":1.000}' 10:21:58.222 MQT: stat/Encoder/ROTARY = {"value":1.000} 10:21:59.404 RUL: ROTARY1#POS1==1 performs 'ADD1 1 1' 10:21:59.411 MQT: stat/Encoder/RESULT = {"Add1":"2.000"} 10:21:59.435 RUL: VAR1#STATE performs 'Publish stat/Encoder/ROTARY {"value":2.000}' 10:21:59.440 MQT: stat/Encoder/ROTARY = {"value":2.000} 10:22:03.228 RUL: ROTARY1#POS1==0 performs 'SUB1 1 1' 10:22:03.235 MQT: stat/Encoder/RESULT = {"Sub1":"1.000"} 10:22:03.258 RUL: VAR1#STATE performs 'Publish stat/Encoder/ROTARY {"value":1.000}' 10:22:03.263 MQT: stat/Encoder/ROTARY = {"value":1.000} 10:22:03.784 RUL: ROTARY1#POS1==0 performs 'SUB1 1 1' 10:22:03.791 MQT: stat/Encoder/RESULT = {"Sub1":"0.000"} 10:22:03.812 RUL: VAR1#STATE performs 'Publish stat/Encoder/ROTARY {"value":0.000}' 10:22:03.818 MQT: stat/Encoder/ROTARY = {"value":0.000} 10:22:06.967 MQT: stat/Encoder/RESULT = {"POWER":"ON"} 10:22:06.970 MQT: stat/Encoder/POWER = ON 10:22:08.991 MQT: stat/Encoder/RESULT = {"POWER":"OFF"} 10:22:08.996 MQT: stat/Encoder/POWER = OFF... aber ich bekomme nur POWER im Objektbaum unter iobroker angezeigt.
Es wird kein Punkt ROTARY oder value angelegt.
Wo liegt da der Fehler? Wahrscheinlich im Publish Statement.
Da brauche ich mal Hilfe.
Danke
Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.
Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.
Mit deinem Input könnte dieser Beitrag noch besser werden 💗
Registrieren Anmelden