Fehler: digitaler Eingang wird nicht korrekt erfasst

Hallo,

ich versuche inzwischen verzweifelt, mein Projekt zum laufen zu bringen und finde den Fehler nicht.

Ich möchte über einen Wemos D1 mini und ein 2-Kanal-Relais-Modul 2 Leuchten schalten. Die Leuchten sollen über WLAN (Amazon Echo) und über die vorhandenen Wandschalter gesteuert werden. Dazu habe ich die Schalter an 3V3 angeschlossen, die andere Seite an D5 bzw. D6 (mit Pulldown 10K). Wenn jetzt der Schalter den Zustand (an oder aus) ändert, erfaßt das der Eingang D5/D6 und schaltet den Ausgang D2 oder D3 passend.

Funktioniert soweit wunderbar. Solange der Wemos über USB vom PC versorgt wird. Sobald ich ein 5V-Netzteil verwende, erkennen die Eingänge D5 und D6 zwar zuverlässig den Zustand "an" (3,3V), bei "aus" schalten sie wild hin und her, wie ein Blinker.

Ein tauschen der Pull-Down-Widerstände gegen 1 kOhm ändert nichts.
Es ist auch egal, ob das Netzteil (5V, 1A) am 5V-Pin oder an USB hängt.
Wieder am USB vom PC funktioniert alles prima!

Woran kann das liegen???

 #include <ESP8266WiFi.h>
 #include <WiFiClient.h>
 #include <ESP8266WebServer.h>

 #define SchalterA D5
 #define SchalterB D6
 #define LichtA D2
 #define LichtB D3

 int SchalterMemoryA = 0;
 int SchalterMemoryB = 0;
 int SchalterAktuellA = 0;
 int SchalterAktuellB = 0;
 int ZustandA = 0;
 int ZustandB = 0;

 const char* ssid     = " xxx ";
 const char* password = " xxx ";
 const char* HomematicIP = " xxx ";
 const int httpPort = 80;                      // Port der Homematic

 String webString="";     // String zum anzeigen

 ESP8266WebServer server(80);
 unsigned long timeout = 0;                 // timeout beim warten auf Homematic



void setup() {

      Serial.begin(115200);
      Serial.println(F("Starte Programm"));

      pinMode(SchalterA,INPUT);
      pinMode(SchalterB,INPUT);
      pinMode(LichtA,OUTPUT);
      pinMode(LichtB,OUTPUT);

      
                                                       // Verbindung mit WLAN
      WiFi.begin(ssid, password);
      Serial.print("\n\r \n\rVerbindung wird hergestellt");
     
      // Warte auf Verbindung
      while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
      }

      Serial.println("");
      Serial.println("SchalterKueche Server");
      Serial.print("Verbunden mit ");
      Serial.println(ssid);
      Serial.print("IP Adresse: ");
      Serial.println(WiFi.localIP());
       

      server.on("/", SchleifeServerRoot);

      server.on("/0", [](){
        ZustandA = 0;
        digitalWrite(LichtA,ZustandA);
        webString="Deckenlampe ausgeschaltet";
        server.send(200, "text/plain", webString);
        Serial.println("HTTP-Anfrage 0");
        delay(100);
      });

      server.on("/1", [](){
        ZustandA = 1;
        digitalWrite(LichtA,ZustandA);
        webString="Deckenlampe eingeschaltet";
        server.send(200, "text/plain", webString);
        Serial.println("HTTP-Anfrage 1");
        delay(100);
      });

      server.on("/2", [](){
        ZustandB = 0;
        digitalWrite(LichtB,ZustandB);
        webString="Arbeitsplattenbeleuchtung ausgeschaltet";
        server.send(200, "text/plain", webString);
        Serial.println("HTTP-Anfrage 2");
        delay(100);
      });

      server.on("/3", [](){
        ZustandB = 1;
        digitalWrite(LichtB,ZustandB);
        webString="Arbeitsplattenbeleuchtung eingeschaltet";
        server.send(200, "text/plain", webString);
        Serial.println("HTTP-Anfrage 3");
        delay(100);
      });

      server.begin();
      Serial.println("HTTP Server gestartet");

      SchalterMemoryA = digitalRead(SchalterA);
      SchalterMemoryB = digitalRead(SchalterB);
}



