• Система автоматизации с открытым исходным кодом на базе 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??
 
Сверху Снизу