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);
}