Wemos D1 / Endtaster

Hallo,
ich verwende am eine Wemos D1, an dem hab ich auf D8 und D9 einen Endtaster/Endschalter angeschlossen.
Die ganzen Programmbefehle laufen über MQTT. Wenn allerdings nach einem Neustart des Wemos ein Endtaster gedrückt ist verbindet sich dieser nicht mit dem WLAN bzw,. MQTT. (die Endschalter schalten auf GND)
Hat jemand eine Idee was da sein kann?

Wenn Du uns noch mitteilst an welchen Pins die Endschalter sind und Deinen Sketch zeigst, hättest Du eine Chance.

Gruß Tommy

r_robert:
Wemos D1,

D8 und D9 einen Endtaster/Endschalter angeschlossen.

(die Endschalter schalten auf GND)

Bist Du Dir sicher, das die nach GND schalten?
Für mich hört sich das an, das D8 HIGH ist.

#include <Bounce2.h>
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>
#include <DHT.h>
#define DHTPIN D13
DHT dht (DHTPIN, DHT22);

void callback(char* topic, byte* payload, unsigned int length);

const char* ssid = "";
const char* password = "";
const char* MQTT_BROKER = "10.0.0.170";
WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg[50];
int value = 0;

const byte pinendtasteroben  = D8;
const byte pinendtasterunten = D9;

int pinmotorhoch   = D2;           //const byte pinmotorhoch = 6;
int pinmotorrunter = D3;           //const byte pinmotorrunter = 7
int pinlicht       = D4;
int tasterAuf      = D5;
int tasterZu       = D6;
int Status = 0;

const bool _pushed = LOW;  //Pegel bei gedrückten Taster
const bool _AN = HIGH;     //Pegel für aktives Relais
const bool _AUS = !_AN;
bool automatisch = true;
bool auf = false;
bool zu = false;
bool mqttauf = false;
bool mqttzu = false;

Bounce  myButtonauf  = Bounce();
Bounce  myButtonzu   = Bounce();

//uint32_t previousMillisauf ;
//uint32_t previousMilliszu ;
//unsigned long currentMillis = millis();

void setup() 
{ 
  Serial.begin(115200);
  dht.begin();
  setup_wifi();

  client.setServer(MQTT_BROKER, 1883);
  client.setCallback(callback);
  
  pinMode(pinmotorhoch, OUTPUT);
  pinMode(pinmotorrunter, OUTPUT);
  pinMode(pinlicht, OUTPUT);
  pinMode(tasterAuf, INPUT_PULLUP);
  pinMode(tasterZu, INPUT_PULLUP);
  //pinMode(tasterAuto, INPUT_PULLUP);
  pinMode(pinendtasteroben, INPUT_PULLUP);
  pinMode(pinendtasterunten, INPUT_PULLUP);
  myButtonauf.attach(tasterAuf);
  myButtonauf.interval(5); // 5ms zum Entprellen
  myButtonzu.attach(tasterZu);
  myButtonzu.interval(5); // 5ms zum Entprellen

  if (!_pushed) {                 //Taster schalten gegen GND
    pinMode(pinendtasteroben, INPUT_PULLUP);
    pinMode(pinendtasterunten, INPUT_PULLUP);
  }

   ArduinoOTA.setHostname("Hühnerstall");    //Hostnamezuordnung

  ArduinoOTA.onStart([]() {
    String type;
    if (ArduinoOTA.getCommand() == U_FLASH) {
      type = "sketch";
    } else { // U_FS
      type = "filesystem";
    }

    // NOTE: if updating FS this would be the place to unmount FS using FS.end()
    Serial.println("Start updating " + type);
  });
  ArduinoOTA.onEnd([]() {
    Serial.println("\nEnd");
  });
  ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
    Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
  });
  ArduinoOTA.onError([](ota_error_t error) {
    Serial.printf("Error[%u]: ", error);
    if (error == OTA_AUTH_ERROR) {
      Serial.println("Auth Failed");
    } else if (error == OTA_BEGIN_ERROR) {
      Serial.println("Begin Failed");
    } else if (error == OTA_CONNECT_ERROR) {
      Serial.println("Connect Failed");
    } else if (error == OTA_RECEIVE_ERROR) {
      Serial.println("Receive Failed");
    } else if (error == OTA_END_ERROR) {
      Serial.println("End Failed");
    }
  });
  ArduinoOTA.begin();
  Serial.println("Ready");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
}

