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