void loop() {
     server.handleClient();
     WiFiClient client;    

     SchalterAktuellA = digitalRead(SchalterA);
     SchalterAktuellB = digitalRead(SchalterB);

     if (SchalterMemoryA != SchalterAktuellA) {
         SchalterMemoryA = SchalterAktuellA;
         if (ZustandA == 0) {
             ZustandA = 1;
              digitalWrite(LichtA,ZustandA);
              Serial.println("Schalter Decke geschaltet!  neuer Zustand 1");
              delay(500);
           
   
           }
           else {  ZustandA = 0;
                   digitalWrite(LichtA,ZustandA);
                   Serial.println("Schalter Decke geschaltet!  neuer Zustand 0");
                   delay(500);
           

           }
        }

  if (SchalterMemoryB != SchalterAktuellB) {
          SchalterMemoryB = SchalterAktuellB;
          if (ZustandB == 0) {
              ZustandB = 1;
              digitalWrite(LichtB,ZustandB);
              Serial.println("Schalter Arbeitsplatte geschaltet!  neuer Zustand 1");
              delay(500);
           
  
           }
           else {  ZustandB = 0;
                   digitalWrite(LichtB,ZustandB);
                   Serial.println("Schalter Arbeitsplatte geschaltet!  neuer Zustand 0");
                   delay(500);
           
  
            
           }
        }

        
  }

  void SchleifeServerRoot() {

      webString="Hallo vom Kuechenschalter!           Gib ein:                                                                                                                                                                                                                          /0  schaltet Deckenlampe aus                                                                                                                                                                                                                              /1  schaltet Deckenlampe ein                                                                                                                                                                                                                              /2  schaltet Arbeitsplattenbeleuchtung aus                                                                                                                                                                                                               /3  schaltet Arbeitsplattenbeleuchtung ein";
      server.send(200, "text/plain", webString);
      delay(100);
}

Super vorbildlich, alles dabei.
Im Schaltbild kann ich keinen Fehler erkennen, vermute allerdings einen fehlenden GND.
Wo der Fehler genau sitzt ist schwer zu sagen.

Ist dein Relais-Modul auch für 3,3 Volt geeignet ?
Meist sind die nur für 5Volt.

2 Ideen:

  1. Das Netzteil liefert eine so störungsverseuchte Spannung das der Arduino spinnt. -> Anderes Netzteil testen

  2. Dein ganzer Aufbau wirkt wie eine schöne große Antenne die sich die ganzen Störungen einfängt und dadurch das ganze auslöst.

Wie lang sind Deine Kabel zu den Schaltern? Abgeschirmte Kabel?
Was passiert wenn das Netzteil angeschlossen ist und Du machst eine Verbindung vom Arduino GND zu einer freien/blanke Stelle an Deinem Computergehäuse?

Gruß, Jürgen

Katsumi_S:
2. Dein ganzer Aufbau wirkt wie eine schöne große Antenne die sich die ganzen Störungen einfängt und dadurch das ganze auslöst.

Das würde ich bei einem 1k bzw. 10k Pullup-Widerstand ausschließen.
Ausgenommen es ist ein mehrere Meter langer Draht dran.

Danke für eure schnellen Antworten!

Zwischenzeitlich habe ich den Leitungen vom Wemos zum Relais auch noch einen 10k-Pulldown gegönnt, leider ohne Erfolg.

Die Kabel sind alle so ca. 20 cm lang und nicht geschirmt. Nachdem ich mit der Backofentür "geerdet" habe, tritt der Fehler tatsächlich nicht mehr auf!!! Dummerweise ist unter meinem Schalter (späterer Einbauort) keine Erdung verfügbar.

Der Nachschub an Netzteilen und einem 3,3V-Relais ist noch auf dem Weg aus China. Daher habe ich in der Tat ein 5V-Relais benutzt. Und mich eigentlich gefreut, dass es tatsächlich schon bei 3,3V schaltet. Könnte das der Fehler sein?

Und während des Schreibens habe ich noch eine Variante ausprobiert: 3 oder 4 Batterien(1,2V) am 5V-Pin. Das funktioniert auch! Also tippe ich jetzt einfach mal auf eine störungsverseuchte Spannung vom Netzteil. Muss ich vielleicht doch mehr als 2,50 Euro investieren.