• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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 часов независимо от того открыта страница в браузере или нет все работает без ошибок. Всем спасибо за помощь
 
Сверху Снизу