Okay, there is my final code. It stops working!!!
Everything is good, the hardware continue working without Blynk, but it won’t connect to Blynk if you will not reboot the hardware.
Code:
#include <BlynkSimpleUIPEthernet.h>
const char AUTH[] = "ba2024ad11874d1d8e73cfbcf9b1fde0"; // токен для ethernet
BlynkTimer temp_timer;
BlynkTimer online_signal_timer;
BlynkTimer protection_signal_timer;
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS A5
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress floor1_temp_sensor = {0x28, 0xFF, 0xCE, 0xD0, 0x01, 0x17, 0x05, 0xDF};
DeviceAddress floor2_temp_sensor = {0x28, 0xFF, 0x09, 0xD0, 0x01, 0x17, 0x05, 0xAC};
DeviceAddress podacha_temp_sensor = {0x28, 0x41, 0x0F, 0x43, 0x98, 0x18, 0x00, 0xCC};
DeviceAddress obratka_temp_sensor = {0x28, 0x57, 0x20, 0x43, 0x98, 0x25, 0x00, 0x16};
DeviceAddress radiator_temp_sensor = {0x28, 0xFF, 0xEC, 0xCE, 0x01, 0x17, 0x05, 0x89};
#define protection_pin_1 10
#define protection_pin_2 11
#define heater 12
#define radiator_temp_VP V0
#define temp1_VP V1
#define temp2_VP V2
#define podacha_temp_VP V3
#define obratka_temp_VP V4
#define delta_VP V5
#define mode_VP V6
#define heater_led_VP V7
#define online_led_VP V8
WidgetLED heater_led(heater_led_VP);
WidgetLED online_led(online_led_VP);
const byte PERIOD = 10; // heating period in minutes
const byte AVERAGE_FACTOR = 5; // if 0 - don't average values
/* TIME_MULTIPLIER corrects the time counting
* 60000 - in minutes
* 1000 - in seconds
* 1 - in millis
*/
const unsigned long TIME_MULTIPLIER = 60000;
unsigned long end_time; // in millis
float radiator_temp;
float floor1_temp;
float floor2_temp;
float podacha_temp;
float obratka_temp;
byte mode;
byte heater_system_delta;
bool heater_state;
BLYNK_WRITE(delta_VP)
{
byte delta = param.asInt();
heater_system_delta = delta;
}
BLYNK_WRITE(mode_VP)
{
byte new_mode = param.asInt();
mode = new_mode;
end_time = 0; // for re-count in function
heater_state = false;
}
void setup() {
// put your setup code here, to run once:
pinMode(protection_pin_1, OUTPUT);
pinMode(protection_pin_2, OUTPUT);
pinMode(heater, OUTPUT);
sensors.begin();
sensors.setResolution(radiator_temp_sensor, 11);
sensors.setResolution(floor1_temp_sensor, 11);
sensors.setResolution(floor2_temp_sensor, 11);
sensors.setResolution(podacha_temp_sensor, 11);
sensors.setResolution(obratka_temp_sensor, 11);
sensors.setWaitForConversion(false); // make reading NON blocking
sensors.requestTemperatures(); // start conversion for first reading
Blynk.begin(AUTH);
Blynk.notify("Я включился! Видимо, не было электричества.");
Blynk.syncAll();
temp_timer.setInterval(1500L, tempRoutine);
protection_signal_timer.setInterval(750L, protectionSignalSender);
online_signal_timer.setInterval(5000L, onlineSignalSender);
}
void loop() {
Blynk.run();
temp_timer.run();
protection_signal_timer.run();
online_signal_timer.run();
}
void tempRoutine() {
tempCheckerAndSender();
heaterController();
}
void tempCheckerAndSender() {
floor1_temp = averageFilter(sensors.getTempC(floor1_temp_sensor), floor1_temp);
floor2_temp = averageFilter(sensors.getTempC(floor2_temp_sensor), floor2_temp);
podacha_temp = averageFilter(sensors.getTempC(podacha_temp_sensor), podacha_temp);
obratka_temp = averageFilter(sensors.getTempC(obratka_temp_sensor), obratka_temp);
radiator_temp = averageFilter(sensors.getTempC(radiator_temp_sensor), radiator_temp);
sensors.requestTemperatures();
Blynk.virtualWrite(temp1_VP, floor1_temp);
Blynk.virtualWrite(temp2_VP, floor2_temp);
Blynk.virtualWrite(podacha_temp_VP, podacha_temp);
Blynk.virtualWrite(obratka_temp_VP, obratka_temp);
Blynk.virtualWrite(radiator_temp_VP, radiator_temp);
}
void onlineSignalSender() {
static bool parity;
online_led.setValue(parity * 255);
parity = !parity;
}
void protectionSignalSender() {
byte pin;
static bool parity;
// choose a pin to send the data
if (parity) {
pin = protection_pin_1;
}
else {
pin = protection_pin_2;
}
// send short signal
digitalWrite(pin, random(0, 2)); // send a random signal
parity = !parity;
}
void heaterController() {
if (mode == 0) {
heater_state = false;
}
else {
unsigned long time_on = mode * TIME_MULTIPLIER;
unsigned long time_off = (PERIOD * TIME_MULTIPLIER) - time_on;
if (time_off == 0) {
heater_state = true;
}
else {
if (millis() > end_time) {
heater_state = !heater_state;
if (heater_state) {
end_time = millis() + time_on;
}
else {
end_time = millis() + time_off;
}
}
}
}
digitalWrite(heater, heater_state);
heater_led.setValue(heater_state * 255);
}
float averageFilter (float new_val, float old_avg) {
if (AVERAGE_FACTOR > 0) {
return (old_avg * (AVERAGE_FACTOR - 1) + new_val) / AVERAGE_FACTOR;
}
else {
return new_val;
}
}```
Some ideas?
@gunner, can you help me too?