Go Down

Topic: Arduino stellt immer nach einiger Zeit das arbeiten ein (Read 459 times) previous topic - next topic

combie

Quote
ACHTUNG: Man kann den Watchdog auch so kurz einstellen, daß ein Arduino NICHT MEHR STARTET.
...
Nach dem Watchdog-Reset ist der Wachhund mit genau den gleichen Werten immer noch in Betrieb!!
Eigentlich ist es noch schlimmer!


Bei einem Reset wird der WDT nicht abgeschaltet, ja.
Die eingestellte Zeit, wird allerdings dabei auf den minimalen Wert gesetzt.

Aber, es gibt auch gutes zu berichten:
Der UNO und der neue Nano Bootloader kann damit umgehen.
Andere fallen in einen Dauer-WDT-Reset-loop
Es ist offensichtlich, dass uns die Umstände alleine nicht glücklich oder unglücklich machen.
Es ist die Art unserer Reaktion darauf, die unsere Gefühle und Emotionen bestimmt.

amithlon

Hallo,

da ich noch einen DHT22 in der Kiste hatte, habe ich das jetzt mal zusammengesteckt und mit Deinem Sketch angeworfen.
Warum schickst Du eigentlich so oft die Daten? So schnell ändert sich doch sowieso nichts?

Zumindest schickt er jetzt erstmal seit 21:46:25 Uhr artig seine Daten.
Mal abwarten...

PS:
Der Sketch verwendet 22698 Bytes (73%) des Programmspeicherplatzes. Das Maximum sind 30720 Bytes.
Globale Variablen verwenden 1535 Bytes (74%) des dynamischen Speichers, 513 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.

und keine Stabilitäts-Warnung, warum auch immer...

23:05 Uhr noch sendet er. Nach dem Foto kamen keine Meldungen mehr, lag darn, daß ich das LAN-Kabel nicht sauber eingerastet hatt. Nochmal sauber gesteckt und er schickt weiter siene Daten.
Ist eigentlich auch logisch, wenn der ENC keinen Link hat gibt es eben keine Daten. Das fängt der UIP-Stack sowieso erstmal ab. Der MQTT-Broker wird auch erst unruhig wennd as keep-alive abgelaufen ist. MQTT ist ja extra für instbille Verbindungen entwicklet worden. Wenn innerhalb keep-alive wieder Daten kommen passiert garnichts weiter.


Nachtrag: heute morgen um gegen 5:00 Uhr lief er noch, jetzt 8:00 Uhr hat er den Betrieb eingestellt.
Ich habe jetzt erstmal den DHT22 komplett rauskommentiert und lasse mir nur Dummy-Daten schicken.
Mal abwarten...

Gruß aus Berlin
Michael

sunshineh

@Michael, wow das ist wirklich nett! Und irgendwie bin ich beruhigt, dass er sich bei dir auch aufhängt.
Siehst du, warum das so is? Was muss ich am Code ändern, damit es dauerhaft läuft bzw. der Arduino Nano wieder neu startet, wenn er nicht wie gewünscht funktioniert.

Einen anderen Ethernetchip kann ich derzeit nicht nehmen, dafür habe ich mehrere ENC28J60 hier  :smiley-confuse:

ElEspanol

#18
Nov 08, 2018, 09:16 pm Last Edit: Nov 08, 2018, 09:20 pm by ElEspanol
Du könntest mit dem F Macro noch einige Bytes RAM frei machen.

ENCs hab ich auch noch ein paar rumliegen, nehme sie aber nirgends mehr. Haben sich sogar nach Tagen stabilen Betriebes noch aufgehängt. Es gibt auch Breakouts mit dem W5100 im fast gleichen Format.

amithlon

Hallo,

@Michael, wow das ist wirklich nett! Und irgendwie bin ich beruhigt, dass er sich bei dir auch aufhängt.
Siehst du, warum das so is? Was muss ich am Code ändern, damit es dauerhaft läuft bzw. der Arduino Nano wieder neu startet, wenn er nicht wie gewünscht funktioniert.
ich habe aus Bequemlichkeit mal meinen alten BM280-Sketch genommen und nur den BM280 rausgeworfen und den DHT22 reingebaut.

