Вопрос ESP8266 CH340 NodeMcu V3 Lua+BME280+MH-Z19B+PMS5003.

SSS_Viva

Member
Появилась необходимость собрать данный комбайн. Условия использования обычные бытовые, грубо говоря в квартире. Более чем уверен, что подобных связок уже должно быть реализовано не мало, но хочется для себя и по-своему. Что хотелось бы видеть на выходе:
• Мониторим параметры: температура, влажность, давление, уровень CO2, PM2.5
• При нахождении дома, и при подключении к локальной сети, чтоб все это можно было видеть в браузере по IP адресу. На этой страничке: дата и время, IP адрес который получила наша ESP, отображаем погоду для данного места с gismeteo, например. Далее список параметров, перечисленных в первом пункте, напротив каждого смайлик, красный-грустный, желтый-нейтральный, зеленый-веселый. В идеале надо иметь закладку на которой для каждого параметра можно выставить диапазон значений, и соответствии с ним показывать определенный смайлик.
• Отправка данных на сайт narodmon.ru, чтобы можно было контролировать обстановку дома из вне.
• На первом этапе, питаться будем из розетки, в последствии возможно добавиться связка литий+ солнечная панель. Поэтому сразу хотелось бы предусмотреть использование спящего режима для датчиков где это возможно, а так же побороться со всякого рода утечками памяти, дабы исключить всевозможные перезагрузки модуля.
Железо, взятое за основу:
• ESP8266 CH340 NodeMcu V3 Lua
• BME280
• MH-Z19B
• PMS5003

Два последних датчика ещё не подключал. Начал с экспериментов над связкой ESP8266
CH340 NodeMcu V3 Lua+ BME280.
О ESP8266 CH340 NodeMcu V3 Lua надо рассказать отдельно, дабы было для потомков. После получения, начал прошивать данный модуль, первые несколько раз прошли удачно, но в очередной раз Windows уведомила что USB устройство не опознано, и как я его больше не подключал результат был один и тот же. Начал читать про данный модуль, много где писали про просадку напряжения, начал копать в эту сторону. В данном модуле, для защиты USB по 5V линии стоит два диода Шотке, первый защищает чтоб не прилетело со стороны стабилизатора, а второй защищает со стороны пина VIN. Так вот после первого 5V превращались в 4,6V, а после второго и вовсе оставалось 2,6V, снял их и кинул перемычку, но моей проблемы это не решило, так как стабилизатор с 4,6М исправно делал 3,3V. Пропаял все что было на плате, не помогло, удалил CH340, взял старый телефонный кабель на PL2101(как выяснилось позднее тоже поддельной), все это дела распаял, пришлось поколдовать с драйверами, но результатом стало то, что появилась возможность прошивать данный модуль и двигаться дальше.
Прошивку для модуля генерировал вот на этом сайте NodeMCU custom builds .
Включил в нее вот такие модули (часть из них на всякий случай): bit, bme280, cron, dht, file, gpio, http, i2c, net, node, pwm, spi, sqlite3, tmr, uart, ucg, wif, на выходе получаем два файла, отличаются окончанием float и integer, в модуль прошиваем с окончанием integer. Прошивку производи при помощи nodemcu-flasher-master.
Для дальнейшей работы используем ESPlorer. Подключаемся к нашему порту на котором висит наш модуль, если все ок, то в консоль получаем вменяемый ответ. Далее форматируем файловую систему, и заливаем нужные нам файлы скриптов.
Структуру скриптов я вижу такую:
• Первым идет init.lua, в нем минимум параметров (и то если они там нужны) а так при помощи его вызываем start.lua он в свою очередь вызывает wifi.lua тут конфигурируем наш ESP и подключаем его к нашей wifi сети, далее идет page.lua тут размещается пока наша простенькая страничка, следующий server.lua, это простенький HTTP сервер, потом data.lua, при помощи которого будут собираться данные с датчиков, далее сами датчики, BME280.lua, Z19B.lua, PMS5003.lua. На данном этапе вот что есть: init.lua
Код:
dofile("start.lua")
start.lua
Код:
dofile("wifi.lua")
dofile("server.lua")
dofile("bme280.lua")
wifi.lua
Код:
wifi.setmode(wifi.STATION) -- установка режима
wifi.sta.clearconfig() -- очистка от барахла
local scfg={} -- таблица установок ржима
scfg.auto = true -- входить и поддерживать сеть автоматически
scfg.save = true -- запомнить эти установки во флэше
scfg.ssid = '1111' -- название сетки
scfg.pwd = '123456'-- пароль сетки
wifi.sta.config(scfg) -- конфигурируем сеть
wifi.sta.connect() -- старт соединения
-- через 15 секунд посмотрим что получилось, после отладки уберем:
tmr.create():alarm(15000, tmr.ALARM_SINGLE, function() print('\n', wifi.sta.getip()) end)
server.lua
Код:
do
dat = {
    temp = 100,
    humi = "Сухо"
}
local function expand (s)
    return (string.gsub(s, "$(%w+)", dat))
end
srv = net.createServer(net.TCP)
function receiver(sck, data)
    local function closec()
        sck:close()
    end
    local function send()
        if file.open("page.lua", "r") then
            repeat
                local line = file.readline()
                if line then
                    line = expand(line)
                    sck:send(line)
                end
            until line == nil
            file.close()
        else
          sck:close()
        end
    end
    sck:on("sent", closec)
    send()
