Programm Hilfe - bleibt im Setup hängen

Hallo alle zusammen :slight_smile:

Ich hab mal eine Frage ob jemand mir vielleicht bei meinem Programm helfen kann.
Das Programm an sich ist nur ein Testprogramm aber die Aufgabe ist es alle 10Sekunden Daten an einem Server zusenden, dass funktioniert auch alles soweit doch auch wenn es hängen bleibt in einer Schleife oder die Verbindung verliert startet das Programm neu bzw. verbindet sich neu mit dem WiFi Shield.
Doch irgendwann obwohl es vorher um die 15mal ohne Probleme sich neu verbunden hat bzw. neu gestartet ist, bleibt es hängen im Setup und läuft nicht mehr weiter. Ich hoffe es gibt jemanden der mein Problem vielleicht erkennt und mir hilft.

#include <SPI.h>
#include <WiFi.h>
#include <LiquidCrystal.h>


char ssid[] = "Wifi";                                           //  your network SSID (name)
char pass[] = "passwort";                                          // your network password
int status = WL_IDLE_STATUS;                                            // the Wifi radio's status
IPAddress server(IP-Adresse);  
char host[]    = "Server-Adresse";                                 // Domain
char url[]     = "/pfad/zur/datei.php";                           // Pfad zur PHP-Datei
WiFiClient client;                                                      // Initialize the Wifi client library
char c;
unsigned long lastConnectionTime = 0;                                   // last time you connected to the server, in milliseconds
const unsigned long postingInterval = 10L * 1000L;                      // delay between updates, in milliseconds

String Geraet ="1010";
String S1 = "";
String S2 = "";
String S3 = "";
String S4 = "";
String S5 = "";
String S6 = "";
String S7 = "";
String S88 = "";
String S9 = "";
String S10 = "";

int fail = 0;
int passed = 0;
int connectfail = 0;
int connectpassed = 0;

void watchdogSetup (void){} // muss definiert werden.
// denn die default Funktion macht ein: WDT_Disable (WDT);
// und das Disable verhindert den nächsten enable

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup()
{
  Serial.begin(9600);                                                   //Initialize serial and wait for port to open:
  delay(3000);
  Serial.flush();
  status = WL_IDLE_STATUS; 
   
  //################################# 
  lcd.begin(16, 2);                                                     // set up the LCD's number of columns and rows:
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("setup");
  delay(1000);
  //################################# 
 
  //Serial.println("Arduino Autolinie"); 
  //lcd.print("Arduino Autolinie");                                       // Print a message to the LCD.

  
  watchdogEnable(40000); // 10Sekunden        
  //wifi_shield_check(); 
  initWiFi();
  Serial.println("test");
  printWifiStatus();
 
  
}

void wifi_shield_check()
{
  String fv = WiFi.firmwareVersion();
  Serial.println();
  Serial.print("WiFi-Shield Firmware-Version: ");
  Serial.println(fv);
  if (fv != "1.1.0") {
  Serial.println("Please update WiFi-Shield Firmware");
    }

  //#################################  
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("wifi V " + fv);
  delay(500); 
  //#################################
}
 
void initWiFi()
{
                                      

    WiFi.disconnect(); 
    status = WiFi.begin(ssid, pass);
    delay(10000);
    
  //#################################
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("status initwifi");
    lcd.setCursor(0, 1);
    lcd.print(status);
    delay(2000);
  //#################################
  
 }

void printWifiStatus()
{  
  lcd.println("printWifiStatus");
  Serial.println();
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());
  
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Adress (WiFi-Shield): ");
  Serial.println(ip);
  
  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI): ");
  Serial.print(rssi);
  Serial.println(" dBm");  
  //#################################
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(WiFi.SSID());
  lcd.setCursor(0, 1);
  lcd.print(status);
  delay(2000); 
  //#################################
}

void loop()
{ 
 
lcd.clear();

lcd.setCursor(0, 1);
lcd.print(millis() / 1000);
delay(250);   

  watchdogReset();              // Setzt den Timer zurück
  
  int SW1 = fail;      //Sensorwert
  int SW2 = passed;      //Sensorwert
  int SW3 = connectfail;      //Sensorwert
  int SW4 = connectpassed;      //Sensorwert
  int SW5 = 1;      //Sensorwert
  int SW6 = 1;      //Sensorwert
  int SW7 = 1;      //Sensorwert
  int SW8 = 1;      //Sensorwert
  int SW9 = 1;      //Sensorwert
  int SW10 = 1;     //Sensorwert
  

  S1 = Geraet+"01"+SW1;
  S2 = Geraet+"02"+SW2;
  S3 = Geraet+"03"+SW3;
  S4 = Geraet+"04"+SW4;
  S5 = Geraet+"05"+SW5;
  S6 = Geraet+"06"+SW6;
  S7 = Geraet+"07"+SW7;
  S88 = Geraet+"08"+SW8;
  S9 = Geraet+"09"+SW9;
  S10 = Geraet+"10"+SW10;

    // if there's incoming data from the net connection.
       // send it out the serial port.  This is for debugging
       // purposes only:
    //lcd.autoscroll();
    //lcd.clear();
    //lcd.setCursor(0, 0);
    
   
      while (client.available()) {
       c = client.read(); 
       Serial.write(c);
       //lcd.write(c);
       //delay(100);      
       }
      
   
 //lcd.noAutoscroll();  
  
  // if ten seconds have passed since your last connection,
  // then connect again and send data:
  if (millis() - lastConnectionTime > postingInterval) {
       Serial.println(); 
       Serial.println(millis()); 
       //initWiFi(); 
       Daten_senden();            
       }
}
 
