PMS3003. Работа с датчиком

plantower logoПодключение датчика PMS3003 к ESP8266 с прошивкой NodeMCU и его опрос при помощи lua скриптов. При написании скриптов мне очень помог проект AQmon, пользователя github Alvaro Valdebenito. Модули для  считывания показаний PMS3003 я взял целиком из репозитария проекта: модуль pms3003.lua и скрипт опроса датчика из описания проекта AQmon

Подключение

При подключении датчика PMS3003 к WiFi модулю ESP8266-07 важно помнить о напряжении питания, так ESP8266-07 необходимо напряжение 3,3В, а PMS3003 работает от 5В. В моем проекте я использовал dc-dc конвертер построенный на основе микросхемы MP1584 для формирования напряжения +5В и LDO стабилизатор 1117-33 для формирования напряжения 3,3В. DC-DC конвертер 3AОсобенностью используемого dc-dc конвертера является относительно высокая рабочая температура катушки иднуктивности, обычно она держится на уровне +55…+60°С. В моем случае это большой плюс, так как устройство предназначено для работы на открытом воздухе, такой подогрев зимой предотвратит загустевание смазки вентилятора датчика PMS3003. Общая схема подключения датчика.

Программирование

При начале работы с датчиком важно в вашем модуле init.lua изменить скорость работы порта UART0 на 9600 бит/с, так как по умолчанию интерпретатор работает со скоростью 56700 или 115200 бит/с.

uart.setup(0, 9600, 8, uart.PARITY_NONE, uart.STOPBITS_1, 1) --настройка скорости порта UART0
gpio.mode(7,gpio.OUTPUT) -- настройка порта 7 (GPIO13) как выхода
gpio.write(7,gpio.LOW)  -- настрока низкого логического уровня, для отключения PMS3003 

Скрипт опроса датчика PMS3003, как и сам скрипт работы с датчиком PMS3003 и пересчета полученных данных подсмотрен в проекте AQmon.

do
-- module setup
  PMset=7              -- выход SET PMS3003 подключен к D7 (GPIO13) ESP8266
  require('pms3003')
  pms3003.model=3      -- настройка используемого датчика 3 для PMS3003
  pms3003.init(PMset)
  pms3003.verbose=false -- режим расширенного вывода
  pms3003.debug=false -- режим вывода отладочной информации
-- запуск датчика (высокий уровень на выходе PMset), код перехватывает вход UART RX0 у интерпретатора lua
  pms3003.read(function() -- чтение датчика PMS3003 
    pm01 = pms3003.pm01 or 'null'
    pm25 = pms3003.pm25 or 'null'
    pm10 = pms3003.pm10 or 'null'
-- печать результатов 
    print(('pm1= %s, pm2.5= %s, pm10= %s'):format(pm01,pm25,pm10))
-- очистка памяти
    pms3003,package.loaded.pms3003 = nil,nil

  end)
-- возврат управления входом RX0 интерпретатору lua
end
collectgarbage()

Скрипт приведенный выше вызывает модуль pms3003.lua. В результате его работы вы получите текстовый вывод данных о концентрации аэрозолей PM1, PM2.5 и PM10.