Good day, I need to set the hysteresis and the setpoint for heating, namely, that from the app you can choose the setting(e.g. 25.4; 26.2) with which to compare temperature + hysteresis (e.g. 0.2). The problem is that the temperature I is compared with the integers I need floating.
1.Version blynk 0.4.8.
2.Android 2.17.0
3. Local server
4. Version server 0.28.8.
5. NODE MCU+dht22 1 device, NODE MCU + relay 2device.
6.All devices connected to the local server
7. Adrduino IDE 1.8.3
8.
the first device
#define BLYNK_PRINT Serial // Comment this out to disable prints and save space
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <SimpleTimer.h>
#include <DHT.h>
#define DHTPIN 12 //pin gpio 12 in sensor
#define DHTTYPE DHT22 // DHT 22 Change this if you have a DHT11
DHT dht(DHTPIN, DHTTYPE);
// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
char auth[] = "2";// Put your Auth Token here. (see Step 3 above)
WidgetBridge bridge1(V1);
SimpleTimer timer;
void setup()
{
Serial.begin(9600); // See the connection status in Serial Monitor
Blynk.begin(auth, "Region", "2", "", 8442); //insert here your SSID and password
// Setup a function to be called every second
timer.setInterval(1000L, sendUptime);
}
void sendUptime()
{
// You can send any value at any time.
// Please don't send more that 10 values per second.
//Read the Temp and Humidity from DHT
float h = dht.readHumidity();
float t = dht.readTemperature();
Blynk.virtualWrite(10, t); // virtual pin
Blynk.virtualWrite(11, h); // virtual pin
bridge1.virtualWrite(V16, t);
}
BLYNK_CONNECTED() {
bridge1.setAuthToken("5");
}
void loop()
{
Blynk.run();
timer.run();
}
the second device
/*****************************************
* V2.00 Баг фикс от 29.03.17
Автор: Обушенков Алексей Андреевич
Группа в ВК https://vk.com/engineer24
Канал на YouTube https://www.youtube.com/channel/UCih0Gcl9IEdkR8deDJCiodg
Инженерка Engineering room
Для возможности прошивки по сетевому порту,
необходимо установить последнюю версию python
Скачать по ссылке: https://www.python.org/downloads/
Это дает возможность прошивать по WiFi
*************Описание скетча*************
Time_Input_Two_in_one_day
Работа с виджетом Time_Input в приложении Blink
Суть такова что в одинь день можно установить два промежутка
Например Утром и Вечером когда наше устройство будет включено
хотя не обязательно, монжно использовать для разных дней недели.
Если будет потеряна связь с сервером Blynk, то реле выключится
*************Настройки Blynk*************
RTC widget (Пин не требуется!!!)
V1 : Manual/Auto Button
V2 : On/Off Button
Time Input widget on V5 (Утро) Morning
Button выбор Time Input Утро V7 Morning
Time Input widget on V6 (Вечер )Evening
Button выбор Time Input Утро V8 Evening
*****************************************
Используется ESP 8266
Реле подключаем к PIN 12 (D6 физически)
*/
#define BLYNK_PRINT Serial // Закомментировать этот параметр, чтобы отключить печать и сэкономить пространство
#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h> // Библиотека для OTA-прошивки
#include <BlynkSimpleEsp8266.h>
#include <SimpleTimer.h>
#include <TimeLib.h>
#include <WidgetRTC.h>
SimpleTimer timer_Connect;
SimpleTimer timer_ledflash;
SimpleTimer timer;
WidgetRTC rtc;
#define relay 12 // Реле подключаем к PIN 12 (D6 физически)
// переменные для мигалки
const int ledPin = 16; // номер выхода, подключенного к светодиоду
int ledState = LOW; // этой переменной устанавливаем состояние светодиода
long previousMillis = 0; // храним время последнего переключения светодиода
long interval = 1000; // интервал между включение/выключением светодиода (1 секунда)
uint16_t value,valuet,valueta,pinData;
char auth[] = ""; //код авторизации
char ssid[] = ""; // Название твоей WiFi сети.
char pass[] = ""; // Пароль твоей WiFi сети.
long startsecondswd; // день недели время начала в секундах
long stopsecondswd; // день недели время остановки в секундах
long nowseconds; // время в секундах
bool isFirstConnect = true; // переменная для хранения информации первый ли раз приконектились (после полного отключения питания)
int manual = 0; // статус режима Ручной
int oldstatus; // статус последнего выбраного режима в Автоматическом режиме
int Morning; // статус Button V7 режим Утро (то есть учитывать TimeInput V5)
int Evening; // статус Button V8 режим Вечер (то есть учитывать TimeInput V6)
int Morningstatus = 0; // статус TimeInput Утро (на выходе функции 0 или 1) ON/OFF реле (нужно для функции resetRelay)
int Eveningstatus = 0; // статус TimeInput Утро (на выходе функции 0 или 1) ON/OFF реле (нужно для функции resetRelay)
BLYNK_CONNECTED() {
if (isFirstConnect) {
Blynk.syncAll(); // синхронизируемся
Blynk.notify("Timer STARTING!!!!"); // выводим PushUp сообщение
isFirstConnect = false;
}
}
BLYNK_WRITE(V15)
{
value = param.asInt();
}
BLYNK_WRITE(V17)
{
valuet = param.asInt();
}
BLYNK_WRITE(V16)
{
pinData = param.asInt();
}
BLYNK_WRITE(V18)
{
valueta = param.asInt();
}
void activetoday() { // проверяем, если график должен работать сегодня
if (year() != 1970) {
if (Morning == 1) {
Blynk.syncVirtual(V5); // синхронизируем виджет timeinput
}
if (Evening == 1) {
Blynk.syncVirtual(V6); // синхронизируем виджет timeinput
}
}
}
/* Здесь мы сохраняем в переменную oldstatus, порядковый номер,
включенного Автоматического состояния в последний раз */
void checklastbuttonpressed () {
if ((Morning == 1) && (Evening == 0)) {
oldstatus = 1;
}
if ((Morning == 0) && (Evening == 1)) {
oldstatus = 2;
}
if ((Morning == 1) && (Evening == 1)) {
oldstatus = 3;
}
if ((Morning == 0) && (Evening == 0)) {
oldstatus = 4;
}
}
/* Здесь мы соответственно возращаем включенное Автоматическое
состояние используя значение сохраненное в переменной oldstatus*/
void restorelastbuttonpressed () {
if (oldstatus == 1) {
Morning = 1;
Blynk.virtualWrite(V7, 1);
}
if (oldstatus == 2) {
Evening = 1 ;
Blynk.virtualWrite(V8, 1);
}
if (oldstatus == 3) {
Evening = 1;
Morning = 1;
Blynk.virtualWrite(V7, 1);
Blynk.virtualWrite(V8, 1);
}
if (oldstatus == 4) {
Morning = 0;
Evening = 0;
Blynk.virtualWrite(V7, 0);
Blynk.virtualWrite(V8, 0);
}
}
BLYNK_WRITE(V1) // Manual/Auto selection
{
if (param.asInt() == 1) {
manual = 1; // Ручной режим включить
checklastbuttonpressed ();
Morning = 0;
Evening = 0;
Blynk.virtualWrite(V7, 0);
Blynk.virtualWrite(V8, 0);
} else {
restorelastbuttonpressed ();
manual = 0; // Ручной режим выключить, включить автоматический режим
}
}
/*
* Эту функцию мы вызываем когда включаем один из таймеров
* Переключаем кнопку Auto/Manual в режим Auto
* Переключаем кнопку On/Off в режим Auto
* Выключаем реле
*/
void resetManual()
{
Blynk.virtualWrite(V1, 0); //Отключить ручной режим
Blynk.virtualWrite(V2, 0); //Выключить устройство
manual = 0;
digitalWrite(relay, LOW); // Off реле
}
/*
Здесь мы проверяем в каком режиме находится система, в момент нажатия кнопки ON - OFF,
в Автоматическом или Ручном режиме.
И автоматически переводим в ручной режим и запоминаем состаяние Автоматического режима.
Или просто включаем и выключаем выходное устройство
*/
BLYNK_WRITE(V2) // ON-OFF Manual
{
if (param.asInt() == 1) { // кнопка изменила состояние на 1
if (manual == 0) { //Система была в Автоматическом режиме
checklastbuttonpressed ();
manual = 1;
Morning = 0;
Evening = 0;
Blynk.virtualWrite(V1, 1);
Blynk.virtualWrite(V7, 0);
Blynk.virtualWrite(V8, 0);
digitalWrite(relay, HIGH); // ON реле
Blynk.virtualWrite(V2, 1); //Включение кнопки виджета Ручное управление
} else { //Система была в Ручном режиме
Morning = 0;
Evening = 0;
Blynk.virtualWrite(V1, 1);
Blynk.virtualWrite(V7, 0);
Blynk.virtualWrite(V8, 0);
digitalWrite(relay, HIGH); // ON реле
Blynk.virtualWrite(V2, 1); //Включение кнопки виджета Ручное управление
}
} else { // кнопка изменила состояние на 0
if (manual == 0) { //Система была в Автоматическом режиме
checklastbuttonpressed ();
manual = 1;
Morning = 0;
Evening = 0;
Blynk.virtualWrite(V1, 1);
Blynk.virtualWrite(V7, 0);
Blynk.virtualWrite(V8, 0);
digitalWrite(relay, LOW); // OFF реле
Blynk.virtualWrite(V2, 0); //Выключение кнопки виджета Ручное управление
} else { //Система была в Ручном режиме
Morning = 0;
Evening = 0;
Blynk.virtualWrite(V1, 1);
Blynk.virtualWrite(V7, 0);
Blynk.virtualWrite(V8, 0);
digitalWrite(relay, LOW); // OFF реле
Blynk.virtualWrite(V2, 0); //Выключение кнопки виджета Ручное управление
}
}
}
BLYNK_WRITE(V5)//Morning Time Input
{
if (Morning == 1) {
TimeInputParam t(param);
int dayadjustment = -1;
if (weekday() == 1) {
dayadjustment = 6; // Это нужно для определения воскресенья. Воскресенье в RTC это 1, а в Blynk 7
}
// В библиотеке RTC неделя начинается в воскресенье, а в Blynk в понедельник
// Эта конструкция проверяет выбран ли сегодня день номер такой то
if (t.isWeekdaySelected(weekday() + dayadjustment)) {
nowseconds = ((hour() * 3600) + (minute() * 60) + second());
startsecondswd = (t.getStartHour() * 3600) + (t.getStartMinute() * 60);
//Serial.println(startsecondswd); // used for debugging
if (nowseconds >= startsecondswd) {
if (nowseconds <= startsecondswd + 90) { //код для того что бы точно отправить сигнал на реле (90s on 60s timer ensures 1 trigger command is sent)
Morningstatus = 1; // код что бы переключить реле в ON
}
}
stopsecondswd = (t.getStopHour() * 3600) + (t.getStopMinute() * 60);
//Serial.println(stopsecondswd); // used for debugging
if (nowseconds >= stopsecondswd) {
Morningstatus = 0; // OFF реле
if (nowseconds <= stopsecondswd + 90) { //код для того что бы точно отправить сигнал на реле (90s on 60s timer ensures 1 trigger command is sent)
Morningstatus = 0; // код что бы переключить реле в OFF
}
}
else {
if (nowseconds >= startsecondswd) {
Morningstatus = 1; // ON реле
}
}
} else {Morningstatus = 0;}
} else {Morningstatus = 0;}
}
BLYNK_WRITE(V6)//Evening Time Input
{
if (Evening == 1) {
TimeInputParam t(param);
int dayadjustment = -1;
if (weekday() == 1) {
dayadjustment = 6; // Это нужно для определения воскресенья. Воскресенье в RTC это 1, а в Blynk 7
}
// В библиотеке RTC неделя начинается в воскресенье, а в Blynk в понедельник
// Эта конструкция проверяет выбран ли сегодня день номер такой то
if (t.isWeekdaySelected(weekday() + dayadjustment)) {
nowseconds = ((hour() * 3600) + (minute() * 60) + second());
startsecondswd = (t.getStartHour() * 3600) + (t.getStartMinute() * 60);
//Serial.println(startsecondswd); // used for debugging
if (nowseconds >= startsecondswd) {
if (nowseconds <= startsecondswd + 90) { //код для того что бы точно отправить сигнал на реле (90s on 60s timer ensures 1 trigger command is sent)
Eveningstatus = 1; // код что бы переключить реле в ON
}
}
stopsecondswd = (t.getStopHour() * 3600) + (t.getStopMinute() * 60);
//Serial.println(stopsecondswd); // used for debugging
if (nowseconds >= stopsecondswd) {
Eveningstatus = 0; // OFF реле
if (nowseconds <= stopsecondswd + 90) { //код для того что бы точно отправить сигнал на реле (90s on 60s timer ensures 1 trigger command is sent)
Eveningstatus = 0; // код что бы переключить реле в OFF
}
}
else {
if (nowseconds >= startsecondswd) {
Eveningstatus = 1; // ON реле
}
}
} else {Eveningstatus = 0;}
} else {Eveningstatus = 0;}
}
BLYNK_WRITE(V7) // Утро выбрано Button Morning selected
{
if (param.asInt() == 1) { //&& (V1 == 1)
timer.setTimeout(50, resetManual);
timer.setTimeout(50, checklastbuttonpressed);
Morning = 1;
} else {
Morning = 0;
// синхронизируемся с виджетом, благодаря этому
// обнавляется информация что на выходе Morning Time Input
Blynk.syncVirtual(V5);
}
}
BLYNK_WRITE(V8) // Вечер выбран Button Evening selected
{
if (param.asInt() == 1) { //&& V1 == 1
timer.setTimeout(50, resetManual);
timer.setTimeout(50, checklastbuttonpressed);
Evening = 1;
} else {
Evening = 0;
// синхронизируемся с виджетом, благодаря этому
// обнавляется информация что на выходе Evening Time Input
Blynk.syncVirtual(V6);
}
}
void reconnectBlynk() {
if (!Blynk.connected()) {
if (Blynk.connect()) {
BLYNK_LOG("Reconnected");
} else {
BLYNK_LOG("Not reconnected");
}
}
}
// эту функцию мы дергаем каждые 10 секунд и проверяем условия
// включить или выключить выходное устройство
// или можно прописать разрешениена работу, например терморегулятора.
void resetRelay()
{
if (Blynk.connected()){ // проверяем есть ли связь с сервером если есть, то работаем если нет то отключаем реле
if (manual == 0) // проверяем включен ли Автоматический режим
{
if (Evening == 1 || Morning == 1) // проверяем активен или нет хоть один таймер
{
// проверяем что на выходе Morning или Evening Time Input
if (Morningstatus == 1 || Eveningstatus == 1){
if (pinData >= value)
{digitalWrite(relay, HIGH); // set LED ON
Blynk.virtualWrite(V2, 1);}
else if (pinData <= value )
{digitalWrite(relay, LOW);
Blynk.virtualWrite(V2, 0);}
} else {// код что бы переключить реле в OFF
if (pinData >= valuet)
{digitalWrite(relay, HIGH); // set LED ON
Blynk.virtualWrite(V2, 1);}
else if (pinData <= valuet )
{digitalWrite(relay, LOW);
Blynk.virtualWrite(V2, 0);}
}
} else {// код что бы переключить реле в OFF
if (pinData >= valuet)
{digitalWrite(relay, HIGH); // set LED ON
Blynk.virtualWrite(V2, 1);}
else if (pinData <= valuet )
{digitalWrite(relay, LOW);
Blynk.virtualWrite(V2, 0);}
}
}
}
}
// Просто мигалка что бы видеть есть ли зависания
// во время попытки установить связь с WiFi
void ledflash ()
{
// Просто мигалка
unsigned long currentMillis = millis();
//проверяем не прошел ли нужный интервал, если прошел то
if(currentMillis - previousMillis > interval) {
// сохраняем время последнего переключения
previousMillis = currentMillis;
// если светодиод не горит, то зажигаем, и наоборот
if (ledState == LOW)
{ledState = HIGH;
Serial.println(currentMillis);
}
else
{ ledState = LOW;
Serial.println(currentMillis);
}
digitalWrite(ledPin, ledState);
}
}
void setup()
{
// Следующие три строки для прошивки по воздуху
ArduinoOTA.setHostname("ESP8266-00001"); // Задаем имя сетевого порта
//ArduinoOTA.setPassword((const char *)"0000"); // Задаем пароль доступа для удаленной прошивки
ArduinoOTA.begin(); // Инициализируем OTA
//Конфигурируем выхода
pinMode(ledPin, OUTPUT);
pinMode(relay, OUTPUT);
digitalWrite(relay, LOW); // set LED OFF
timer_ledflash.setInterval(50L, ledflash); // каждые 50 милисекунд, проверяем состояние функции Ledflash
timer_Connect.setInterval(30000L, reconnectBlynk); // проверяем каждые 30 секунд, если все еще подключен к серверу
Serial.begin(115200);
Serial.println("\Starting");
///Blynk.begin(auth, ssid, pass,);
// Обычно мы пользуемся конструкцией сверху, но из
// за нее зависает ESP8266 при попытке установить WiFi соединение
Blynk.config(auth,);
Blynk.disconnect(); //разорвать соединение
Blynk.connect(); // а потом пробуем уже конектиться
rtc.begin(); // запускаем Часы Реального Времени (виджет Blynk)
timer.setInterval(10000L, activetoday); // проверяем каждые 10 секунд, если график Time Input должен работать сегодня
timer.setInterval(1000L, resetRelay); // проверяем каждую 1 секунду, что на выходе функции resetRelay включить или выключить реле?
}
void loop()
{
ArduinoOTA.handle(); // Всегда готовы к прошивке
timer_ledflash.run();
timer_Connect.run();
//Blynk.run();
if (Blynk.connected()) {
Blynk.run();
timer.run();
}
}
- Huawei honor8
- Cannot compare floating point numbers, only integers. I need for example the current temperature(25.3) > setpoint 24.2 - 0.2 hysteresis = relay on and Vice versa. In fact it turns out the current temperature of 25 > 24 - 1 = relay on.