Hallo allerseits,
ich komme dem Problem nich auf die schliche. Vieleicht kann sich jemand mal den Sketch und den Aufbau anschauen.
Also folgendes...
Arduino Nano mit einem WIZ812MJ Ethernet SPI/Bus Module (saelig)
Das WIZ812MJ hängt an einem TP-Link TPLINK
Und verbindet sich dann mit einer Fritzbox 7390.
Der TP-Link fungiert als Client (Client-Modus eingestellt)
Nach dem anschliessen funktioniert alle Super, solange die Webseite, die den Arduino abfragt, geöffnet bleibt und alle 25 sek. eine Anfrage an den Arduino stellt.
Schliesse ich die Webseite (PC fährt runter o.Ä.) für länger als ca 2 min und starte sie dann wieder Neu, gibt es keine Verbindung mehr. Ich kann den Arduino auch nicht An-Pingen...
Aber in der Fritzbox, taucht der Arduino weiterhin als verunden auf...
Ich habe schon eine Ping-Anfrage (an google) in den Sketch mit eingebaut, aber selbst mit dem will die verbindung nicht bleiben.
Ich hoffe ihr versteht was ich meine, vieleicht hat ja jemand eine Idee, woran es liegen könnte...
ich hab mal kurz über den Code geschaut. Dazu folgende Anmerkungen:
RTC.getTime(); // aktuelle Zeit merken
if (int(RTC.hour) == 21 && int(RTC.minute) == 30) // immer um 21:30 Uhr Zeit vom NTP holen
{
while ( pause < 1 ) {
NTP_READ(); // Uhrzeit per NTP aktualisieren
Mail_senden(); // Sende Info Mail das die Uhrzeit aktualisiert wurde
pause++;
}
}
Du wirst nur einmal (nämlich beim ersten Mal 21:30 Uhr) per NTP die Zeit holen, denn die Variable "pause" wird danach nie wieder auf "0" gesetzt.
EthernetClient client = server.available(); // auf eine eingehende Verbindung warten
if (client) {
Hier verschwendest Du Speicher, denn die Variable client ist schon globale deklariert, Du erzeugst aber mit dem "EthernetClient client = server.available();" eine neue lokale Variable, statt mit "client = server.available(); " die globale Variable zu verwenden.
Sonst habe ich erstmal nichts Größeres gesehen, außer das Du sehr viele Variablen deklarierst, die dann nie verwendet werden, oder in den entsprechenden Funktionen wieder durch lokale Variablen verdeckt werden.
Zum allgemeinen Troubleshooting würde ich aber einen Rechner an die serielle Konsole hängen und Debug-Ausgaben machen, was der Arduino gerade macht und wo das Ganze hängt.
mkl0815:
Hier verschwendest Du Speicher, denn die Variable client ist schon globale deklariert, Du erzeugst aber mit dem "EthernetClient client = server.available();" eine neue lokale Variable, statt mit "client = server.available(); " die globale Variable zu verwenden.
Das ist nicht nur Speicherverschwendung, es hat auch funktionell erhebliche Auswirkungen: Eine in der loop deklarierte Variable hat ihre Lebensdauer nur so lange die loop-Funktion läuft. Am Ende der loop verliert die Variable ihre Daseinsberechtigung und im nächsten Durchlauf der loop feiert die Variable Wiederauferstehung, während eine globale Variable ständig bestehen bleibt.
mkl0815:
Sonst habe ich erstmal nichts Größeres gesehen, außer das Du sehr viele Variablen deklarierst, die dann nie verwendet werden, oder in den entsprechenden Funktionen wieder durch lokale Variablen verdeckt werden.
Als ganz dicker Hund fällt mir an dem Code auf, dass am laufenden Band vom Client Zeichen gelesen werden, z.B.
command =client.read();
ohne dass vorher mit "if (client.available())" geprüft wurde, ob überhaupt ein Zeichen zum Lesen bereitsteht.
Das ist wie jemand, der Besuch erwartet, hundertmal zur Tür läuft, Tür auf / Tür zu, und nachdem er das hundertmal gemacht hat davon ausgeht, dass er dann tatsächlich 100 Leute in seine Wohnung gelassen hat. Das kann ja tatsächlich nur dann funktionieren, wenn sich die Leute massenhaft vor der Wohnungstür drängeln, so dass jedesmal einer reinkommt, wenn die Tür aufgeht. Also müssen sich die Bytes im Client-Puffer drängeln, nur dann kann man jedesmal mit client.read() auch was lesen. Die ganze Einleselogik vom EthernetClient scheint mir stark änderungsbedürftig zu sein.