end
srv:listen(80, function(conn)
  conn:on("receive", receiver)
end)
end
page.lua
Код:
<p align="center"><img alt="" height="72" src="https://www.123.com/logo.png" width="148"></p>
<p align="center">Температура в доме: $temp</p>
<p align="center">Влажность в доме : $humi</p>
bme280.lua
Код:
alt=280
sda, scl = 3, 4
i2c.setup(0, sda, scl, i2c.SLOW)
bme280.setup()
tmr.create():alarm(20000, 1, function()
local T, P, H, QNH = bme280.read(alt)
local Tsgn = (T < 0 and -1 or 1); T = Tsgn*T
print(string.format("T=%s%d.%02d", Tsgn<0 and "-" or "", T/100, T%100))
print(string.format("QFE=%d.%03d", P/1000, P%1000))
print(string.format("QNH=%d.%03d", QNH/1000, QNH%1000))
print(string.format("humidity=%d.%03d%%", H/1000, H%1000))
D = bme280.dewpoint(H, T)
local Dsgn = (D < 0 and -1 or 1); D = Dsgn*D
print(string.format("dew_point=%s%d.%02d", Dsgn<0 and "-" or "", D/100, D%100))

-- altimeter function - calculate altitude based on current sea level pressure (QNH) and measure pressure
P = bme280.baro()
curAlt = bme280.altitude(P, QNH)
local curAltsgn = (curAlt < 0 and -1 or 1); curAlt = curAltsgn*curAlt
print(string.format("altitude=%s%d.%02d", curAltsgn<0 and "-" or "", curAlt/100, curAlt%100))
end)

Остановился на том что не знаю как правильно передать данные от BME280.lua в поле dat page.lua. Ну и в данном варианте page.lua, то что написано кириллицей, в браузере каркозяблы. Буду благодарен за любую помощь и подсказки в реализации данного проекта.
 

Юрий Ботов

Moderator
Команда форума
page.lua: явный кусок html. Причем строка 1 - явный остаток некоего копи/паста из какого то примера вам по всей видимости не нужный.
Предположу что page.lua надо переписать так:
Код:
<!DOCTYPE html>
<html lang="ru">
<head>
    <title>Датчики (ну или что придумаете)</title>
</head>
<body>
<p align="center">Температура в доме: $temp</p>
<p align="center">Влажность в доме : $humi</p>
</body>
</html>
Проблема также может заключаться в редакторе которым вы пользуетесь: если кодировка редактора не совпадает с кодировкой вэб сервера - можно увидеть любые кракозяблы. Пишите в чем нибудь простом - в far (win) или mc (linux) чтобы не грузить lua всякими там unicode. У штатной библиотеки Lua с unicode беда.
 

SSS_Viva

Member
page.lua: явный кусок html. Причем строка 1 - явный остаток некоего копи/паста из какого то примера вам по всей видимости не нужный.
Предположу что page.lua надо переписать так:
Код:
<!DOCTYPE html>
<html lang="ru">
<head>
    <title>Датчики (ну или что придумаете)</title>
</head>
<body>
<p align="center">Температура в доме: $temp</p>
<p align="center">Влажность в доме : $humi</p>
</body>
</html>
Проблема также может заключаться в редакторе которым вы пользуетесь: если кодировка редактора не совпадает с кодировкой вэб сервера - можно увидеть любые кракозяблы. Пишите в чем нибудь простом - в far (win) или mc (linux) чтобы не грузить lua всякими там unicode. У штатной библиотеки Lua с unicode беда.
Спасибо за подсказку, перепишу, и на будущее учту эту особенность библиотеки Lua. На данный момент более насущно, как передать данные с датчиков web серверу, чтобы отобразить на данной страничке.
 

Юрий Ботов

Moderator
Команда форума
Так вот он механизм, у вас в коде...
Код:
dat = {
    temp = 100,
    humi = "Сухо"
}
local function expand (s)
    return (string.gsub(s, "$(%w+)", dat))
end
Храните значения внутри dat и оно подменит $имяпеременной на ее значение
 

SSS_Viva

Member
Так вот он механизм, у вас в коде...
Код:
dat = {
    temp = 100,
    humi = "Сухо"
}
local function expand (s)
    return (string.gsub(s, "$(%w+)", dat))
end
Храните значения внутри dat и оно подменит $имяпеременной на ее значение
Я прошу прощения, но наверное я не корректно сформулировал вопрос. Как мне в dat передать значение из файла BME280.lua?
 
Последнее редактирование:

mihail_do

New member
добавьте таймер в init.lua на случай циклической перезагрузки. секунд 5 хватит, чтобы удалить файл.
 

SSS_Viva

Member
добавьте таймер в init.lua на случай циклической перезагрузки. секунд 5 хватит, чтобы удалить файл.
Большое спасибо за совет, собственно все и городил с init и start чтоб избежать циклической перезагрузки, и не стирать и прошивать заново ESP, но сам до обычной задержки в init не додумался.
Теперь init.lua выглядит вот так:
Код:
local IDLE_AT_STARTUP_MS = 10000;

tmr.alarm(1,IDLE_AT_STARTUP_MS,0,function()
    dofile("start.lua")
end)
 

SSS_Viva

Member
Пока разбираюсь как отправлять данные браузеру, нашел вот такую интересную реализацию работы c WiFi.
Прикрутил, получилось весьма не дурно.
 

lavro

New member
Вопрос, не уточняли: Bosch выпустила BME680, тоже что и BME280, но с анализатором воздуха, может он заменит MH-Z19B?
 

SSS_Viva

Member
Вопрос, не уточняли: Bosch выпустила BME680, тоже что и BME280, но с анализатором воздуха, может он заменит MH-Z19B?
Почитал, BME680 немного не то, MH-Z19B преследует конкретную цель, 680 анлизирует кучу всего сам, потом ещё и отдает определенную величину. Более подробно можете почитать вот тут:
А вот рассмотреть как замену 280, вполне, и будет доп функционал.
 
Сверху Снизу