void setup_wifi() {
    delay(500);
    Serial.println();
    Serial.print("Connecting to ");
    Serial.println(ssid);
    WiFi.mode(WIFI_STA);
    WiFi.begin(ssid, password);
 
    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        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("Received message [");
  Serial.print(topic);
  Serial.print("] ");
  char msg[length + 1];
  for (int i = 0; i < length; i++) 
  {
    Serial.print((char)payload[i]);
    msg[i] = (char)payload[i];
  }
  Serial.println();

  msg[length] = '\0';
  Serial.println(msg);

  if (strcmp(msg, "auf") == 0  && zu != true) 
  {
    auf = true;              // sollte er aus sein, setzen wir auf auf true
    zu = false;
    automatisch = false;
 //   previousMillisauf = millis();
    Serial.println("Taster auf gedrückt");
//      Serial.println( previousMillisauf);   
    Serial.print("Aufbutton: " );   
      Serial.println(auf);
      Serial.print("zubutton: " );   
      Serial.println(zu);
      Serial.print("Autobutton: " );   
      Serial.println(automatisch);
  }
  else if (strcmp(msg, "zu") == 0 && auf != true)
  {
    auf = false;              // sollte er aus sein, setzen wir auf auf true
    zu = true;
    automatisch = false;
    Serial.print("Aufbutton: " );   
      Serial.println(auf);
      Serial.print("zubutton: " );   
      Serial.println(zu);
      Serial.print("Autobutton: " );   
      Serial.println(automatisch);
  }

  else if (strcmp(msg, "ein") == 0) 
  {
    digitalWrite(pinlicht, HIGH);
    client.publish("/Hühnerstall/Licht/status", "on");
  }
    else if (strcmp(msg, "aus") == 0) {
    digitalWrite(pinlicht, LOW);
    client.publish("/Hühnerstall/Licht/status", "off");
  }
}

void reconnect() {
  while (!client.connected()) 
  {
    Serial.println("Reconnecting MQTT...");
    
    if (!client.connect("Huehnerstall")) {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" retrying in 5 seconds");
      delay(5000);
    }
  }
  
  client.subscribe("/Hühnerstall/");
  Serial.println("MQTT Connected...");
}

void loop() 
{
  if (!client.connected()) 
  {
    reconnect();
  }
  client.loop();
  delay(150);
  
  ArduinoOTA.handle();
  long now = millis();
  
   if (now - lastMsg > 60000) {
     lastMsg = now;
     //int chk = dht.read();
     String msg="";
     char MsgTemp[25];
     char MsgFeutigkeit[25];     
 
     msg= dht.readTemperature();
     msg.toCharArray(MsgTemp,25); 
         
     msg= dht.readHumidity();
     msg=msg+"%";
     msg.toCharArray(MsgFeutigkeit,25);     
          
     client.publish("/Hühnerstall/Temp", MsgTemp);
     client.publish("/Hühnerstall/Feuchtigkeit", MsgFeutigkeit);
  }

  //-------- Taster AUF --------
  myButtonauf.update();
  if (myButtonauf.fallingEdge())
  { 
    if (auf == false)          // Abfrage ob der unser logischer Schalter aus ist
    {    
      auf = true;              // sollte er aus sein, setzen wir auf auf true
      zu = false;
      automatisch = false;
 //     previousMillisauf = millis();
      Serial.println("Taster auf gedrückt");
 //     Serial.println( previousMillisauf);   
      Serial.print("Aufbutton: " );   
      Serial.println(auf);
      Serial.print("zubutton: " );   
      Serial.println(zu);
      Serial.print("Autobutton: " );   
      Serial.println(automatisch);
      digitalWrite(pinmotorrunter, LOW);
     }
  }
    //-------- Taster ZU --------
    myButtonzu.update();
    if (myButtonzu.fallingEdge())
    {
      if (zu == false) {        // Abfrage ob der unser logischer Schalter aus ist
        zu = true;              // sollte er aus sein, setzen wir auf auf true
        auf = false;
        automatisch = false;

      Serial.print("Aufbutton: " );   
      Serial.println(auf);
      Serial.print("zubutton: " );   
      Serial.println(zu);
      Serial.print("Autobutton: " );   
      Serial.println(automatisch);
      digitalWrite(pinmotorhoch, LOW);
      }
    }

    //----------Steuerung durch Tasten------------
    if (auf == true || mqttauf == true)    // Taster auf betätigen; Motor fährt hoch bis Endschalter betätigt
    {
      digitalWrite(pinmotorhoch, HIGH);
      Serial.println("Motor fährt hoch");
      if (digitalRead(pinmotorhoch) == _AN && digitalRead(pinendtasteroben) == _pushed) 
      {
        digitalWrite(pinmotorhoch, _AUS);
        client.publish("/Hühnerstall/Klappe/status", "offen");   // 1= offen
        Serial.println("Motor hoch aus");
        auf = false;  
        mqttauf = false;
        automatisch = false;
      }
    }

    //----------Steuerung mit Taster zu---------------------
    if (zu == true  || mqttzu == true)    // Taster zu betätigen; Motor fährt runter bis Endschalter betätigt
    {
      digitalWrite(pinmotorrunter, HIGH);
      if (digitalRead(pinmotorrunter) == _AN && digitalRead(pinendtasterunten) == _pushed) 
      {
        digitalWrite(pinmotorrunter, _AUS);
        client.publish("/Hühnerstall/Klappe/status", "zu");  // 0= geschlossen
        zu = false;
        mqttzu = false;
        automatisch = false;
      }
    }
}
    //-------------------------------------------------------------------------------------------------------------------------------

