Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Visualisierung
    4. Zwei Relais an einem ESP-01 schalten -> komischer Effekt

    NEWS

    • Neues Video "KI im Smart Home" - ioBroker plus n8n

    • Neues Video über Aliase, virtuelle Geräte und Kategorien

    • Wir empfehlen: Node.js 22.x

    Zwei Relais an einem ESP-01 schalten -> komischer Effekt

    This topic has been deleted. Only users with topic management privileges can see it.
    • C
      cruunnerr last edited by

      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.

      https://youtu.be/5TCloHcvLM8

      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]
      
      1 Reply Last reply Reply Quote 0
      • C
        cruunnerr last edited by

        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]
        
        1 Reply Last reply Reply Quote 0
        • R
          RappiRN Most Active last edited by

          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

          1 Reply Last reply Reply Quote 0
          • First post
            Last post

          Support us

          ioBroker
          Community Adapters
          Donate

          558
          Online

          32.1k
          Users

          80.7k
          Topics

          1.3m
          Posts

          2
          3
          979
          Loading More Posts
          • Oldest to Newest
          • Newest to Oldest
          • Most Votes
          Reply
          • Reply as topic
          Log in to reply
          Community
          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
          The ioBroker Community 2014-2023
          logo