Скрыть объявление
На нашем форуме недоступен просмотр изображений для неавторизованных пользователей. Если Вы уже зарегистрированы на нашем форуме, то можете войти. Если у Вас еще нет аккаунта, мы будем рады, если Вы к нам присоединитесь. Зарегистрироваться Вы можете здесь.

Нужна помощь ESP8266 CH340 NodeMcu V3 Lua+MH-Z19B подключение по PWM.

Тема в разделе "Раздел для начинающих", создана пользователем SSS_Viva, 17 дек 2018.

  1. SSS_Viva

    SSS_Viva Новичок

    Сообщения:
    36
    Симпатии:
    2
    Доброго дня.
    Может есть у кого опыт подключения MH-Z19B с использованием PWM и реализации получения данных на LUA?
    Два дня борюсь, и толку 0.
    Датчик подключен в выводу D3.
    Нашёл два подобных проекта, пробовал из них почерпнуть информацию, тоже не помогло, буду благодарен за любую помощь.
    P.S. По UART не подключить, занят.
     
  2. SSS_Viva

    SSS_Viva Новичок

    Сообщения:
    36
    Симпатии:
    2
    Пока вот что получилось, но результат не очень.
    Код (Lua):
    1.  gpio.mode(3, gpio.INPUT)
    2.  
    3.     local h = 0
    4.     local l = 0
    5.     local th = 0
    6.     local tl = 0
    7.  
    8.     local function pin3cb(level)
    9.     local tt = tmr.now()/1000;
    10.  
    11. if level == 1 then
    12.  
    13.       h = tt;
    14.       tl = h - l;
    15.       ppm = 5000 * (th - 2) / (th + tl - 4)
    16.      print("pp0",ppm)
    17.    
    18. else
    19.       l = tt;
    20.       th = l - h;
    21.       ppm = 5000 * (th - 2) / (th + tl - 4)
    22.      print("pp2",ppm)
    23. end
    24.  
     
  3. nikolz

    nikolz Гуру

    Сообщения:
    5.350
    Симпатии:
    473
    есть такая штука в столе.
    для информации
    Тёмная сторона MH-Z19
    bertrik/mhz19
    -----------------------------------
    popstas/nodemcu-co2-temp-hum-grafana
    ------------------------------
    используйте PWM output
    согласно документации длительность импульса пропорциональна концентрации
    начинает от 2 мs и до 1004 мс для диапазона 0-2000 ppm
    ---------------------------
    таким образом в этом режиме вешаете на любой пин и измеряете длительность импульса либо прямым счетом либо через прерывание
    -----------------------------
     
    Последнее редактирование: 17 дек 2018
  4. nikolz

    nikolz Гуру

    Сообщения:
    5.350
    Симпатии:
    473
    это явно не то
    если прямым счетом
    то делаете цикл который запускается когда на пине 1 и останавливается когда на пине ноль
    если был ноль а стала 1 то запоминаем время
    если была 1 а стал 0 - измеряем интервал вычитает из текущего времени запомненное
     
  5. SSS_Viva

    SSS_Viva Новичок

    Сообщения:
    36
    Симпатии:
    2
    Спасибо за ответ, но я бы начал с более раннего.
    Прошивку для модуля генерировал вот на этом сайте NodeMCU custom builds .
    Включил в нее вот такие модули (часть из них на всякий случай): bit, bme280, cron, dht, file, gpio, http, i2c, net, node, pwm, spi, sqlite3, tmr, uart, ucg, wif, в модуль прошил с окончанием integer.
    Сначала хотелось бы понять как прописать правильно PIN на котором висит PWM, если брать обозначение с платы это D3, и соответственно везде ссылаемся на 3 (по мне это праввильно), хотя GPIO это ноль, потом нужно настроить этот пин, он может быть как выходом, так и входом, а так же interrupt mode, это и есть то прерывание, ок котором вы говорите, правильно использовать INT, но я пока с ним не разобрался, по сему для теста ставим INPUT, gpio.mode(3, gpio.INPUT), что собственно и сделано. Далее хотелось бы убедиться что на этом входе есть сигнал с датчика, единственно что придумал, это вот так gpio.read(3), в консоле видел сначала 0 потом 1, то есть вроде как есть изменение уровней, вопрос то ли это.....
    Понимаю, что для вас наверное это глупые вопросы, но все же хочется понимать что делаешь, а не бездумно копипастить чужие куски кода.
     
  6. nikolz

    nikolz Гуру

    Сообщения:
    5.350
    Симпатии:
    473
    Можно в цикле печать пина поставить его на ввод , пин подтянуть через 10-20к 3.3 на пин кнопку к земле Нажали - ноль отпустили 1 .
    проще использовать GPIO4(D2) и GPIO5(D1)
    ------------------------------
    Overview - NodeMCU Documentation
    NodeMCU v3 — Zerynth Docs documentation
    https://handsontec.com/pdf_learn/esp8266-V10.pdf
    nodemcu/nodemcu-firmware
    Начало работы с платой NodeMcu ESP8266 v3 Lua
    -----------------------------
     
  7. SSS_Viva

    SSS_Viva Новичок

    Сообщения:
    36
    Симпатии:
    2
    Выход с датчика проверил тестером пульсации есть. Состояние на gpio тоже меняется то 0 то 1, проверил принтом gpio.read(3).
    Теперь надо мониторить данный пин, я так понимаю это делается при помощи функции pin3cb на интересует уровень на 3 пине это (level) итого получаем function pin3cb(level) теперь вызывая level у нас буде либо 0 либо 1. Так я понимаю ? 3 пин поменяю на 1, не проблема, только почему проще ?
     
  8. SSS_Viva

    SSS_Viva Новичок

    Сообщения:
    36
    Симпатии:
    2
    И спасибо за ссылки, часть читал, но некоторые двольно полезные, и я их не находил.
     
  9. enjoynering

    enjoynering Авторитетный участник сообщества

    Сообщения:
    618
    Симпатии:
    61
    вот как я считал длительность импульса для HC-SR04 с помощью pulseIn()

    Код (Text):
    1. uint16_t HCSR04::getEchoPulseLength(void)
    2. {
    3.   int16_t length = 0;
    4.  
    5.   #ifdef HCSR04_DISABLE_INTERRUPTS
    6.   noInterrupts();                                                      //disable all interrupts
    7.   #endif
    8.  
    9.   /* start measurement */
    10.   digitalWrite(_triggerPin, HIGH);
    11.   delayMicroseconds(10);                                               //length of triger pulse, 100μs maximum
    12.   digitalWrite(_triggerPin, LOW);                                      //300..500μs after trigger low, module during next 200μs sends 8 pulses at 40 kHz & measures echo
    13.  
    14.   length = pulseIn(_echoPin, HIGH, _timeOutMax);                       //must be called at least a few dozen μs before expected pulse, avarage tHOLLDOFF=700μs
    15.  
    16.   #ifdef HCSR04_DISABLE_INTERRUPTS
    17.   interrupts();                                                        //re-enable all interrupts
    18.   #endif
    19.  
    20.   #ifdef HCSR04_ECHO_CANCELLATION
    21.   delay(50);                                                           //wait until echo from previous measurement disappears
    22.   #endif
    23.  
    24.   if (length == 0 || length < _timeOutMin) return HCSR04_OUT_OF_RANGE;
    25.                                            return length;
    26. }
    весь код тут - enjoyneering/HCSR04
     
  10. nikolz

    nikolz Гуру

    Сообщения:
    5.350
    Симпатии:
    473
    что-то на луа не похоже?
    Я тоже могу на СИ написать будет вообще просто, но просят же на луа?
     
  11. enjoynering

    enjoynering Авторитетный участник сообщества

    Сообщения:
    618
    Симпатии:
    61
    да не подумал.
     
  12. SSS_Viva

    SSS_Viva Новичок

    Сообщения:
    36
    Симпатии:
    2
    Больщое спасибо за пример. Тут как ситуация такая что теорию я вроде усвоил, а вот как грамотно описать это на LUA, пока не получается.
    Давайте допустим что у меня ESP прошита выше описанной прошивкой. Чтение будем реализовывать при помощи одного init.lua.
    На данном этапе я пришел к вот этому:
    Код (Lua):
    1.    local pin, highDuration, lowDuration, co2, TRIGGER_ON, lastTimestamp, calculateCo2Ppm = 3, 0, 0, 0, "both", 0, 0
    2.  
    3.    local function calculateCo2Ppm(highDuration, lowDuration)
    4.         return 5000 * (1002 * highDuration - 2 * lowDuration) / 1000 / (highDuration + lowDuration);
    5.  
    6. end
    7.    local function mh19Begin(level, timestamp)
    8.         print("mh19Begin", level, timestamp)
    9.         if (level == gpio.LOW) then
    10.             highDuration = timestamp - lastTimestamp
    11.         else
    12.             lowDuration = timestamp - lastTimestamp
    13.             local co2 = calculateCo2Ppm(highDuration, lowDuration)
    14.             print("co2", co2)
    15.    end
    16.  
    17.    lastTimestamp = timestamp
    18.  
    19. end
    20.  
    21.    gpio.mode(pin,gpio.INT)
    22.    gpio.trig(pin, TRIGGER_ON, mh19Begin)
     
  13. nikolz

    nikolz Гуру

    Сообщения:
    5.350
    Симпатии:
    473
    посмотрите это
    Особенности создания программ в NODEMCU ESP8266 для «интернета вещей»
    и попробуйте написать правильно на луа
     
  14. SSS_Viva

    SSS_Viva Новичок

    Сообщения:
    36
    Симпатии:
    2
    Если вы про структуру init start и так далее, то я про это в курсе и весь проект сейчас состоит из вот такого колличества файлов
    upload_2018-12-19_10-13-9.png
    Если про структуру того что я выложил выше, то я по ка не очень понимаю.
     
  15. nikolz

    nikolz Гуру

    Сообщения:
    5.350
    Симпатии:
    473
    обычно в проекте на луа
    ставят таймер и колбек
    все действия которые надо делать периодически помещаем в колбек таймера
    например туда можно поместить измерение импульса шим от сенсора
    все что вне колбека будет исполняться один раз
     
  16. SSS_Viva

    SSS_Viva Новичок

    Сообщения:
    36
    Симпатии:
    2
    Спасибо за советы, попробую разобраться с колбеком и таймером. Вот только надо еще со скриптом смотреть иногда не понятные значения возвращает, а иногда и минусовые, хотя вроде длительности высокого и низкого уровня считает ровно.
     
  17. nikolz

    nikolz Гуру

    Сообщения:
    5.350
    Симпатии:
    473
    покажите скрипт в части проверки пина.
     
  18. SSS_Viva

    SSS_Viva Новичок

    Сообщения:
    36
    Симпатии:
    2
    Если я вас правильно понял, то в скрипте который выше выкладывал, функция mh19Begin, которая дергается когда изменяется уровень на пине, ну и принтом, уровень и время.
     
  19. nikolz

    nikolz Гуру

    Сообщения:
    5.350
    Симпатии:
    473
    где вы ее вызываете?
     
  20. SSS_Viva

    SSS_Viva Новичок

    Сообщения:
    36
    Симпатии:
    2
    в конце самом скриптика
    gpio.mode(pin,gpio.INT)
    gpio.trig(pin, TRIGGER_ON, mh19Begin)
     

Поделиться этой страницей