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

Help with value float!

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();
 }
}




  1. Huawei honor8
  2. 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.

@Sergey1 please allocate your post to a category. Read the first 4 or 5 and last 4 or 5 posts of this thread Blynk for Beginners and help with your project

@Sergey1 I am unsure how we will be able to assist you when It seems you are unable to follow the basic directions as requested…

I have set your category and formatted your code this time. However, if you do not learn how to do these basic things, then I fear you may be left on your own for the rest of your questions as well.

Blynk - FTFC