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

esp12-f PWM для MH-Z19

PavelR1

New member
Добрый день!

Есть esp12-f и MH-Z19. Хочу соединить их по PWM.
собрал nodemcu-master с PWM

подключил вывод 9 (PWM) MH-Z19 к PIN1 (GPIO5) на esp8266
как прочитать данные PWM c датчика?

Прошу помощи.
 

PavelR1

New member
Первая ссылка соединяет по uart через дополнительную библиотеку. Хотелось бы все таки по ШИМ.
А вторая с кодом для ардуино.
Обе статьи классные но чуть чуть не то.
ПС.
Сложность это сама простота изложенная подробно (с).
 

Сергей_Ф

Moderator
Команда форума
@PavelR1 вторая статья показывает как считать PWM. Разве Вы не это хотели? Только на esp Вам придется озаботиться гарантированным отсутствием обработки wifi в это время, иначе считаете чушь. Дерзайте.
 

PavelR1

New member
Если кому надо:

на Pin 0 светодиод. он помигивает в такт с единицей с датчика СО2
на Pin 5 PWM от mh-z19 ВНИМАНИЕ у меня стабильно заводится схема только если этот pin на esp12-f заземлить резистором 10к.

gpio.mode(0, gpio_OUTPUT)

tm=0
th=0
tl=0
ts=0
t11=0
t00=0
tss=0
ppm=0

gpio.mode(5,gpio.INT,gpio.PULLUP)
gpio.trig(5, "both",function(level) -- вешаем триггер на pin 5. Будем по каждому фронту фиксировать время с таймера
tm=tmr.now()
if tmr.now()-tm<0 then tm=tm+2147483647 end

if gpio.read(5) == 1 then -- если сигнал единица, то период до нее был нулем.
th=tmr.now()
--print ("th="..th.."");
t0=th-tl;
if (t0-(t0/1000*1000)) > 500 then t00=(t0/1000+1) else t00=(t0/1000) end --округляем до целого значения, приводим в мс
-- print ("t0="..t0.." t00="..t00.."" );
gpio.write(0, gpio.HIGH)
end
if gpio.read(5) == 0 then
tl=tmr.now()
-- print ("tl="..tl.."");
t1=tl-th;
if (t1-(t1/1000*1000)) > 500 then t11=(t1/1000+1) else t11=(t1/1000) end
-- print ("t1="..t1.." t11="..t11.."");
ts=(t1+t0);
if (ts-(ts/1000*1000)) > 500 then tss=(ts/1000+1) else tss=(ts/1000) end
---print ("ts="..ts.." tss="..tss.."");
print ("");
ppm=5000*(t11-2)/(t11+t00-4); --в даташите почему то стоит множитель 2000, но это явно ошибка. должно быть 5000.
print ("ppm="..ppm.." ("..tss.."="..t11.."+"..t00..")");
print ("");
gpio.write(0, gpio.LOW)
end
end)

код прекрасно работает и не зависит от wi-fi. Кстати есть значение tss которое равняется 1004 мс - по нему можно проверять корректность данных. Если true то верить.
* код не причесывал, не пинайте за кривизну.
 
Последнее редактирование:

Ed007

New member
Попробовал скетч @PavelR1 - прекрасно работает, добавил еще отправку на thingspeak. Что б мигал синий светик надо в трех местах заменить gpio 0 на 4 (на 4м пине он сидит). Ну и в самой первой строке надо gpio.output (точка).
Правда как этот скетч работает построчно я понять не могу, хотелось бы. Например как понять строку
if tmr.now()-tm<0 then tm=tm+2147483647 end
и что это за гиганское число.
Как добавить проверку корректности (tss=1004ms)
 
Сверху Снизу