NEWS
Zwei Relais an einem ESP-01 schalten -> komischer Effekt
-
Hallo zusammen,
ich bin ganz neu im Thema ioBroker und ESP8266.
Habe mir eine kleine Platine gebaut mit ESP-01 und zwei Relais. Dafür habe ich GPIO 0 und 2 verwendet.
Nun habe ich einen Skript im Internet gefunden (welcher aber nur für 1 Relais gedacht war) und nach bestem Wissen angepasst. Sowieso habe ich nicht ein einziges Programm gefunden, in dem mehrere Relais über MQTT an einem einzigen ESP-01 verwendet wurde…
Wie dem auch sei....
Nun habe ich testweise zwei Schalter im vis.adapter angelegt und konfiguriert (Bilder im Anhang). Egal welche Art von Schalter ich nehme, ich habe immer das Phänomen, dass Relais 1 immer toll funktioniert, aber bei Relais 2 komische Dinge passieren (siehe Video, da es echt schwierig zu beschreiben ist).
Wenn ich im admin Bereich von ioBroker unter Objekte die Werte manuell eingebe (0 oder 1 für relais 1 - und - 3 oder 4 für relais 2 funktioniert immer alles korrekt)
Weiß jetzt nicht mehr genau wo ich ansetzen soll, da ich schon einige Stunden verbracht habe und nun mal um Hilfe bitten möchte
Beim Video einfach links auf die LEDs achten. Und im vis.Fenster sieht man schön, dass der Schaltzustand nicht mit der Realität übereinstimmt.
Anbei noch der Code (wie gesagt, gefunden und besten Wissens überarbeitet bzw. Dinge auskommentiert)
`/* It connects to an MQTT server then: - on 0 switches off relay - on 1 switches on relay - on 2 switches the state of the relay - sends 0 on off relay - sends 1 on on relay It will reconnect to the server if the connection is lost using a blocking reconnect function. See the 'mqtt_reconnect_nonblocking' example for how to achieve the same result without blocking the main loop. The current state is stored in EEPROM and restored on bootup */ #include <esp8266wifi.h>#include <pubsubclient.h>#include <bounce2.h>#include <eeprom.h>const char* ssid = "..."; const char* password = "..."; const char* mqtt_server = "..."; WiFiClient espClient; PubSubClient client(espClient); long lastMsg = 0; char msg[50]; int value = 0; const char* clientID = "ESP 5"; const char* outTopic = "ESPout5"; const char* inTopic = "ESPin5"; int relay_pin1 = 2; int relay_pin2 = 0; // int button_pin1 = 1; // int button_pin2 = 3; bool relayState1 = LOW; bool relayState2 = LOW; // Instantiate a Bounce object : Bounce debouncer = Bounce(); void setup_wifi() { delay(10); // We start by connecting to a WiFi network Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { // extButton(); for(int i = 0; i<500; i++){ // extButton(); delay(1); } Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); } void callback(char* topic, byte* payload, unsigned int length) { Serial.print("Message arrived ["); Serial.print(topic); Serial.print("] "); for (int i = 0; i < length; i++) { Serial.print((char)payload[i]); } Serial.println(); // Switch on the LED if an 1 was received as first character if ((char)payload[0] == '0') { digitalWrite(relay_pin1, LOW); // Turn the LED on (Note that LOW is the voltage level Serial.println("relay_pin1 -> LOW"); relayState1 = LOW; EEPROM.write(0, relayState1); // Write state to EEPROM EEPROM.commit(); } else if ((char)payload[0] == '1') { digitalWrite(relay_pin1, HIGH); // Turn the LED off by making the voltage HIGH Serial.println("relay_pin1 -> HIGH"); relayState1 = HIGH; EEPROM.write(0, relayState1); // Write state to EEPROM EEPROM.commit(); } else if ((char)payload[0] == '2') { relayState1 = !relayState1; digitalWrite(relay_pin1, relayState1); // Turn the LED off by making the voltage HIGH Serial.print("relay_pin1 -> switched to "); Serial.println(relayState1); EEPROM.write(0, relayState1); // Write state to EEPROM EEPROM.commit(); } else if ((char)payload[0] == '3') { digitalWrite(relay_pin2, LOW); // Turn the LED on (Note that LOW is the voltage level Serial.println("relay_pin2 -> LOW"); relayState2 = LOW; EEPROM.write(0, relayState2); // Write state to EEPROM EEPROM.commit(); } else if ((char)payload[0] == '4') { digitalWrite(relay_pin2, HIGH); // Turn the LED off by making the voltage HIGH Serial.println("relay_pin2 -> HIGH"); relayState2 = HIGH; EEPROM.write(0, relayState2); // Write state to EEPROM EEPROM.commit(); } else if ((char)payload[0] == '5') { relayState2 = !relayState2; digitalWrite(relay_pin2, relayState2); // Turn the LED off by making the voltage HIGH Serial.print("relay_pin2 -> switched to "); Serial.println(relayState2); EEPROM.write(0, relayState2); // Write state to EEPROM EEPROM.commit(); } } void reconnect() { // Loop until we're reconnected while (!client.connected()) { Serial.print("Attempting MQTT connection..."); // Attempt to connect if (client.connect(clientID)) { Serial.println("connected"); // Once connected, publish an announcement... client.publish(outTopic, "ESP booted"); // ... and resubscribe client.subscribe(inTopic); } else { Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); // Wait 5 seconds before retrying for(int i = 0; i<5000; i++){ // extButton(); delay(1); } } } } /* void extButton() { debouncer.update(); // Call code if Bounce fell (transition from HIGH to LOW) : if ( debouncer.fell() ) { Serial.println("Debouncer fell"); // Toggle relay state : relayState1 = !relayState1; digitalWrite(relay_pin1,relayState1); EEPROM.write(0, relayState1); // Write state to EEPROM if (relayState1 == 1){ client.publish(outTopic1, "1"); } else if (relayState1 == 0){ client.publish(outTopic1, "0"); } } } */ void setup() { EEPROM.begin(512); // Begin eeprom to store on/off state pinMode(relay_pin1, OUTPUT); // Initialize the relay pin as an output // pinMode(button_pin1, INPUT); // Initialize the relay pin as an output pinMode(relay_pin2, OUTPUT); // Initialize the relay pin as an output // pinMode(button_pin2, INPUT); // Initialize the relay pin as an output // pinMode(LED_BUILTIN, OUTPUT); relayState1 = EEPROM.read(0); digitalWrite(relay_pin1,relayState1); relayState2 = EEPROM.read(0); digitalWrite(relay_pin2,relayState2); // debouncer.attach(button_pin1); // Use the bounce2 library to debounce the built in button debouncer.interval(50); // Input must be low for 50 ms Serial.begin(115200); setup_wifi(); // Connect to wifi client.setServer(mqtt_server, 1883); client.setCallback(callback); } void loop() { if (!client.connected()) { reconnect(); } client.loop(); // extButton(); }</eeprom.h></bounce2.h></pubsubclient.h></esp8266wifi.h>` [6995_bildschirmfoto_2018-04-23_um_23.12.19.png](/assets/uploads/files/6995_bildschirmfoto_2018-04-23_um_23.12.19.png) [6995_bildschirmfoto_2018-04-23_um_23.12.28.png](/assets/uploads/files/6995_bildschirmfoto_2018-04-23_um_23.12.28.png) [/i]
-
Leider konnte mir offenkundig niemand helfen…
hab jetzt selber am Skript lange "rumgespielt", bis es schlussendlich lief. Hab jetzt mehrere ESP damit laufen. Man muss lediglich die client ID und die Topic Namen anpassen für jedes ESP.
Mit 0 und 1 schaltet man dann GPIO 2 und mit 2 und 3 schaltet man GPIO 0. Am Besten hat es bei mir mit den hqwidgets funktioniert.
Für, die es evtl. brauchen:
`#include <esp8266wifi.h>#include <pubsubclient.h>#include <bounce2.h>#include <eeprom.h>const char* ssid = "YOUR_SSID"; const char* password = "YOUR_SUPER_SAFETY_PASSWORD"; const char* mqtt_server = "IP ADDRESS_MQTT BROKER"; WiFiClient espClient; PubSubClient client(espClient); long lastMsg = 0; char msg[50]; int value = 0; const char* clientID = "ESP 1"; const char* outTopic = "ESPout1"; const char* inTopic1 = "ESPin1.1"; const char* inTopic2 = "ESPin1.2"; int relay_pin1 = 2; int relay_pin2 = 0; // int button_pin1 = 1; // int button_pin2 = 3; bool relayState1 = LOW; bool relayState2 = LOW; // Instantiate a Bounce object : Bounce debouncer = Bounce(); void setup_wifi() { delay(10); // We start by connecting to a WiFi network Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { // extButton(); for(int i = 0; i<500; i++){ // extButton(); delay(1); } Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); } void callback(char* topic, byte* payload, unsigned int length) { Serial.print("Message arrived ["); Serial.print(topic); Serial.print("] "); for (int i = 0; i < length; i++) { Serial.print((char)payload[i]); } Serial.println(); if ((char)payload[0] == '0') { digitalWrite(relay_pin1, LOW); Serial.println("relay_pin1 -> LOW"); relayState1 = LOW; EEPROM.write(0, relayState1); EEPROM.commit(); } else if ((char)payload[0] == '1') { digitalWrite(relay_pin1, HIGH); Serial.println("relay_pin1 -> HIGH"); relayState1 = HIGH; EEPROM.write(0, relayState1); EEPROM.commit(); } else if ((char)payload[0] == '2') { digitalWrite(relay_pin2, LOW); Serial.println("relay_pin2 -> LOW"); relayState2 = LOW; EEPROM.write(1, relayState2); EEPROM.commit(); } else if ((char)payload[0] == '3') { digitalWrite(relay_pin2, HIGH); Serial.println("relay_pin2 -> HIGH"); relayState2 = HIGH; EEPROM.write(1, relayState2); EEPROM.commit(); } } void reconnect() { // Loop until we're reconnected while (!client.connected()) { Serial.print("Attempting MQTT connection..."); // Attempt to connect if (client.connect(clientID)) { Serial.println("connected"); // Once connected, publish an announcement... client.publish(outTopic, "ESP booted"); // client.publish(outTopic2, "ESP booted"); // ... and resubscribe client.subscribe(inTopic1); client.subscribe(inTopic2); } else { Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); // Wait 5 seconds before retrying for(int i = 0; i<5000; i++){ // extButton(); delay(1); } } } } /* void extButton() { debouncer.update(); // Call code if Bounce fell (transition from HIGH to LOW) : if ( debouncer.fell() ) { Serial.println("Debouncer fell"); // Toggle relay state : relayState1 = !relayState1; digitalWrite(relay_pin1,relayState1); EEPROM.write(0, relayState1); if (relayState1 == 1){ client.publish(outTopic1, "1"); } else if (relayState1 == 0){ client.publish(outTopic1, "0"); } } } */ void setup() { EEPROM.begin(512); // Begin eeprom to store on/off state pinMode(relay_pin1, OUTPUT); // Initialize the relay pin as an output // pinMode(button_pin1, INPUT); // Initialize the relay pin as an output pinMode(relay_pin2, OUTPUT); // Initialize the relay pin as an output // pinMode(button_pin2, INPUT); // Initialize the relay pin as an output relayState1 = EEPROM.read(0); digitalWrite(relay_pin1,relayState1); relayState2 = EEPROM.read(1); digitalWrite(relay_pin2,relayState2); // debouncer.attach(button_pin1); // Use the bounce2 library to debounce the built in button debouncer.interval(50); // Input must be low for 50 ms Serial.begin(115200); setup_wifi(); // Connect to wifi client.setServer(mqtt_server, 1883); client.setCallback(callback); } void loop() { if (!client.connected()) { reconnect(); } client.loop(); // extButton(); }</eeprom.h></bounce2.h></pubsubclient.h></esp8266wifi.h>` [/i]
-
Wenn ich deinen Hinweis richtig verstehe, hast du wohl am Anfang nicht die Hinweise bei Verwendung von mehreren Wemos beachtet.
Irgendwo hatte ich gelesen, und das auch so gemacht, dass eben jeder Wemos einen eindeutigen Namen bekommen muss! Ich hatte das bei der Ersteinrichtung der Wemos direkt im UI des Wemos gemacht.
Wenn du mit Topics dann die Objektnamen meinst (ich kann die ganzen Begriffe nicht immer richtig zuordnen! ), die dürfen durchaus gleich sein. Denn die Wemos bekommen, so jedenfalls bei mir, im Objektbaum genau diesen, bei der Einrichtung eingestellten Namen (der ja deshalb eindeutig sein muss!) und darunter können die Datenpunkte gleich heißen!
Enrico