WeMos D1 R2 WiFi ESP8266 startet ständig neu

Hallo,

bin Einsteiger in diesem Thema.
Ich möchte folgendes mit dem Board lösen:

In meiner Werkstatt stehen zwei CNC-Fräsen. Diese schalten bei Start und Ende je ein Relais, daran liest das Board ab, ob die Fräse läuft oder steht.

Mit der Information wird ein Timer und ein Counter erstellt. Diese Informationen werden dann als JSON-Datei auf den Server geladen. Diesen lese ich dann über mein iPad alle 30 sek. aus um zu überprüfen ob die Maschine noch läuft.
Außerdem werden die Infos noch auf einem I2C Display angezeigt.
Alle 5min Speichere ich den Counterstandin den EEPROM, damit er am nachten Tag nach der Stromabschaltung noch da ist.

Das ganze funktioniert auch soweit ganz gut.
Allerdings kommt es immer wieder zu unerklärlichen Neustarts des Boards. (oft schon nach 3 min)

Folgendes habe ich dann versucht:

  • Netzteil ausgetauscht. (Powerbank, USB und 9V Netzteil)

  • 10K Widerstand von 3,3V auf reset gelegt.

Leider ohne Erfolg. Gefühlt kommen die Neustarts nicht mehr so oft vor. Vollkommen behoben ist das Problem leider nicht.

Ich hänge euch noch meinen Code an. Vielleicht ist da ja der Wurm drin.


#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <ArduinoJson.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <EEPROM.h>
#include <Arduino.h>



ESP8266WebServer server(80);
LiquidCrystal_I2C lcd(0x27, 20 , 4);



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

IPAddress ip(192, 168, 2, 174);
IPAddress dns(192, 168, 2, 1);
IPAddress gateway(192, 168, 2, 1);
IPAddress subnet(255, 255, 255, 0);

//Pinbelegung

const int tasterPINCNC1 = D7; //PIN D7
const int tasterPINCounterCNC1 = D6; //PIN D6

const int tasterPINCNC2 = D8; //PIN D8
const int tasterPINCounterCNC2 = D5; //PIN D5

const int speicherplatzCNC1 = 10;
const int speicherplatzCNC2 = 20;


//unsigned long aktuelleZeit = 0;
unsigned long runningtimeCNC1 = 0;
int counterCNC1 = 0;
unsigned long startzeitCNC1 = 0;
int tasterStatusCNC1 = LOW;
bool CNC1running = false;
unsigned long timerRoundCNC1 = 0;


unsigned long tmpStartzeit = 0;
int tmpmillisCounterCNC1 = 0;
int tmpmillisCounterCNC2 = 0;

//File SpeicherplatzCNC2;

unsigned long runningtimeCNC2 = 0;
int counterCNC2 = 0;
unsigned long startzeitCNC2 = 0;
int tasterStatusCNC2 = LOW;
bool CNC2running = false;
unsigned long timerRoundCNC2 = 0;

unsigned long serverInterval = 30000; // 30 sek.
unsigned long startzeitServerinterval = 0;
int serverRunde = 0;

unsigned long startzeitSpeicherplan = 0;
unsigned long speicherinterval = 300000; //1 min = 60.000
int speicherRunde = 0;


void setup()
{




  
  lcd.init();
  lcd.init();
  lcd.backlight();
  lcd.clear();

  Serial.begin(74880);
  //while (!Serial) continue;
  
  
  WiFi.config(ip, dns, gateway, subnet);
  WiFi.begin(ssid, password);

  pinMode (tasterPINCNC1, INPUT);
  pinMode (tasterPINCNC2, INPUT);
  pinMode (tasterPINCounterCNC1, INPUT);
  pinMode (tasterPINCounterCNC2, INPUT);

  Serial.print("Verbindung wird hergestellt ...");
  /*while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  
  Serial.println();
  */

  Serial.print("Verbunden! IP-Adresse: ");
  Serial.println(WiFi.localIP());

  Serial.println("Webserver gestartet.");

  server.onNotFound([]() {
    server.send(404, "text/plain", "Link wurde nicht gefunden!");
  });

  server.on("/", updateServer);

  server.begin();
  //Aus Speicher lesen
  EEPROM.begin(512);

    counterCNC1 = EEPROM.read(speicherplatzCNC1);
    counterCNC2 = EEPROM.read(speicherplatzCNC2);

      

}

void loop() {
  //Serial.println(millis());
  server.handleClient();

  //CNC1 LCD Anzeige
  lcd.setCursor(0, 0);
  lcd.print("Counter CNC 1 : " + String(counterCNC1));
  lcd.setCursor(0, 1);
  lcd.print(String(runningtimeCNC1 / 60) + " min");
  //CNC2 LCD Anzeige
  lcd.setCursor(0, 2);
  lcd.print("Counter CNC 2 : " + String(counterCNC2));
  lcd.setCursor(0, 3);
  lcd.print(String(runningtimeCNC2 / 60) + " min");

  //aktuelleZeit = millis();

  // C N C 1

  tasterStatusCNC1 = digitalRead(tasterPINCNC1);

  if (tasterStatusCNC1 == HIGH) {
    delay (5);
    //entprellt
    if (tasterStatusCNC1 == HIGH) {
          timerRoundCNC1 = timerRoundCNC1 + 1;
    //Überprüft, ob das Relais zum ersten Mal geschlaten hat
    CNC1running = true;
    if (timerRoundCNC1 == 1) {
      //legt die korrekte Startzeit fest
      startzeitCNC1 = millis();
      counterCNC1 = counterCNC1 + 1;
    }
    runningtimeCNC1 = (millis() - startzeitCNC1) / 1000;
    }
    
    else {
    CNC1running = false;
    runningtimeCNC1 = 0;
    //Display wird nur gecleart, wenn der Counter auf null springt.
    if (timerRoundCNC1 > 0) {
      lcd.clear();
    }
    timerRoundCNC1 = 0;
  }
  }


  // C N C 2

  tasterStatusCNC2 = digitalRead(tasterPINCNC2);

  if (tasterStatusCNC2 == HIGH) {
    delay (5);
    //entprellt
    if (tasterStatusCNC2 == HIGH) {
          timerRoundCNC2 = timerRoundCNC2 + 1;
    //Überprüft, ob das Relais zum ersten Mal geschlaten hat
    CNC2running = true;
    if (timerRoundCNC2 == 1) {
      //legt die korrekte Startzeit fest
      startzeitCNC2 = millis();
      counterCNC2 = counterCNC2 + 1;
    }
    runningtimeCNC2 = (millis() - startzeitCNC2) / 1000;
    }
    
    else {
    CNC2running = false;
    runningtimeCNC2 = 0;
    //Display wird nur gecleart, wenn der Counter auf null springt.
    if (timerRoundCNC2 > 0) {
      lcd.clear();
    }
    timerRoundCNC2 = 0;
  }
  }

  
  //CNC1
  if  (digitalRead(tasterPINCounterCNC1) == HIGH) {
    delay(5);
    //entprellt
    if  (digitalRead(tasterPINCounterCNC1) == HIGH) {
      //Taster gedrückt
      counterCNC1 = counterCNC1 + 1;
      //EEPROM.write(speicherplatzCNC1, counterCNC1);
      //EEPROM.commit();
      //lcd.setCursor(0,0);
      //lcd.print("Counter CNC 1 : " + String(counterCNC1));
      tmpmillisCounterCNC1 = tmpmillisCounterCNC1 + 1;
      delay(200);
      if (tmpmillisCounterCNC1 == 1) {
        tmpStartzeit = millis();
      }
      if  (digitalRead(tasterPINCounterCNC1) == HIGH && (millis() - tmpStartzeit) > 2000) {
        counterCNC1 = 0;
        //EEPROM.write(speicherplatzCNC1, counterCNC1);
        //EEPROM.commit();
        lcd.clear();
        //lcd.setCursor(0,0);
        //lcd.print("Counter CNC 1 : " + String(counterCNC1));
        delay(500);
      }
    }
  } else {
    tmpmillisCounterCNC1 = 0;
  }

  //CNC 2
  if  (digitalRead(tasterPINCounterCNC2) == HIGH) {
    delay(5);
    //entprellt
    if  (digitalRead(tasterPINCounterCNC2) == HIGH) {
      //Taster gedrückt
      counterCNC2 = counterCNC2 + 1;
      //EEPROM.write(speicherplatzCNC2, counterCNC2);
      //EEPROM.commit();
      //lcd.setCursor(2,0);
      //lcd.print("Counter CNC 2 : " + String(counterCNC2));
      tmpmillisCounterCNC2 = tmpmillisCounterCNC2 + 1;
      //Serial.println(tmpmillisCounterCNC2);
      delay(200);
      if (tmpmillisCounterCNC2 == 1) {
        tmpStartzeit = millis();
      }
      if  (digitalRead(tasterPINCounterCNC2) == HIGH && (millis() - tmpStartzeit) > 2000) {
        counterCNC2 = 0;
        //EEPROM.write(speicherplatzCNC2, counterCNC2);
        //EEPROM.commit();
        lcd.clear();
        //lcd.setCursor(2,0);
        //lcd.print("Counter CNC 2 : " + String(counterCNC1));
        delay(500);
      }
    }
  } else {
    tmpmillisCounterCNC2 = 0;
  }



  if (speicherRunde == 0) {
    startzeitSpeicherplan = millis();
    speicherRunde = speicherRunde + 1;
  }

  if ((millis() - startzeitSpeicherplan) > speicherinterval) {
    //speichern
    EEPROM.write(speicherplatzCNC1, counterCNC1);
    EEPROM.write(speicherplatzCNC2, counterCNC2);
    EEPROM.commit();
    Serial.println("Speichern beendet");
    delay(1000);
    speicherRunde = 0;
    }

  if (serverRunde == 0){
    startzeitServerinterval = millis();
    serverRunde = serverRunde + 1;
  }

  if ((millis() - startzeitServerinterval) > serverInterval) {
    serverRunde = 0;
    //Daten werden in den Server geladen
    
    //Serial.println("update Server");
  }
  Serial.println(ESP.getMaxFreeBlockSize());
}


