• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Решено esp8266 и 2 dht22

alexandrr

New member
День добрый.
Собрал простую схемку с nodemcu и двумя датчиками dht22.
Планирую использовать для управления газовым котлом. Датчики (один в помещении, второй на улице) меряют температуру и влажность, по определенной формуле рассчитывается целевая температура котла и соответственно котел включается или отключается. (датчик для котла ds18b20 еще не пришел, поэтому в скетче t-котла пока указываю явно, чисто для теста)
Проблема в том, что периодически возникает ошибка чтения показаний с какого - либо из dht22, хотя в тестовом скетче даже при уменьшении периода опроса датчиков до 1 секунды никаких проблем с этим нет.
Понимаю что разбираться в чужом коде дело неблагодарное, но может кто подскажет куда копать?
 

Jury_78

New member
Можно же в случае ошибки опрашивать повторно. Тем более, что в случае однокртного опроса это данные предыдущего измерения.
 

alexandrr

New member
Можно же в случае ошибки опрашивать повторно. Тем более, что в случае однокртного опроса это данные предыдущего измерения.
Это понятно конечно, просто сам факт такой ошибки меня немного напрягает, все таки это будет управление газовым котлом будет:)
Кстати, сейчас нашел вот такое :используйте для инициализации следующие параметры DHT dht(DHTPIN,DHTTYPE,15)
что за 15 в строке инициализации?
 

Jury_78

New member
Это понятно конечно, просто сам факт такой ошибки меня немного напрягает, все таки это будет управление газовым котлом будет:)
Кстати, сейчас нашел вот такое :используйте для инициализации следующие параметры DHT dht(DHTPIN,DHTTYPE,15)
что за 15 в строке инициализации?
Я использую LUA, датчик один и ошибок пока не было. С OPi PC такое было, но там понятно, Linux может прервать опрос.
 

Юрий Ботов

Moderator
Команда форума
Вообще-то для управления объектами связанными с безопасностью жизнедеятельности при помощи wifi - это не то что-бы дурной тон... это в принципе недопустимо из вашей же безопасности. И вопрос не в конкретном оборудовании, а в ... помехах, ошибках проприетарном коде, которого вы не видите, севшей батарейке... В системах чье неверное поведение может быть реально опасно - провода и только провода.
 

Nercs

New member
День добрый.
Проблема в том, что периодически возникает ошибка чтения показаний с какого - либо из dht22, хотя в тестовом скетче даже при уменьшении периода опроса датчиков до 1 секунды никаких проблем с этим нет.
Понимаю что разбираться в чужом коде дело неблагодарное, но может кто подскажет куда копать?
Копать в сторону задержки между опросами датчика. У меня такое было, сделал delay(200).
Потом кол-во ложных показаний снизилось, но ещё было. Придумал такую штуку:

читаем t1 = readtemp...
delay(200)
читаем t2 = readtemp
if t1 == t2 -> t=t1
else t = readtemp

То же с влажностью. Вобщем дело в том что датчик не успевает прочитать показания.
 

nikolz

Well-known member
Я бы Вам рекомендовал переписать всю логику вашей программы.
Я уже приводил пример основной программы на луа ( в том числе и на этом форуме) для работы с любыми датчиками.
В общем случае она должна иметь примерно такой вид(рабочая программа двухлетней давности):
-------------------
Код:
pds=1;pam=2; scl=4; oss=0;T0=0;TM=0; adT={}
gpio.mode(pam, gpio.OUTPUT); gpio.write(pam, gpio.HIGH)
--DS18B20--AM2302--BMP180(SCL,SDA=SCL+1)
--TM=tmr.now();print(tmr.now()-TM);
local ae={{96,209,111,6,0,0,149},{199,186,111,6,0,0,45}}
------1--2--3--4-5--6-7--8-9-10-11-12-13-14-
TD={3,0,0,0,2,0,0,4,0,0, 0,0,1, 0};
ssid,pwd="alive","k8T0px1a"; port=9991
--print("open="..T2-T1..",load="..T3-T2..",run="..T4-T3..",del="..T5-T4..",всего="..T5-T1.."\n")
--open=264387,load=53946,run=347933,del=86,всего=666352
--T1=tmr.now();
dofile("nk_start.lc") -- dofile=603200
gpio.mode(3,gpio.INPUT)
--print(1);
---------------------
function cb()
--T1=tmr.now()-T1;
collectgarbage()
--print("1,"..node.heap());
T0=T0+1; --номер датчика
if gpio.read(3)==0 then node.restart(); end;
--T1=tmr.now();
dofile('nkDS.lc');
--T2=tmr.now()-TM;
m=6 -- номер позиции в таблице результатов для данного датчика
dofile('cb2302.lc');
--print("2,"..node.heap());
m=9 -- номер позиции в таблице результатов для данного датчика
dofile('get_tp.lc');
--print("3,"..node.heap());
--T4=tmr.now()-TM;
m=14 -- номер позиции в таблице результатов для данного датчика
TD[m]=adc.read(0);
--print("4,"..node.heap());
--sk:on("receive", function(sck,p) print(p) end )
--TM=math.floor(0.001*(tmr.now()-TM));
--sk:send(ss,function(s) end); sk:close(); sk=nil; end )
---local sk=net.createConnection(net.TCP,0)sk:connect(9992,"192.168.0.108")sk:on("connection",WF)
-- a udp client
cu:connect(9992,"192.168.0.108");
cu:send(T0..';4;'..table.concat(TD,";")..';'..node.heap())--..",T1="..T1)
--T1=tmr.now();
--T1=math.floor(0.001*(tmr.now()-T1));
--print(T0..';4;'..table.concat(TD,";")..';'..node.heap());
end
tmr.alarm(1,2000,1,cb)
------------------------------
Т е она состоит из трех основных блоков
1) инициализация датчиков и WIFI
2) колбек таймера function cb()
3)запуск таймера tmr.alarm(1,2000,1,cb)
-----------------------
В отличии от вашего решения, в моем процессор ничего не делает в период счета таймера и лишь по заданному интервалу опрашивает датчики формирует ответ и отсылает.
-----------------------------
 

alexandrr

New member
в общем, внес задержки между опросами датчиков, получил всего две ошибки при 12 тысяч опросов за 3 суток. Ну и попробую переписать чтобы функция опроса датчиков вызывалась по интервалу, действительно меньше загружен процессор будет.

upd: заметил сейчас - когда в браузере открыта страница настроек - ошибки снова копятся :( Не так критично как раньше, но все равно неприятно
 

alexandrr

New member
В общем, похоже разобрался.
Как говорится сам дурак: питал датчики от 3,3 Вольта с платы esp, переделал питание на 5 вольт, сделал вызов процедуры опроса по интервалу, в результате за последние 5 часов независимо от того открыта страница в браузере или нет все работает без ошибок. Всем спасибо за помощь
 
Сверху Снизу