void Daten_senden()
{
  //lcd.println("Daten_senden"); 
// close any connection before send a new request.
  // This will free the socket on the WiFi shield
  client.stop();
  delay(300);
  client.flush();
  delay(300);
  
if (client.connect(server, 80)) // Verbindung zum Server aufbauen
  {
  //#################################
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("server connect");
  lcd.setCursor(0, 1);
  lcd.print("daten senden");
  delay(1000); 
  //#################################
    
 Serial.println("Verbunden, Sende Daten...");
 client.print("GET /pfad/zur/datei.php");
 client.print("?S1=");
 client.print(S1);
 client.print("&S2=");
 client.print(S2);
 client.print("&S3=");
 client.print(S3);
 client.print("&S4=");
 client.print(S4);
 client.print("&S5=");
 client.print(S5);
 client.print("&S6=");
 client.print(S6);
 client.print("&S7=");
 client.print(S7);
 client.print("&S8=");
 client.print(S88);
 client.print("&S9=");
 client.print(S9);
 client.print("&S10=");
 client.print(S10);
 client.println(" HTTP/1.1");
 client.print("Host: Adresse");
 client.println();
 client.println("Authorization: Basic Password");   //Username:password  (Base64) 
 client.println("Connection: close");
 client.println();
      
    
     // note the time that the connection was made:
    lastConnectionTime = millis();
    passed = passed +1;

    
  } else {
    // if you couldn't make a connection:
    Serial.println("connection failed");
    fail = fail +1;
    //#################################
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("connection fail");
    delay(1000); 
    //#################################
    initWiFi();
 
    } 


  Serial.print("fail= "); 
  Serial.println(fail);
  Serial.print("passed= "); 
  Serial.println(passed); 

  Serial.print("connetfail= "); 
  Serial.println(connectfail); 
  Serial.print("connectpassed= "); 
  Serial.println(connectpassed); 

   
}

Meine WiFi-Shield Firmware ist die Version 1.1.0
Meine Arduino IDE Version ist 1.6.12
und arbeitet mit dem Arduino Due.

Das Ziel was ich eigentlich verfolge ist, dass ich möchte das der Arduino stabil und gut läuft bzw. sich auch von selbst wieder fängt wenn er “abstürzt” bzw. die Verbindung verliert.

Achja das LCD-Display ist nur da damit ich ohne Seriellen Monitor weiß wo er hängen bleibt.

Ich bedanke mich schon mal für eure Hilfe :slight_smile:

Woher willst Du wissen, dass der im Setup hängen bleibt?
Du arbeitest im Loop sehr viel mit der Klasse String. Das müllt Dir Deinen Speicher zu.

Verwende stattdessen char-Arrays. Wie Du mit Zeichenketten in C umgehen solltest, ist eine der wesentlichen Grundlagen, die Du immer wieder brauchst.

Auch den Watchdog würde ich erst einsetzen, wenn alles andere läuft.

Gruß Tommy

Wobei er einen Due hat. Da ist das mit dem RAM nicht so schlimm

Ok, das habe ich überlesen. Ist die Strings-Implementation dort und bei den ESP8266 eigentlich genau so schlecht?

Gruß Tommy

Hat mit "schlecht" eher nichts zu tun...
Sondern mit der Größe des RAM.

Je weniger RAM, desto eher schlägt die Fragmentierungsfalle zu.

Also das Fragmentierungsproblem bleibt, weil es kene Müllabfuhr (wie in JAVA) gibt.

Gruß Tommy

weil es kene Müllabfuhr (wie in JAVA) gibt.

Ja, aber falsche Begründung!

In Java gibts keine Pointer!

Das ist ein Segen, und ein Fluch.

Wenn eine Sprache keine Pointer zum Programmierer durchreicht, kann sie im Hintergrund den Speicher nach belieben umräumen. Also auch alle Fragmentierungen beseitigen.

Die Müllabfuhr tut was ganz anderes.
Sie entsorgt Dinge, welche einen ReferenzCounter = 0 haben. (vereinfacht gesagt)
Es ist also eher so, dass die Müllabfuhr die Fragmentierung fördert.

Defragmentierung und Müllabfuhr sind zwei verschiedene Sachen.
Natürlich gibt es malloc/free und new/delete. Ob die bei esp8266 und 8-bit avr-gcc gleich gut sind, und direkt nebeneinanderliegende freie Bereiche defragmentieren, ist eine berechtigte Frage. Und welcher Fitzel der vorhandenen Fragmente bei einer neuen Anfrage vergeben wird, ist eine andere Frage.

smart pointer, die einem das delete verstecken, habe ich jetzt hier noch nicht gesehen.
Da bleibe ich auch lieber bei meinem Ansatz
“für 2kB RAM braucht man zusätzlich zum Stack eigentlich keine dynamische Speicherverwalltung.”

Dass kein java oder .net Speichermanagement einem einen c++ Pointer verbiegt und ein paar noch gültige dynamisch allokierte Bytes mal eben umkopiert, hat auch sein Gutes.
(Bei Microsoft sind sie sehr verwirrt, dass es Leute gibt, die Managed c++ verwenden zu müssen glauben). Und einen Arduino mit Java-ME braucht mir auch keiner zu zaubern.