Hi, I have problems with my program using Blynk 2.0. Everything works fine, but after 1 - 3 days the program locks up, and can only be restarted with resetting by turning on/off the supply. I am focusing on the timers, I guess that they create conflicts after some time.
Any suggestions on how to set up the timers, to avoid conflicts, any comments are appriciated. Thanks
#define BLYNK_TEMPLATE_ID "TMPL9WbXWb"
#define BLYNK_DEVICE_NAME "SR Drivhus"
#define BLYNK_FIRMWARE_VERSION "2.3.0"
#define BLYNK_PRINT Serial
#define APP_DEBUG
#define USE_NODE_MCU_BOARD
#include "BlynkEdgent.h"
#include <Wire.h>
#include <BH1750.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Time.h>
#include <TimeLib.h>
#include <PCF8574.h>
#include "RunningAverage.h"
#include <Adafruit_ADS1X15.h>
#include <WidgetRTC.h>
#define ONE_WIRE_BUS D5
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
Adafruit_ADS1115 ads;
/***** PCF8574 setup ************************************************/
PCF8574 pcf8574(0x38);
PCF8574 bh1750(0x23);
float Voltage0 = 0.0;
float Voltage1 = 0.0;
float Voltage2 = 0.0;
float Voltage3 = 0.0;
float Voltage4 = 0.0;
/******* Ultralyd ***********************************************/
const int trigPin = 13; //D7
const int echoPin = 12; //D6
long duration;
float ultra_afstand;
/********** Strømmåling******************************************/
RunningAverage myRA(10);
int samples = 0;
float total = 0;
int numReadings = 10;
/***************Jordfugtighed**************************************************/
float soilStepMem;
long soilMin;
long soilMinMem;
long soilMax;
long soilMaxMem;
/*****************************************************************/
BlynkTimer timer;
BlynkTimer timer1;
Adafruit_BME280 bme_ude;
Adafruit_BME280 bme_inde;
/*********** Relæ define ******************************************/
#define R1TH P0 //***** Relæ 1 temp for høj ***************
#define R2TL P1 //***** Relæ 2 temp for lav ***************
#define R3LH P2 //***** Relæ 3 lys tændes ***************
#define R4SL P3 //***** Relæ 4 Soil for lav fugtighed *****
#define M1TL P4 //***** Motor frem og tilbage *************
#define M1TH P5 //***** Motor hastighed *******************
float tempUde;
float humUde;
float pressureUde;
float tempInde;
float humInde;
float pressureInde;
float lus;
float jordTemp;
float soilValue;
int vanding;
int vanding_mem;
int nat_lys; //V16 henter status på nat lys on/off
int nat_lys_mem = 1;
int temp_max; //V21 henter status på temp max on/off
int temp_min; //V22 henter status på temp min on/off
int led_lys_min; //V23 henter status på lys min on/off
int led_vanding_on; //V24 henter status på vanding on/off
int lys_min; //V20 henter status på lys
int lys_min_mem;
int temp_min_mem;
int temp_max_mem;
int16_t adc0, adc3;
char currentTime[80];
char currentDate[80];
int voltage_mem;
int fugt_min;
int fugt_min_mem;
BH1750 lightMeter;
int lux;
BLYNK_CONNECTED() { //When device is connected to server...
Blynk.sendInternal("rtc", "sync"); //request current local time for device
Blynk.syncAll();
}
/***********Setup ******************************************/
void setup() {
sensors.begin();
Serial.begin(9600);
delay(100);
BlynkEdgent.begin();
bme_ude.begin(0x76); //BME280 I2C adresse ude
bme_inde.begin(0x77); //BME280 I2C adress inde
/*********** Relæ setup******************************************/
pcf8574.pinMode(R1TH, OUTPUT); //***** Relæ 1 temp for høj ***************
pcf8574.pinMode(R2TL, OUTPUT); //***** Relæ 2 temp for lav ***************
pcf8574.pinMode(R3LH, OUTPUT); //***** Relæ 3 lys tændes ***************
pcf8574.pinMode(R4SL, OUTPUT); //***** Relæ 4 Soil for lav fugtighed *****
pcf8574.pinMode(M1TL, OUTPUT); //***** Motor frem og tilbage *************
pcf8574.pinMode(M1TH, OUTPUT); //***** Motor hastighed *******************
pcf8574.digitalWrite(R1TH, HIGH); //***** Relæ 1 temp høj sat off ***************
pcf8574.digitalWrite(R2TL, HIGH); //***** Relæ 2 temp lav sat off ***************
pcf8574.digitalWrite(R3LH, HIGH); //***** Relæ 3 lys sat on ***************d
pcf8574.digitalWrite(R4SL, HIGH); //***** Relæ 4 soil høj sat on ***************
pcf8574.digitalWrite(M1TL, HIGH); //***** Relæ Motor sat on ***************
pcf8574.digitalWrite(M1TH, HIGH); //***** Relæ M Motor hastighed sat on ***************
pcf8574.begin();
ads.begin();
pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
pinMode(echoPin, INPUT); // Sets the echoPin as an Input
WidgetRTC rtc;
lightMeter.begin();
//************ Læse indstillinger og automation ****************************************
timer.setInterval(1000L, clockDisplay);
Blynk.run();
timer.setInterval(2111L, current);
Blynk.run();
timer.setInterval(3111L, inde_temp_hum);
Blynk.run();
timer.setInterval(5111L, ude_temp_hum_press);
Blynk.run();
timer.setInterval(6111L, light);
Blynk.run();
timer.setInterval(7111L, UltraLyd);
Blynk.run();
timer.setInterval(8111L, inde_jordfugt);
Blynk.run();
timer.setInterval(9111L, jord_temp);
Blynk.run();
}
//************ Læse indstillinger og automation ****************************************
BLYNK_WRITE(V16) // vanding
{ int vanding = param.asInt(); // Status for vanding on =1 off = 0
vanding_mem = vanding;}
BLYNK_WRITE(V13) // nat_lys
{ int nat_lys = param.asInt(); // Status for nat_lys on =1 off = 0
nat_lys_mem = nat_lys;}
BLYNK_WRITE(V17) // Status for slider temp_max
{ temp_max = param.asInt(); // Sætter indkommen værdi fra V21 lig slider
temp_max_mem = temp_max;}
BLYNK_WRITE(V19) // Status for slider temp_max
{ temp_min = param.asInt(); // Sætter indkommen værdi fra V22 lig slider
temp_min_mem = temp_min;}
BLYNK_WRITE(V20) // Status for slider led_lys_min
{ lys_min = param.asInt(); // Sætter indkommen værdi fra V23 lig slider
lys_min_mem = lys_min;}
BLYNK_WRITE(V18) // Status for slider led_lys_min
{ fugt_min = param.asInt(); // Sætter indkommen værdi fra V23 lig slider
fugt_min_mem = fugt_min;}
//************ void loop ****************************************
void loop() {
BlynkEdgent.run();
Blynk.run();
timer.run();
Blynk.run();
}
//************ Målinger ude temp/hum/press *************0,34***************************
void ude_temp_hum_press()
{
tempUde=bme_ude.readTemperature();
humUde=bme_ude.readHumidity ();
pressureUde=bme_inde.readPressure();
Blynk.virtualWrite(V3,tempUde);
Blynk.virtualWrite(V4,humUde);
Blynk.virtualWrite(V5,pressureUde/100);
}
//************ Målinger Light **************0,23**************************
void light()
{
float lux = lightMeter.readLightLevel();
Blynk.virtualWrite(V9,lux);
if
(nat_lys_mem == 0) // nat_lys slukket
{
pcf8574.digitalWrite(R3LH, HIGH); // Slukker for lyset
Blynk.virtualWrite(V23, 0); // V23 slukker lyset
}
else
if
(lux < lys_min) // Tænder lys
{
pcf8574.digitalWrite(R3LH, LOW);
Blynk.virtualWrite(V23, 255); //V23 viser lys tændt
}
else
if (lux > lys_min+10) // Hysterese på lys
{ pcf8574.digitalWrite(R3LH, HIGH); // LOW = lys on
Blynk.virtualWrite(V23, 0); //V23 viser lys slukket
}
}
//**********************Målinger inde temp/hum/press*******0,60 sec varierer***********************
void inde_temp_hum()
{
tempInde=bme_inde.readTemperature();
humInde=bme_inde.readHumidity ();
pressureInde=bme_inde.readPressure();
Blynk.virtualWrite(V6,tempInde);
Blynk.virtualWrite(V7,humInde);
Blynk.virtualWrite(V8,pressureInde/100);
if
(tempInde > temp_min) // normal temp
{
pcf8574.digitalWrite(R2TL, HIGH);
Blynk.virtualWrite(V22, 0); // V23 viser lys slukket
}
else
{
pcf8574.digitalWrite(R2TL, LOW); // Tænder for varmen
Blynk.virtualWrite(V22, 255); // V23 viser lys tændt
}
if
(tempInde < temp_max) // For varmt
{
pcf8574.digitalWrite(R1TH, HIGH); // Tænder ventilator
pcf8574.digitalWrite(M1TL, LOW); // Lukker dør
pcf8574.digitalWrite(M1TH, HIGH); // Lukker dør
Blynk.virtualWrite(V21, 0);
}
else
if (tempInde+1 >= temp_max)
{
pcf8574.digitalWrite(R1TH, LOW); // Tænder varme
pcf8574.digitalWrite(M1TL, HIGH); // Åbner dør
pcf8574.digitalWrite(M1TH, LOW); // Åbner dør
Blynk.virtualWrite(V21, 255); // varme on
}
}
//**************Målinger inde jordfugtighed ********0,35 sec******************************
void inde_jordfugt()
{
adc3 = ads.readADC_SingleEnded(3);
soilValue = adc3/10;
soilValue = map(soilValue, 100,1800,100,0); //Mapping soilvalue
Blynk.virtualWrite(V12,soilValue);
if
((vanding_mem == 1)||(soilValue < fugt_min)) // vanding on
{
pcf8574.digitalWrite(R4SL, LOW); // vander
if(soilValue < fugt_min)
{Blynk.setProperty(V24, "color","#00ff00");} // Gul
else
{Blynk.setProperty(V24, "color","#0000ff");}
Blynk.virtualWrite(V24, 255); // V24 vander on}
}
else
{ pcf8574.digitalWrite(R4SL, HIGH);// vander
Blynk.virtualWrite(V24, 0); // V24 vander off
}
}
//*************Set time*************0,24 sec****************************
void clockDisplay()
{
sprintf(currentTime, "%02d:%02d:%02d", hour(), minute(), second());
sprintf(currentDate, "%02d:%02d:%02d", day(), month(), year());
Blynk.virtualWrite(V14, currentTime);
Blynk.virtualWrite(V15, currentDate);
}
//************Ultralyd*******0,11 sec*********************************
void UltraLyd()
{
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
ultra_afstand= duration*0.034/2;
Blynk.virtualWrite(V25, String(ultra_afstand,1));
}
//***************Strømmåling******0.13 sec******************************
void current()
{
adc0 = ads.readADC_SingleEnded(0);
Voltage1 = 10896 - adc0;
if (Voltage1 <0)
{Voltage1 = Voltage1 *-1;} // Lavet for usymetri i sinus f.eks. halvbølge
voltage_mem=map(Voltage1, 64,1500,1,2232);
//Voltage2 = voltage_mem + Voltage2;
{Blynk.virtualWrite(V26, voltage_mem);}
//{Blynk.virtualWrite(V27, Voltage2/3600);}
}
//***************Jord_temp********0.78 sec*****************************
void jord_temp()
{
sensors.requestTemperatures();
float jordTemp = sensors.getTempCByIndex(0);
Blynk.virtualWrite(V11,jordTemp);
}