Bitte lösch doch das Passwort aus Deinem Sketch!!!

 if (!_pushed) {                 //Taster schalten gegen GND
    pinMode(pinendtasteroben, INPUT_PULLUP);
    pinMode(pinendtasterunten, INPUT_PULLUP);
  }

Egal was Du da vorhast - ich versteh es nicht.

danke für den Hinweis, hab das ganz übersehen

 if (!_pushed) {                 //Taster schalten gegen GND[color=#222222][/color]
    pinMode(pinendtasteroben, INPUT_PULLUP);[color=#222222][/color]
    pinMode(pinendtasterunten, INPUT_PULLUP);[color=#222222][/color]
  }

stimmt das gehört weg, hab da einmal was ausprobiert. Hab den Teil nun gelöscht. Solang ich die Endtaster aber nicht betätige fährt der Wemos ganz normal hoch....

r_robert:
stimmt das gehört weg, hab da einmal was ausprobiert. Hab den Teil nun gelöscht. Solang ich die Endtaster aber nicht betätige fährt der Wemos ganz normal hoch....

Zu hoher Stromverbrauch im gedrückten Zustand. Nachbau? Spannungsregler mit geringer Leistungsfähigkeit waren schon Thema....

Der Spannungsregler reicht gerade für den WLAN Chip aus, er darf extern nur minimal belastet werden (50 mA bei 5 V).

Achtung: Es sind schlechte Nachbauten mit zu schwachem Spannungsregler im Umlauf.

ESP8266 und ESP8285 Module Anleitung (keine verschlüsselte Verbindung)

folgendes bekommen ich auf der Serial übertragen wenn ich die Endtaster betätigt hab. (gelb markiert)

Warum sollt bei einem Endtaster der Strombedarf zu hoch sein?

r_robert:
folgendes bekommen ich auf der Serial übertragen wenn ich die Endtaster betätigt hab. (gelb markiert)

Ja.
Und nu soll wer sich hinstellen und raten, wann und wo das passiert?
Das kommt von hier:

void callback(char* topic, byte* payload, unsigned int length) {

Warum sollt bei einem Endtaster der **Gesamt-**Strombedarf zu hoch sein?

Nicht bei sondern mit.

Spannungsabfall. Und da, wo Spannung abfällt wird auch irgendwas verbraten.

Evtl. weil der Taster einen Kurzschluss produziert? Wie hast Du denn den angeschlossen?

Gruß Tommy

Hab NO an D8 bzw D9 und COM an GND des Wemos angeschlossen

r_robert:
Hab NO an D8 bzw D9 und COM an GND des Wemos angeschlossen

Beachte:
D8 hat einen 10K PULL_DOWN ab Werk.
Du setzt dagegen Dein INPUT_PULLUP.

Ungeachtet dessen:
Ich sehe noch nicht wo Dein Problem liegt....
In Deinem Bildchen ist 22:20:50 connected eingetragen.

Danke für eure Hilfe...

Huehnerklappe_V1.4_TEST\Huehnerklappe_V1.4_TEST.ino: In function 'void callback(char*, byte*, unsigned int)':
Huehnerklappe_V1.4_TEST\Huehnerklappe_V1.4_TEST.ino:130:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]

bekomme beim kompilieren auch noch folgende Warnings? Warum ? :slight_smile:

my_xy_projekt:
Beachte:
D8 hat einen 10K PULL_DOWN ab Werk.
Du setzt dagegen Dein INPUT_PULLUP.

Ungeachtet dessen:
Ich sehe noch nicht wo Dein Problem liegt....
In Deinem Bildchen ist 22:20:50 connected eingetragen.

Das heißt ich soll am Besten von D8 auf einen anderen Eingang wechseln?
um 22:20:50 hab ich den Endtaster los gelassen dann klappt es. Das Problem ist nur im verbauten Zustand kann ich dann den Endtaster nicht los lassen...

r_robert:

Huehnerklappe_V1.4_TEST\Huehnerklappe_V1.4_TEST.ino: In function 'void callback(char*, byte*, unsigned int)':

Huehnerklappe_V1.4_TEST\Huehnerklappe_V1.4_TEST.ino:130:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]





bekomme beim kompilieren auch noch folgende Warnings? Warum ? :-)

Weil Du irgendwas gefummelt hast, was hier nicht nachvollziehbar ist!

Ausgehend von dem Code, den Du oben eingestellt hast, ist in Zeile 130 nur ein }
So. Und nu? Raten?

Die Warnung sagt aber schon alles.
Du hast irgendwo unsigned int und int gemischt.
Es ist ne Warnung. Wenn Du ausschliessen kannst, das int nicht auf unsigned int trifft, kann das gut gehen.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.