В копилку. Как на NodeMCU / Lua читать показания сенсора по serial.
-- https://github.com/asantoni/brewbot/blob/master/brewbot.lua
uart.setup(0, 9600, 8, uart.PARITY_NONE, uart.STOPBITS_1, 0)
uart.on("data", 9, function(data)
-- raw_data = data
trace = data
if string.byte(data, 1) == 0xFF and
string.byte(data, 2) == 0x86 then
local high_level_conc = string.byte(data, 3)
local low_level_conc = string.byte(data, 4)
co2 = high_level_conc * 256 + low_level_conc
co2_norm = math.floor((co2_norm or co2) * 9/10 + co2/10 + 0.5)
end
if string.byte(data, 1) == 0x86 and
string.byte(data, 9) == 0xFF then
local high_level_conc = string.byte(data, 2)
local low_level_conc = string.byte(data, 3)
co2 = high_level_conc * 256 + low_level_conc
co2_norm = math.floor((co2_norm or co2) * 9/10 + co2/10 + 0.5)
end
-- foo = data
end, 0)
function sendData()
uart.write(0, 0xFF, 0x01, 0x86,0x00,0x00,0x00,0x00,0x00, 0x79)
end
-- Рекомендуют дёргать не чаще раза в 10 секунд.
tmr.alarm(2, 10000, 1, function()
sendData()
loadfile("print.lua")("CO2="..(co2 or "nil").."| ", 100)
end)
Это вариант, учитывающий описанный у меня выше в теме глюк, когда поменялся порядок байт
Результат складывается в глобальные переменные
co2
и
co2_norm
. Вторая — усреднённое значение с предыдущими измерениями для фильтрации выбросов. В общем, оказалась практически бесполезной.