• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Помогите со значениям float NODE MCU

Sergey0001

New member
Добрый день, помогите добрые люди. Сделал терморегулятор на dht22+node mcu+ blynk, два устройства одно с dht22 считывает температуру и отправляет на второе устройство с реле. Все работает, всё хорошо, НО регулирование температуры идёт в 1 градус, т.е. уставка выставляется 25.6, 25.8, а по факту срабатывает при 25, 26, 27(десятичные значения не учитывает, хотя использую float). Помогите с доработкой скейтча, чтобы температура регулировалась с шагом, например 0,2,а не 1,2,3.
Думаю проблема с переменными float, а как знаки после запятой использовать не знаю.

Скейтч 1 устр.

#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[] = "";// 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, "1", "1", ""); //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(""); // Сюда пишем Токен Первого устройства
}

void loop()
{
Blynk.run();
timer.run();
}


2устр.

BLYNK_WRITE(V15)
{
value = param.asFloat();
}
BLYNK_WRITE(V17)
{
valuet = param.asFloat();
}
BLYNK_WRITE(V16)
{
pinData = param.asFloat();
}
BLYNK_WRITE(V18)
{
valueta = param.asFloat();

}



if (Morningstatus == 1 || Eveningstatus == 1){
if (pinData < value+0.2)
{digitalWrite(relay, HIGH); // set LED ON
Blynk.virtualWrite(V2, 1);}
else if (pinData > value -0.2 )
{digitalWrite(relay, LOW);
Blynk.virtualWrite(V2, 0);}
} else {// код что бы переключить реле в OFF
if (pinData < valuet+0.2)
{digitalWrite(relay, HIGH); // set LED ON
Blynk.virtualWrite(V2, 1);}
else if (pinData > valuet-0.2 )
{digitalWrite(relay, LOW);
Blynk.virtualWrite(V2, 0);}

}
} else {// код что бы переключить реле в OFF
if (pinData < valuet+0.2)
{digitalWrite(relay, HIGH); // set LED ON
Blynk.virtualWrite(V2, 1);}
else if (pinData > valuet-0.2 )
{digitalWrite(relay, LOW);
Blynk.virtualWrite(V2, 0);}

}

}
 

AndrF

Active member
Думаю проблема с переменными float, а как знаки после запятой использовать не знаю.
Float лучше не использовать - к чему оно вам? Умножьте температуру на 10 и с полученным значением работайте. Вам же будет проще.

P.S
Если регулируется температура в комнате, то точность до десятых ни к чему. Дискретности в градус за глаза хватит.
 

Sergey0001

New member
Для меня важно десятые, просто я не понимаю что мне даст умножение, если к примеру значение температуры отображаемое на экране в blynk = 25,3 я умножу на 10, результат будет 250, а не 253.
 

gerkimuyda

New member
P.S Если регулируется температура в комнате, то точность до десятых ни к чему. Дискретности в градус за глаза хватит.
Ну не скажите, разница в один градус у меня дома телом хорошо чувствуется. На стенке висит польский электронный термостат, с дискретностью 0.2, имеет "ночной" и "дневной" установленные режимы с различием в 0.2 - 0.4 градуса - эти режимы тоже чувствуются. А с теплым полом (большой инертностью) дискретность в 1.0 градус даст бешеный гистерезис всей системы.
 

Sergey0001

New member
Чего ради 250? Как вы умножаете-то?
if ((pinData*10 - valuet*10) < 3.0)
{digitalWrite(relay, HIGH); // set LED ON
Blynk.virtualWrite(V2, 1);}
else if ((pinData*10 - valuet*10) > 3.0)
{digitalWrite(relay, LOW);
Blynk.virtualWrite(V2, 0);}
pinData- текущая температура с dht22.
valuet и valueta - задаю уставку с приложения.
Например: pinData = 25,3; valuet 25.9. Срабатывание реле происходит либо при 24.9, либо при 26.0, т.е. воспринимает как целое число 25.
 

Sergey0001

New member
if (pinData < (value+0.2)) Так пробовали ?
Нет так тоже не работает, я думаю дело тут в присвоении переменной
BLYNK_WRITE(V15)
{
value = param.asFloat();
}
BLYNK_WRITE(V17)
{
valuet = param.asFloat();
}
BLYNK_WRITE(V16)
{
pinData = param.asFloat();



может я неправильно присваиваю переменную float??
 
Сверху Снизу