void updateServer() {
  
    StaticJsonDocument<500> doc;
    
    doc["nameCNC1"] = "CNC1";
    doc["runningCNC1"] = CNC1running;
    doc["runningtimeCNC1"] = runningtimeCNC1;
    doc["counterCNC1"] = counterCNC1;

    doc["nameCNC2"] = "CNC2";
    doc["runningCNC2"] = CNC2running;
    doc["runningtimeCNC2"] = runningtimeCNC2;
    doc["counterCNC2"] = counterCNC2;

    String response;
    serializeJson(doc , response);
    server.send(200, "application/json", response);
  delay(50);
}

Wie lang sind die I2C-Kabel vom Wemos zum Display ?

Die Pulldown-Widerstände sind mit 100k zu groß, verkleiner die mal auf 4k7.
Das hat allerding vermutlich nichts mit dem Fehler zu tun.

Kritisch sind aber die I2C Pullups-Widerstände auf 5Volt. Der Wemos hat am I2C nur 3,3V. Das geht nicht gut. Leg mal lieber alles, auch die Betriebsspannung des Display auf 3,3V.

Danke für für die schnelle Antwort.

Ich habe es zwischenzeitlich mit 3,3V versucht. Leider mit dem gleichen Ergebnis.
Und das Display ist durch die 3,3V sehr dunkel.

Das Kabel ist tatsächlich relativ lange... ca. 15m
Ich habe dieses Kabel verwendet: J-Y(ST) Y 4X2X0,8
Könnte es helfen, wenn ich das Display extern mit 5V versorge?

Das ist für I2C def. viel zu lang. i2C ist für Platinenbestückung und wenige cm gedacht. Extern geht es mit einigen cm, ohne weitere Vorkehrungen geht evtl. auch ca. 50 cm.
Du brauchst Busextender wie z.B. P82B715 auf beiden Seiten.
Dann kannst du den Wemos mit 3,3 Volt und dein Diplay mit 5 Volt betreiben. Die Pullups sind dann jeweils am Extendender dran.

Hier gibt es Informationen

Hallo, gibt es hier schon ein Ergebnis ?

Hallo,

noch nicht abschließend. Ich musste mir zwischenzeitlich ein neues Board besorgen. Das alte wollte aus irgend einem Grund nicht mehr.
Ich hab jetzt das Display abgeschlossen und seither läuft es durch. Der Fehler liegt also definitiv da begraben!
Ich werde aber vermutlich das Board direkt zum Display holen und mit einem kurzen Kabel (ca. 10-20cm) anschließen. Hab festgestellt, dass ich das so recht einfach verwirklichen kann und umgehe die Extender.

Ok, dann war es sicher die Kabellänge.
I2C ist da eben sehr kritisch.

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