ESP8266 keeps restarting

Hi

I wanted to built my own thermostat with Blynk and ESP8266, but I’m a complete beginner in Arduino. So I took the code from this topic (Heating control #Thermostat), and modified a little bit to get rid of the errors.
The hardware is the same as the one used in this topic, but my board keeps restarting.

Here is the modified code :


#define BLYNK_PRINT Serial
#include <ESP8266mDNS.h>           
#include <WiFiUdp.h>            
#include <ArduinoOTA.h>            
#include <BlynkSimpleEsp8266.h>     
#include <Wire.h>              
#include <SHT2x.h>
#include <WidgetRTC.h>              

//On défini les couleurs
#define BLYNK_GREEN     "#23C48E"      // couleur vert
#define BLYNK_BLUE      "#04C0F8"      // couleur bleu
#define BLYNK_YELLOW    "#ED9D00"      // couleur orange
#define BLYNK_RED       "#D3435C"      // couleur rouge
#define BLYNK_DARK_BLUE "#5F7CD8"      // couleur bleu foncé


#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>

char auth[] = "<myAuthToken>";
char ssid[] = "<mySSID";
char pass[] = "<myWifiPassword>";


// Variable mode fonctionnement
float xnuit ;       //On initialise la valeur de consigne de nuit
float xjour;        //On initialise la valeur de consigne de jour
int etat;           //On initialise la fonction d'état du slider

// Variable météo
float t;            //On initialise la variable qui contiendra la température
float h;            //On initialise la variable qui contiendra l'humidité
int automanuel;     //On initialise la variable qui contiendra le mode automatique/mannuel

// Variable temps
long starttime;         // start time in seconds
long stoptime;          // stop  time in seconds
long timenow;           // time now in seconds

// déclaration des broches de communication
int sda = 3;     // SDA données
int scl = 4;     // SCL horloge

// SHT21 HTU21D
//SHT2x SHT21;  // création d'une instance

//on initialise le timer BLYNK
BlynkTimer timer;   // Timer "void"

// On initialise les Widget
WidgetLED led1(V7);     //LED chaudière
WidgetRTC rtc;          // Temps (heure du serveur)

// On synchronise les timers (semaine = V21 et week-end = V22) et les boutons (slider = V9 et mode auto/manuel = V20)
void timeinput()
{
  Blynk.syncVirtual(V9, V20, V21,V22);
}

//On créer la boucle qui permet de lire la température et l'humidité d'après le SHT21 (HTU21D)
void sendSensor()
{
  //On définit les variable qui contiendront les données météo
  t = SHT2x.GetHumidity()-1.5;         // Température
  h = SHT2x.GetHumidity();             // Humidité
  
  //On envoie les donnés des variables à des boutons virtuels si les valeurs sont supérieurs à 5
  if (h > 5){
    Blynk.virtualWrite(V5, h);    // Humidité = V5
  }
  if (t > 5 ){
    Blynk.virtualWrite(V6, t);    // Température = V6
  }
}


//On créer la boucle du thermostat
void thermostat()
{
  if (etat == 3) {                                //Si le slider est sur la position nuit (3)
    if ( t < xnuit-0.25 && t > 5 ) {                  //Si la température est inférieur à "la valeur de consigne de nuit" - "offset"
      led1.setColor(BLYNK_BLUE);                            //On défini la couleur de la LED sur vert
      led1.on();                                            //On allume la LED                                         
      digitalWrite(6,LOW);                                 //On allume le relais de la chaudière
    }
    else if (t > xnuit+0.13 && t > 5){                //si la température est supérieur à "la valeur de consigne de nuit" + "offset"
      led1.off();                                           //On éteind la LED
      digitalWrite(6,HIGH);                                //On éteind le relay de la chaudière
    }
  }

  else if (etat == 2) {                           //Si le slider est sur la position jour (2)
    if ( t < xjour-0.25 && t > 5 ) {                  //Si la température est inférieur à "la valeur de consigne de jour" - "offset"
      led1.setColor(BLYNK_GREEN);                           //On défini la couleur de la LED sur bleu
      led1.on();                                            //on allume la LED
      digitalWrite(6,LOW);                                 //On allume le relay
    }
    else if (t > xjour+0.13 && t > 5 ){               //si la température est supérieur à "la valeur de consigne de jour" + "offset"
      led1.off();                                           //On éteind la LED
      digitalWrite(6,HIGH);                                //On éteind le relay de la chaudière
    }
  }

    else if (etat == 1){                          //Si le slider est sur la position sans régulation (1)
      led1.setColor(BLYNK_RED);                             //On défini la couleur de la LED sur rouge
      led1.on();                                            //on allume la LED
      digitalWrite(6,LOW);                                 //On allume le relay
    }

    else if (etat == 0) {                         //Si le slider est sur la position OFF (0)
      led1.off();                                           //On éteind la LED
      digitalWrite(6,HIGH);                                //On éteind le relay de la chaudière
    }
}


//On définit la valeur de consigne de jour
BLYNK_WRITE(V15)
{
  xjour = param.asFloat();    //On stock la valeur de consigne de jour dans la variable xjour
}

//On définit la valeur de consigne de nuit
BLYNK_WRITE(V16)
{
  xnuit = param.asFloat();    //On stock la valeur de consigne de nuit dans la variable xnuit
}



//SLider mode de fonctionnement
BLYNK_WRITE(V9)
{
  int test=param.asInt();      // On récupère la position du slider

  if (test==1) {                //Si le slider est sur "sans regulation"
    etat=1;                    // On définit l'état à 1
  }
  else if (test==2) {          //Si le bouton est sur "jour"
    etat=2;                    // On définit l'état à 2
  }
  else if (test==3) {          //Si le bouton est sur "nuit"
    etat=3;                    // On définit l'état à 3
  }
  else {                       // Si le slider est sur "OFF"
    etat=0;                    // On définit l'état à 0
  }
}


// Bouton auto/manuel
BLYNK_WRITE(V20)
{
  automanuel = param.asInt();     // On récupère la position du bouton
}

//Timer semaine
BLYNK_WRITE(V21)                                              // Timpe Input Widget
{
  TimeInputParam t(param);                                                      // Le temps est stocké dans la variable t
  
if (automanuel ==1){                                                            // Si le bouton V20 est sur la position automatique
  
  int dayadjustment = -1;                                                       // On fait un ajustement de -1 jour
    if(weekday() == 1){
    dayadjustment =  6;                                                         // On en a besoin car Dimanche est le jour 1 pour la library TimeLib mais c'est le jour 7 pour la librairy BLYNK
    }
    if(t.isWeekdaySelected(weekday() + dayadjustment)){                         // Si aujourd'hui est un jour sélectionné sur le widget Time Input
      timenow = ((hour() * 3600) + (minute() * 60) + second());                      // On récupère l'heure du jour
      starttime = (t.getStartHour() * 3600) + (t.getStartMinute() * 60);             // On récupère l'heure de départ du timer

      if(timenow >= starttime){                                                      // Si l'heure actuelle correspond à l'heure de départ du timer
        if(timenow <= starttime + 10){                                                    // Si l'heure actuelle est comprise entre "l'heure de départ du Timer" et "l'heure de départ du timer + 10 secondes"
          Blynk.virtualWrite(V9, 2);                                                            // On met le slider en position jour
        }      
      }
      else{}
    
      stoptime = (t.getStopHour() * 3600) + (t.getStopMinute() * 60);                // On récupère l'heure d'arrivée du timer

      if(timenow >= stoptime){                                                       // Si l'heure actuelle correspond à l'heure d'arrivée du timer
        if(timenow <= stoptime + 10){                                                     // Si l'heure actuelle est comprise entre "l'heure de départ du Timer" et "l'heure de départ du timer + 10 secondes"
          Blynk.virtualWrite(V9, 3);                                                            // On met le slider en position nuit
        }              
      }
      else{}
    }
}
else{}
}



//Timer semaine
BLYNK_WRITE(V22)                                              // Timpe Input Widget
{
  TimeInputParam t(param);                                                      // Le temps est stocké dans la variable t
  
if (automanuel ==1){                                                            // Si le bouton V20 est sur la position automatique
  
  int dayadjustment = -1;                                                       // On fait un ajustement de -1 jour
    if(weekday() == 1){
    dayadjustment =  6;                                                         // On en a besoin car Dimanche est le jour 1 pour la library TimeLib mais c'est le jour 7 pour la librairy BLYNK
    }
    if(t.isWeekdaySelected(weekday() + dayadjustment)){                         // Si aujourd'hui est un jour sélectionné sur le widget Time Input
      timenow = ((hour() * 3600) + (minute() * 60) + second());                      // On récupère l'heure du jour
      starttime = (t.getStartHour() * 3600) + (t.getStartMinute() * 60);             // On récupère l'heure de départ du timer

      if(timenow >= starttime){                                                      // Si l'heure actuelle correspond à l'heure de départ du timer
        if(timenow <= starttime + 10){                                                    // Si l'heure actuelle est comprise entre "l'heure de départ du Timer" et "l'heure de départ du timer + 10 secondes"
          Blynk.virtualWrite(V9, 2);                                                            // On met le slider en position jour
        }      
      }
      else{}
    
      stoptime = (t.getStopHour() * 3600) + (t.getStopMinute() * 60);                // On récupère l'heure d'arrivée du timer

      if(timenow >= stoptime){                                                       // Si l'heure actuelle correspond à l'heure d'arrivée du timer
        if(timenow <= stoptime + 10){                                                     // Si l'heure actuelle est comprise entre "l'heure de départ du Timer" et "l'heure de départ du timer + 10 secondes"
          Blynk.virtualWrite(V9, 3);                                                            // On met le slider en position nuit
        }              
      }
      else{}
    }
}
else{}
}

// BLYNK Connexionn
BLYNK_CONNECTED()
{                                                          // Quand Blynk se connecte
  Blynk.syncVirtual(V7, V9, V15, V16, V20, V21, V22);      // On synchronise les boutons, les LEDs et les timers
}



void setup()
{
  // Debug console
  Serial.begin(9600);

  Blynk.begin(auth, ssid, pass);
  pinMode(6, OUTPUT);                                               // On définit la commande du relay de la chaudière en sortie
  digitalWrite(6, HIGH);                                            // On définit le premier état du relay de la chaudière à l'état Bas
  delay(1000);                                                      // On patiente 1 seconde
  rtc.begin();                                                      // On démarre l'horloge
  ArduinoOTA.setHostname("Thermostat");                             // On défini le nom de l'appareil
  ArduinoOTA.setPassword("vousavezetehacke");                               // On défini son mot de passe
  ArduinoOTA.begin();                                               // On initialise l'OTA
  Wire.begin();
  timer.setInterval(1000L, sendSensor);                             //On définit le temps de répétition de la boucle de récupération de données du SHT21 à 1 seconde
  timer.setInterval(1000L, thermostat);                             //On définit le temps de répétition de la boucle de commande de la chaudière à 1 seconde
  timer.setInterval(1000L, timeinput);                              //On définit le temps de répétition de la boucle TimeInput à 1 seconde
}

void loop()
{
  Blynk.run();
  timer.run();
}


Here is what i get from the serial monitor :

[629] Connecting to blynk-cloud[dot]com:80
[716] Ready (ping: 21ms).
V0⸮J)n⸮⸮⸮⸮[51] Connecting to
[4383] Connected to WiFi
[4383] IP: 192.168.1.77
[4383]
___ __ __
/ _ )/ /_ _____ / /__
/ _ / / // / _ / '/
/
//_, /////_
/
__/ v0.6.1 on NodeMCU

