BLYNK
HOME       📲 GETTING STARTED       📗 DOCS       ❓HELP CENTER       👉 SKETCH BUILDER

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: