• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Вопрос 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, вполне, и будет доп функционал.
 
Сверху Снизу