ThingSpeak- / WLAN-Abbruch nach ca. 8 Tagen?

Hallo,

habe ein Thermometer mit Upload nach Thingspeak gebastelt, funktioniert soweit auch wie es soll, aber ca. alle 8 Tage hängt es sich auf (Temperaturverlauf sieht dann aus wie im Anhang). Hat jemand eine Idee bzgl. der Ursache?

#include "ThingSpeak.h" // Thingspeak
#include <SPI.h>
#include <OneWire.h> 
#include <WiFi101.h>    // WLAN
#include <LiquidCrystal.h>

    char ssid[] = "SSID";    //  WLAN SSID hier eintragen
    char pass[] = "MEIN_KENNWORT_GEHT_EUCH_NIX_AN";   //  WLAN Passwort hier eintragen
    int status = WL_IDLE_STATUS;

WiFiClient  client;
LiquidCrystal lcd(0, 1, 2, 3, 4, 5);
OneWire  ds(7);                         // dig. Temperatursensor an Pin 7



unsigned long myChannelNumber = KANAL;            // Thingspeak-Channel
const char * myWriteAPIKey = "EGAL";   // Thingspeak WriteAPI

unsigned long previousMillis1 = 0;           //Zähler für Temperatur
unsigned long previousMillis2 = 0;           //Zähler für Thingspeak
unsigned long previousMillis3 = 0;           //Zähler für HeizungAn
unsigned long previousMillis4 = 0;           //Zähler für HeizungAUS

unsigned long intervall_an = 90000;          // 1 Minute Heizung an
unsigned long intervall_aus = 120000;         // 3 Minuten Heizung aus
unsigned long intervall_Temperatur = 5000;   //Intervall zwischen den Abfragen des Temperatursensors
unsigned long intervall_Thing = 60000;       //jede Minute 1 Upload

float celsius = 0;      // Temperatur in °C

boolean Heizung = true;

void setup() {

  pinMode (6, OUTPUT);   //Relais für Heizleitung
  pinMode (A1, OUTPUT); //Mosfet-Steuerung Ventilator
  

 WiFi.begin(ssid, pass);
 ThingSpeak.begin(client);  
 
  
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  delay(5000);
}

void loop() {

// digitalen Temperatursensor abfragen
  if (millis() - previousMillis1 > intervall_Temperatur) {
  
  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  
  if ( !ds.search(addr)) {

    delay(250);
    return;
  }
  
  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);        // start conversion, with parasite power on at the end

  present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE);         // Read Scratchpad


  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
  
  }

  int16_t raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {
      // "count remain" gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);

    if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
    //// default is 12 bit resolution, 750 ms conversion time
  }
  celsius = (float)raw / 16.0;
  previousMillis1 = millis();

  
  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
  lcd.setCursor(0, 1);
  // print the number of seconds since reset:
  lcd.print("     ");
  lcd.print(celsius);
  lcd.print(" C");
  
}

   if (celsius < 20) {   //bei Temperaturen <20°C soll DauerHeizung möglich sein
     digitalWrite(6, HIGH);
     Heizung = true;
      lcd.setCursor(0, 0);
      lcd.print("*");
     
     }
  
  
  
  if (celsius >20) {      //ab 20°C Heizung für 1 Minute an und 3 Minuten aus
       
          if (celsius < 35) {

                 if (Heizung == true){
                        if (millis()-previousMillis3 > intervall_an) {
                
                            digitalWrite(6, LOW);
                            Heizung=false;
                            previousMillis4=millis();   //Ausschaltzeit merken
                            lcd.setCursor(0, 0);
                        
                             lcd.print(" ");

                        }
                 }
                 
                if (Heizung == false){
                      if (millis()-previousMillis4 > intervall_aus){
                            digitalWrite(6, HIGH);
                            Heizung=true;
                            previousMillis3=millis();   //Einschaltzeit merken
                             lcd.setCursor(0, 0);
                        
                             lcd.print("*");
                      }
                }
                       
          
                  }
                
              
              }

          
  
  
          if (celsius > 40) {
          digitalWrite(6, LOW);
          Heizung=false;
          lcd.setCursor(0, 0);
                        
          lcd.print(" ");   
  }