Code: [Select]

#include <UIPEthernet.h>
#include <PubSubClient.h>
#include <SimpleDHT.h>

#define SENSOR 6
SimpleDHT22 dht1(SENSOR);

byte temperature1 = 0;
byte humidity1 = 0;

char msgBuffer[10];

unsigned long starttime = 0;
unsigned long repeattime = 10000;
unsigned int reconnecttime = 2000;                 // max. 65535
unsigned long waittime = reconnecttime;

// Update these with values suitable for your network.
byte mac[]    = {  0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED };
byte server[] = { 192, 168, 0, 99 };
byte ip[]     = { 192, 168, 0, 200 };

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

EthernetClient ethClient;
PubSubClient mqttClient(server, 1883, 0, ethClient);

void setup()
{
  waittime = reconnecttime;            // kurze Wartezeit bis Senden oder Connect-Versuch
  starttime = millis();
 
  Ethernet.begin(mac, ip);
  if (mqttClient.connect("ENC-Client"))
  {
    mqttClient.publish("Keller1/Status","online");
  }
}

void loop()
{
 if (millis() > (starttime + waittime))
 { 
   if (mqttClient.connected())
   { 
     int err = dht1.read(&temperature1, &humidity1, NULL);
     if (err == SimpleDHTErrSuccess)
     { 
       mqttClient.publish("Keller1/temp1", dtostrf(temperature1, 6, 2, msgBuffer));
       mqttClient.publish("Keller1/humidity1", dtostrf(humidity1, 6, 2, msgBuffer));
     }
     else
     {
       mqttClient.publish("Keller1/Error", itoa(err,msgBuffer,16));   
     } 
     waittime = repeattime;                // normale Wiederholzeit
   }
   else                                    // Verbindung verloren
   {
     if (mqttClient.connect("ENC-Client"))
     {
        mqttClient.publish("Keller1/Status","online");
     }
     waittime = reconnecttime;             // kurze Wartezeit bis Senden oder Connect-Versuch   
  }   
  starttime = millis();
}
 mqttClient.loop();
}


Schickt mir seit vorgestern Abend alle 10s artig die Daten.
Vielleicht hilft es ja, Keller heißt jetzt Keller1, ich hatte schon einen "Keller".

Nachtrag 10.11.: schickt immernoch stabil seine Meldungen, die Werte des DHT22 sehen auch recht glaubwürdig aus, hatte die bisher nie verwendet.

Gruß aus Berlin
Michael

amithlon

Hallo,

ich hole das nochmal nach oben. Daten kommen auch weiterhin stabil alle 10s an.
Das ist weniger eine Empfehlung für die ENC28J60 Module am Mega328, mehr der Hinweis, daß es stabil laufen kann. Ram sparen wo immer es geht. Array global anlegen wenn es mehrfach gebraucht wird hat hier den Vorteil, daß sofort klar ist, ob der Ram reicht. Funktionsaufrufe vermeiden wenn sie nur der Übersicht dienen und man es auch direkt in loop() packen kann usw. Der Funktionsaufruf kostet wie arrays in Funktionen Platz auf dem Heap und da hat man durch die genutzen Sachen der Libs wenig Überblick und kaum Kontrolle.
Da kracht es dann gern, wenn irgendwann eine Lib mal temporär mehr belegt hat und man mit dem eigenen Aufruf das Faß zum Überlaufen bringt.

Ich baue das jetzt trotzdem wieder ab, ich stolpee dauern über das rumliegende LAN-Kabel...

Gruß aus Berlin
Michael

Tommy56

Der Funktionsaufruf kostet wie arrays in Funktionen Platz auf dem Heap
Eher auf dem Stack.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

amithlon

Hallo,

Eher auf dem Stack.
Danke für die Korrektur. Letztlich ist es eben blöd, wenn da zusammenwächst, was nicht zusammengehört... ;-)

Gruß aus Berlin
Michael

Go Up