[4459] Connecting to blynk-cloud[dot]com:80
[4554] Ready (ping: 25ms).

and so on …

I checked the other topics but I could’nt find any working solution for this issue, and I’m not familiar enough with Blynk and Arduino to solve it by myself.

thanks for your help :slight_smile:

A few things to try…

Disconnect everything from your ESP8266 (except the USB cable to your PC) and try again with the existing code.

If that doesn’t help, then with everything still disconnected try loading a simple example sketch from the Sketch Builder.

If you’re still having issues then reboot your router and any wireless repeaters. If you’re still having problems then try a different Wi-Fi network.

Pete.

Just replace the lines causing WatchDog Resetting :

  pinMode(6, OUTPUT);                                               // On définit la commande du relay de la chaudière en sortie
  digitalWrite(6, HIGH);                                            // On définit le premier état du relay de la chaudière à l'état Bas

with

// Utilisez n'importe quelle broche correcte pour votre relais, de D0 à D8
  pinMode(D6, OUTPUT);                                               // On définit la commande du relay de la chaudière en sortie
  digitalWrite(D6, HIGH);                                            // On définit le premier état du relay de la chaudière à l'état Bas

On a general note: I’d use longer intervals on the timers. Sooner or later, it will haunt you! :grin:

Hi

Thanks for your replys, but the problem is still unsolved :frowning:
I actually changed the ESP board (for another ESP 12-F), set the timers to 5000 and fixed the ports, but nothing changed …

