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