Keypad Wemos D1 mini pro

Hallo

ich hab folgendes Problem. Der unten angeführte Code funktioniert solange ich den Wemos über den PC angeschlossen habe. Sobald ich diese aber über eine USB Ladegerät anschließe funktioniert der er nicht mehr zuverlässig. Teilweise wird die falsche Zahle auf dem Keypad erkannt oder er schickt teilweise 10-20mal die gleiche Zahl zum Mqtt server…
Hat jemand eine Idee? Danke

#include <ESP8266WiFi.h>
#include <Keypad.h>
#include <PubSubClient.h>

//#include <WiFiClient.h>
//#include <WiFiUdp.h>
#include <ArduinoOTA.h>
//#include <ESP8266mDNS.h>

const char* ssid = "XXX";
const char* password = "XXX";

const char* mqttServer = "10.0.0.72";
const int mqttPort = 1883;

WiFiClient espClient;
PubSubClient client(espClient);

const byte n_rows = 4;
const byte n_cols = 4;

char keys[n_rows][n_cols] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};

//byte colPins[n_rows] = {D3, D2, D1, D0};
//byte rowPins[n_cols] = {D7, D6, D5, D4};

byte colPins[n_rows] = {D7, D6, D5, D4};
byte rowPins[n_cols] = {D3, D2, D1, D0};

Keypad myKeypad = Keypad( makeKeymap(keys), rowPins, colPins, n_rows, n_cols);

void setup(){
Serial.begin(115200);
 
  WiFi.begin(ssid, password);
 
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.println("Connecting to WiFi..");
  }
  Serial.println("Connected to the WiFi network");
 
  client.setServer(mqttServer, mqttPort);
 
  while (!client.connected()) {
    Serial.println("Connecting to MQTT...");
 
    if (client.connect("ESP8266Client")) {
 
      Serial.println("connected");  
 
    } else {
 
      Serial.print("failed with state ");
      Serial.print(client.state());
      delay(2000);
 
    }
  }

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

    // NOTE: if updating SPIFFS this would be the place to unmount SPIFFS using SPIFFS.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 loop() {
  ArduinoOTA.handle();

  char myKey = myKeypad.getKey();
 
   if (myKey == '1')
    client.publish("Garage/Keypad", "1");
  if (myKey == '2')
    client.publish("Garage/Keypad", "2");
  if (myKey == '3')
    client.publish("Garage/Keypad", "3");
  if (myKey == '4')
    client.publish("Garage/Keypad", "4");
  if (myKey == '5')
    client.publish("Garage/Keypad", "5");
  if (myKey == '6')
    client.publish("Garage/Keypad", "6");
  if (myKey == '7')
    client.publish("Garage/Keypad", "7");
  if (myKey == '8')
    client.publish("Garage/Keypad", "8");
  if (myKey == '9')
    client.publish("Garage/Keypad", "9");
  if (myKey == '0')
    client.publish("Garage/Keypad", "0");
  if (myKey == '*')
    client.publish("Garage/Keypad", "*");
  if (myKey == '#')
    client.publish("Garage/Keypad", "#");
  if (myKey == 'A')
    client.publish("Garage/Keypad", "A");
  if (myKey == 'B')
    client.publish("Garage/Keypad", "B");
  if (myKey == 'C')
    client.publish("Garage/Keypad", "C");
  if (myKey == 'D')
    client.publish("Garage/Keypad", "D");
  }

Hallo,

ich denke du kommst zu schnell über die Tastatur und die Taste wird mehrfach erkannt und damit auch mehrfach gesendet. Mach mal nur versuchsweise einen delay(100) in den loop. Wenn das klappt musst Du halt was mit millis einbauen das du nur alle 100 ms über Abfrage und Auswertung kommst.

Heinz

Evtl. fehlt irgendwo ein GND-Verbindung oder Du hast Störungen drauf, da GND über den PC auch auch "geerdet" ist. Verbinde doch mal testweise GND mit einem geerdeten Rohr (Wasser/Heizung)

Gruß Tommy

muss ich das delay hinter jeder if Abfrage schreiben? (sorry bin Anfänger)

Geht der Wemos eigentlich nach einer Zeit in den deep sleep modus? Wenn ja wie könnte ich den ausschalten. Nach einer bestimmeten Zeit funktioniert nämlich das keypad nicht mehr....

if (myKey == '9')
    client.publish("Garage/Keypad", "9");

Was ich noch komisch finde ist...
Wenn ich den Wemos testweise im Haus betreibe hab ich nie das Problem dass die Zahlen falsch erkannt
werden. Installiere ich aber den Wemos in der Garage/Carport hab ich das Problem. Ich verwende immer
den gleichen Wemos und das gleiche Ladegerät und Kabel.

Hallo,

delay (100); einmal am ende des loop reicht erst mal .

Nein er geht nicht von selbst in den deep-sleep das musst du schon im programm festlegen.

eventuell hängt es damit zusammen wie “gut” du die tasten drücken kannst.

Heinz

hab das delay jetzt eingefügt, leider noch immer das gleiche Problem. Und nach 20sec. nimmt er gar keinen Tastendruck an... Drück ich den REset Button am Wemos funktioniert es wieder für 20sec.
Passt hier am Code etwas nicht?

Hab jetzt nur testweise einen Serial.print hinzugefügt, dieser funktioniert auch noch nach 20sec. scheinbar wird nur die mqtt Kommunikation unterbrochen....

