Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Visualisierung
  4. Zwei Relais an einem ESP-01 schalten -> komischer Effekt

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    17
    1
    3.6k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    1.2k

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.5k

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

Geplant Angeheftet Gesperrt Verschoben Visualisierung
3 Beiträge 2 Kommentatoren 1.0k Aufrufe
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • C Offline
    C Offline
    cruunnerr
    schrieb am zuletzt editiert von
    #1

    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 Antwort Letzte Antwort
    0
    • C Offline
      C Offline
      cruunnerr
      schrieb am zuletzt editiert von
      #2

      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 Antwort Letzte Antwort
      0
      • R Offline
        R Offline
        RappiRN
        Most Active
        schrieb am zuletzt editiert von
        #3

        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 Antwort Letzte Antwort
        0
        Antworten
        • In einem neuen Thema antworten
        Anmelden zum Antworten
        • Älteste zuerst
        • Neuste zuerst
        • Meiste Stimmen


        Support us

        ioBroker
        Community Adapters
        Donate

        769

        Online

        32.7k

        Benutzer

        82.4k

        Themen

        1.3m

        Beiträge
        Community
        Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
        ioBroker Community 2014-2025
        logo
        • Anmelden

        • Du hast noch kein Konto? Registrieren

        • Anmelden oder registrieren, um zu suchen
        • Erster Beitrag
          Letzter Beitrag
        0
        • Home
        • Aktuell
        • Tags
        • Ungelesen 0
        • Kategorien
        • Unreplied
        • Beliebt
        • GitHub
        • Docu
        • Hilfe