// Lüfterregelung    
    
    if (celsius > 25) {
      
      digitalWrite (A1, HIGH);   //Lüfter einschalten bei mehr als 25°C
    }
    if (celsius < 25) {
      digitalWrite (A1, LOW);    //Lüfter ausschalten
    }


 // Upload der Messwerte nach Thingspeak

  if (millis() - previousMillis2 > intervall_Thing) {   
   
  //Werte setzen
  ThingSpeak.setField(1,celsius);         // field1 ist die Temperatur (gemäß Thingspeak-Channel)
    ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);  // Übertragen der der Werte
  
  
  previousMillis2 = millis();   // aktuelle Zeit abspeichern
  }

}

Danke!!!

Was hast Du denn für eine Hardware? Wie lange bleibt der Controller getrennt? Leider kenne ich Thingspeak nicht.... aber wenn die Verbindung von alleine wieder aufgebaut wird, dann startet wohl der Controller neu (sowohl WiFi-Client als auch Thingspeak-Client werden nur im Setup initialisiert). Wäre also die Frage, ob die WiFi-Verbindung oder die Thingspeak-Verbindung abbricht. Vorschläge: a) eine WiFi-connect-Methode schreiben, die überprüft, ob es eine WiFi-Verbindung gibt, und wenn nicht, die nötigen Schritte durchführt. b) Watchdog hinzufügen

Was hast Du denn für eine Hardware?

ich nutze einen MKR 1000.

Wäre also die Frage, ob die WiFi-Verbindung oder die Thingspeak-Verbindung abbricht.

Aber warum immer nach ca. 8 Tagen? Könnte das nicht auch irgendwas mit den Typen der Variablen zu tun haben?

a) eine WiFi-connect-Methode schreiben, die überprüft, ob es eine WiFi-Verbindung gibt, und wenn nicht, die nötigen Schritte durchführt. b) Watchdog hinzufügen

OK, da müsste ich mich dann erst einlesen.

Hat niemand sonst eine Idee?

Hi

Hast Du denn in der Zwischenzeit herausfinden können, WAS Dir überhaupt abschmiert?

Weder ein millis() noch ein mikros()-Überlauf passen in das Raster (49,x Tage bzw. 1,19x Stunden). Läuft die Schaltung immer 'gleich viel'? Oder verschiebt sich der Ausfall-Zeitpunkt, wenn die Schaltung nur recht selten 'arbeiten' muß? Das würde dafür sprechen, daß Dir der Speicher ausgeht, da neue Variablen erzeugt werden und Dir der 'freie Speicherplatz' fragmentiert - wobei nach der ersten Runde müssten sich überall genau passende Lücken befinden.

Soll der Sketch - irgendwann - eine abweichende Funktionalität aufzeigen? Ein Abzweig, Der nur seltenst aufgerufen wird und eben ganze 8 Stunden braucht, um den Arduino so durcheinander zubringen, daß Es knallt?!?

Ohne Angaben von Dir ist Das hier reines Kaffeesatz-Lesen, der Einzige, Der wirklich was bewirken kann, sitzt vor Deinem Monitor.

MfG

Hallo,

testen kann ich es nicht, aber mir fallen die uninitialisierten lokalen Variablen auf. Lokale Variablen in der loop kann man laut meiner Meinung auch global machen. Außer man hat bestimmte Gründe diese für jeden Durchlauf auf einen Wert zurückzusetzen.

byte i;
byte type_s;
byte data[12];
byte addr[8];

i hat noch Glück, wird nur in der for Schleife verwendet und auf 0 gesetzt.
Besser so. for ( byte i = 0; i < 9; i++)
type_s wird auf true abgefragt, wird nirgends sonst verwendet und ist eben nicht initialisiert.
data[12] wird immer munter verschoben und in raw gespeichert. Wann das raw verwendet wird ist ungewiss, weil der Wert von type_s unbekannt ist. Das mit der addr[8] wird ähnlich ablaufen. Ich denke das mit dem Sensor auslesen ist nicht so programmiert wie gedacht. Was ist das für ein Sensor? Ich vermute einen Dallas Sensor. Dafür gibts eine Lib mit Bsp.