The board now simply shuts down after like 30 seconds. This problem doesn’t happened with the Blynk examples for ESP8266-Standalone in wifi, but I can’t find the error in the code.

I wonder why you seek help, but not at least try to see if it’s OK before seeking more and more help about the exactly same issue? Isn’t it also a waste your time, as in last 2 months?

Please read the following paragraph in:

https://arduino-esp8266.readthedocs.io/en/2.6.3/reference.html#digital-io

Digital pins 6—11 are not shown on this diagram because they are used to connect flash memory chip on most modules. Trying to use these pins as IOs will likely cause the program to crash.

You are using in your code

pinMode(6, OUTPUT);                                               // On définit la commande du relay de la chaudière en sortie
  digitalWrite(6, HIGH);                                            // On définit le premier état du relay de la chaudière à l'état Bas

and also 6 more of that, such as

digitalWrite(6,LOW);                                 //On allume le relais de la chaudière
....

Just replace pin 6 (actually GPIO6) to D6 (actually GPIO12) for all related functions will solve the WDT reset issue.

And if you care to check the original code posted in

It’s using D6, not 6.

1 Like

I as said in my previous post, I fixed the port-related issues according to khoih post. I previously modified them compared to the original code because of compiling issues (error while declaring int=+). At the time I didn’t know about GPIO pins to avoid as IO.

But for now, I checked and re-checked the code, read the libraries documentation about the functions used in the code, but I still cannot find the cause of the crash.

Ports and GPIO pins are very different things, so it would have been useful if you’d used the correct terminology.
It would also be useful if you posted your latest code, so we can see exactly what you’ve changed.

Your original code had duplicate library includes, some libraries that aren’t needed at all, some very dodgy looking else() statements, and a line of code that is apparently meant to read the temperature, but which actually reads the humidity (again).

The original code that you linked to did have the unnecessary library includes, but you appear to have added the rest of the issues in your attempts to “get rid of the errors“.

By guess is that your libraries or your ESP core are either out of date or corrupted, so the first step should be to check/update/reinstall them.

The next step in trying to fix constant reboots should be to remove all the connections to the board (except the USB) and upload a simple sketch to ensure that the board is good.
Then re-load your original sketch and comment-out various sections of code one at a time to see if that fixes the issue.
Once you’ve narrowed-down which section of code is causing the issue then you know where to focus your efforts.

Pete.