Hallo,

dann lass das mit der Keypad abfrage erst mal raus, mach mit millis() eine Abfrage und dann jede sekunde ein
client.publish("Garage/Keypad", "A"). Mal sehe was dann passiert.

mqtt kenn ich nicht da muss ich passen , ich würde auch erst mal den OTA Kram komplett rauslassen . Das ist doch nachher schnell wieder reinkopiert. Ich pack das immer in eine eigene function , ist dann alles etwas übersichtlicher.

Schreibe ein Heardbeat mit ein, dann kannst du immer erkennen, ob der ESP noch läuft.

Was ist das für ein Ladegerät ?
Hast du mal die Spannung gemessen ?

hab das jetzt probiert. Wenn ich es sekundenweise abfrage bleibt die mqtt verbindung aufrecht, Frage ich aber aller 21sec. ab funktioniert es nicht mehr…

@HotSystems was meinst du mit "Schreibe ein Heardbeat mitrein" wie funktioniert das?

Ist ein Handladegerät mit 2A und 5V. Die 5V hab ich auch gemessen. Hab aber auch schon andere probiert und auch ein Netzteil an GND und VCC angeschlossen. Spannungsversorgung würde ich mal ausschließen.
Was ich aber noch immer komisch finde, ist dass das Keypad ja im Haus eigentlich problemlos mit dem Netzteil funktioniert aber in der Garage/Carport nicht wirklich..... Die Wifi verbindung ist aber auch in der Garage ok....

Heardbeat ist eine Funktion, mit einer blinkenden Led, die anzeigt, ob der Controller noch lebt.

Sieh dir mal BlinkWithoutDelay in den Beispielen der IDE an. Damit kannst du das aufbauen und immer blinken lassen.

Was dein Netzteil betrifft, vermute ich Störungen, die deinen ESP durcheinander bringen.
Die einfachen Ladegeräte haben ein hohes Störpotential, welches oft kritisch ist.

Hast du in der Garage evtl. irgendwelche Störer ? Z.B. Leuchtstoffröhren ?

Du kannst auf die VCC mal einen Elko 1000μF schalten. Evtl. hilft das.

hab es nun mit heardbeat probiert. Der Wemos bleibt am “Leben”…
Ich hab jetzt auch einen anderen Code ausprobiert und nun funktioniert das Keypad bzw. mqtt auch nach noch nach 20sek.

Was aber immer noch nicht funktioniert ist die richtige zuverlässige Übertragung…

Hab nun auch noch ein Netzteilmodul für Arduinos ausprobiert:
https://www.amazon.de/Fefaxi-STÜCKE-Steckbrett-Netzteilmodul-Arduino/dp/B07Y2CLFBY/ref=sr_1_17?__mk_de_DE=ÅMÅŽÕÑ&keywords=arduino+Netzteilmodul&qid=1584639557&sr=8-17

Leider immer noch gleiches Ergebnis.
Leuchtstoffröhre hab ich eine in der Garage, diese ist aber 3m vom Wemos entfernt.

Sonst noch eine Idee?

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <PubSubClient.h>
#include <Keypad.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>
#include <ESP8266mDNS.h>

const char* mqtt_server = "10.0.0.72";
const char* ssid = "xxx";
const char* password = "XXX";

WiFiClient net;
PubSubClient client(net);

Keypad keypad(
  makeKeymap(((char[4][4]) 
  {
    {'1','2','3','A'},
    {'4','5','6','B'},
    {'7','8','9','C'},
    {'*','0','#','D'}
  })),
  (byte[]){D3,D2,D1,D0},
  (byte[]){D7,D6,D5,D4},
//  (byte[]){D7,D6,D5,D4},
//  (byte[]){D3,D2,D1,D0},
  4,
  4
);

void setup() {
  
  Serial.begin(115200);
  Serial.println("Booting...");
  WiFi.mode(WIFI_AP_STA);
  WiFi.begin(ssid, password);
  connect();
   while (WiFi.waitForConnectResult() != WL_CONNECTED) {
    Serial.println("Connection Failed! Rebooting...");
    delay(5000);
    ESP.restart();
  Serial.println("Setup completed...");
}

ArduinoOTA.setHostname("GarageKeypad");

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

    // NOTE: if updating SPIFFS this would be the place to unmount SPIFFS using SPIFFS.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 loop() {
    ArduinoOTA.handle();
  if (!client.connected()) {
    reconnect();
  }
  client.loop();

  char key = keypad.getKey();
  delay(80);
  if (key) {
    Serial.print("Pressed Key: ");
    Serial.println(key);
    client.publish("Garage/Keypad", &key);
    delay(100);
  }
}

void connect() {
  // WiFi

  while (WiFi.waitForConnectResult() != WL_CONNECTED) 
  {
    WiFi.begin(ssid, password);
    Serial.println("WiFi connection failed. Retry.");
  }
  Serial.print("Wifi connection successful - IP-Address: ");
  Serial.println(WiFi.localIP());

  // MQTT
  client.setServer(mqtt_server, 1883);
}

void reconnect() {
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");

    String clientId = "WemosKeypad-";
    clientId += String(random(0xffff), HEX);

    if (client.connect(clientId.c_str())) {
      Serial.println("connected");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");

      delay(5000);
    }
  }
}