Прочитайте все статьи от Игоря от начала и до конца + книга по Lua, вопросов практически не будет по основам.
@ИгорьК читаю основы по вашим урокам. Таймер переделал работает таймер. Но почему то в функции publish_data() в count число не меняется. Что уже тока не перепробывал. Сборка эта powered by Lua 5.1.4 on SDK 3.0.1-dev. Все правильно же, но почему count не растет? Код (Text): pin = 4 -- сюда вешаем датчикир sleepdelay = 20 -- десять минут между проверками = 600 секунд. killdelay = 15-- через 35 секунд после пробуждения - спать принудительно. -- killdelay зависит от скорости вашего соединения. Отрегулируйте! Чем меньше - тем лучше, -- но если слишком мало - модуль не успеет передать данные и принудительно уйдет в сон. countsleep = 3 -- двенадцать циклов проверки до принудительной передачи = 2 часа -- устанавливайте сами сколько считаете правильным. Чем меньше - тем больше расход батареи. function sendNarod(temperature) mytimer = tmr.create() mytimer: alarm (1000, tmr.ALARM_AUTO, function() print(wifi.sta.getip()) print( wifi.sta.status()) if wifi.sta.status() == 5 and wifi.sta.getip() ~= nil then mytimer:stop() mytimer:unregister() mytimer=nil print("Got wi-fi!") local dataN = "#8E-CE-4E-E2-49-56\n" -- ваш ключ!!! print("T = "..temperature) dataN =dataN.."#T01#"..temperature.."\n" dataN = dataN.."##\n" print(dataN) conn=net.createConnection(net.TCP, 0) conn:on("connection",function(conn, payload) conn:send(dataN) end) conn:on("receive", function(conn, payload) print('\nRetrieved in '..((tmr.now()-t)/1000)..' milliseconds.') print('Narodmon says '..payload) conn:close() disconnect() end) t = tmr.now() conn:connect(8283,'narodmon.ru') end end) end function publish_data() print("work now!") local te = 85 te = getTemp() print("Got "..te) if te ~= 85 then local oldt = rtcmem.read32(0) local count = rtcmem.read32(1) if (count + 1) < 1 then rtcmem.write32(1, 0) else rtcmem.write32(1,( count + 1)) end rtcmem.write32(1, (count+1)) print("oldt "..oldt) local delta = te - oldt if delta < 0 then delta = delta * -1 end print("Delta "..delta) print("count = "..count) if (delta > 8) or (count > countsleep) then rtcmem.write32(0, te) print("countsleep = "..count) rtcmem.write32(1, 0) if bit.isset(te, 15) then te = 1 - bit.bxor(te, 0xffff) end te = te * 625 / 10000 print("te = "..te) print("Pubish Data!") sendNarod(te) else print("Not changes. Go...") disconnect() end end end function getTemp() print("get te") local te = 85 local ds18b20 = require('ds18b20') ds18b20.setup(pin) local addres={} addres=ds18b20.addrs() if addres[1] ~= nil then te = ds18b20.read(addres[1]) end print("Got "..te) return te end function disconnect() mytimer2 = tmr.create() mytimer2: alarm (500, tmr.ALARM_AUTO, function() print("Sleep Now!") node.dsleep(1000000*sleepdelay, 0) end) end mytimer1 = tmr.create() mytimer1: alarm (1000*killdelay, tmr.ALARM_AUTO, function() print("Get Sleep By Timer") disconnect() mytimer1:stop() mytimer1:unregister() mytimer1=nil end) publish_data()
Не надо ничего пробовать. Разберитесь как код работает, вы же взялись за него. rtcmem... (...) - ключ к пониманию. Смотрите что вы из железки читаете после сна и что пишете. Разбирайтесь как работает код. Ставьте print(...) перед каждой операцией rtcmem.write() и после rtcmem.read(...).
может стоит посмотреть эту переменную Это условие и дёргает ваш count. Напечатайте ее значение дебажным принтом
@ИгорьК заработало. Тока надо write и read делать в ячейке от 65 до 127. Почему то с 1 по 44 недоступно. На форумах где то прочитал что эти ячейки резервирует система вроде. Можно еще вопрос. Как надо сразу ip задать, или что надо еще сделать чтоб к вайфаю быстрее подключалось?
Все здесь: https://nodemcu.readthedocs.io/en/release/modules/wifi/#wifistaconfig Больше не чего добавить.
Да. Смотрел, сравнивал с вашим кодом в котором вы ip назначаете. Ну где тоже от батарейки. У вас там функция wifi.sta.eventMonStart(), а в realese нет его. Не пойму, как его определить. Как в realese его запустить...
wifi.sta.eventMonStart, wifi.sta.eventMonStop, wifi.eventmon.Reg это устаревшие функции из версии v.1.5.4.1-final. Почитайте в документации на эту версию что делают эти функции и сделайте по аналогии. Только учтите, что регистрация callback'ов на события wifi должны производиться как можно раньше, то есть при самом старте программы.
я тоже собрал градусник на батарейках на ESP-01. Вот только вынес его на балкон застекленный и DS18b20 высунул на улицу.... на улице было -13С (на балконе -6С) и через 15 мин две новые батарейки АА стали +2.4В на морозе. Пробовал разные батарейки и GP, Duracell, дешевые из FixPrice - результат одинаковый. И здесь даже никакой DeepSleep не поможет.
без разницы, какие батарейки. Но есть и плюсы - на морозе у батареек емкость не сильно падает, а вот саморазряд падает прилично.
ESP можно запускать от батарейки на пару месяцев, но при этом следует учитывать вот что. 1. Устройство должно измерять температуру и уходить в ГЛУБОКИЙ сон. 2. Измерять эту температуру лучше пореже - с интервалом минут 15. 3. Если температура не изменилась более чем на 0.5, а лучше на 1градус - данные не отправлять. 4. Датчик лучше применять какой-нибудь резистивный, а не DS18b20 ибо оный достаточно жручий. 5. Если все таки DS18b20, то уменьшить его разрешение - быстрее происходит измерение / меньше корма. 6. Лучше это будет ESP32. Потому что у нее сон экономнее. 7. Если это ESP32, то надо посмотреть среди новых моделей - что там с сонным током. 8. С платы лучше сдуть паяльником микросхему USB-UART - она тоже зря питается. Таким образом два месяца оно работает. В некоторых случаях и некоторым личностям этого бывает достаточно.
ИгорьК по вашим же комментариям на форуме, модуль ESP-01 может работать при падении напряжения до +2,82В. Здесь же падение напряжения батареек на морозе дошло до +2,4в, соответственно модуль ESP-01 уже не может проснуться из DeepSleep при напряжении +2,4В Я использовал ESP-01S у которого нет красного светодиода на питание брался ваш скрипт Версия для одного датчика для батареек и готовая прошивка NodeMCU
Пытаюсь найти информацию по модулю CBU из беспроводных датчиков Tyua , он в отличие от ESP работает на морозе от 2-х ААА батареек, но отправляет показания только один раз в час. Спойлер: Фото
"Не виноватая я" Это 2016 год, не так ли? Сейчас я бы сделал кое-что по-другому. Если это устройство работает у вас всего четверть часа, то тдело в чем-то другом, нежели в этой версии. Да, в общем, я ни за что и не агитирую
;-) так я и не наезжаю!!!! Своим первым комментарием просто хотел обратить внимание на то, что батарейки на морозе сами по себе дохнут и не могут обеспечить напряжения для выхода из DeepSleep. А вот watermetr - этот "да", мог протянуть в тепле пару месяцев на батарейках. Жаль что скрипт не совсем доработан был, когда счетчик останавливался так, что геркон оставался замкнутым, то значения уходили в космос..... ))))
Ради прикола задал один и тот же вопрос к двум ИИ и получил ответы... Вопрос: "написать скрипт на языке Lua для ESP8266 для периодического сбора и передачи данных по таймеру на MQTT с датчика ds18b20 и переходом в DeepSleep" Ответы: YaGPT 2 Код (C++): -- Подключение библиотек local ds18x20 = require("ds18x20") local wifi = require("wifi") local mqtt = require("mqtt") -- Настройки Wi-Fi wifi.setmode("ap") wifi.ap.ssid = "your_wifi_name" wifi.ap.pwd = "your_wifi_password" wifi.sta.ssid = "your_access_point_name" wifi.sta.pwd = "your_access_point_password" -- Соединение с Wi-Fi while not wifi.sta.isconnected() do wifi.sta.connect() print("Connecting to Wi-Fi...") os.sleep(1) end -- Настройка подключения к MQTT local broker = "your_mqtt_broker" local client = mqtt.client { keepalive = 1000, host = broker, port = 1883, cert = nil, key = nil, ca = nil } -- Инициализация датчика ds18b20 local oneWire = ds18x20.new() local devices = oneWire:devices() -- Сбор данных с датчика и отправка на сервер MQTT while true do for _, device in pairs(devices) do local data = device:read_temp() if data then local temperature = data[1] local humidity = data[2] client:publish("your_topic", temperature .. "C") os.sleep(300) -- задержка между публикациями end end -- переход в режим глубокого сна на 5 мин os.deepsleep(300 * 60 * 5) end --[[ Не забудьте заменитьyour_wifi_name,your_wifi_password,your_access_point_nameиyour_access_point_passwordна соответствующие значения. Также заменитеyour_mqtt_brokerна адрес вашего сервера MQTT (например,test.mosquitto.com). Обратите внимание, что данный код не обрабатывает ошибки и не проверяет, успешно ли подключился клиент к MQTT, и не учитывает возможность потери подключения к Wi-Fi. Вам следует добавить соответствующие проверки и обработку ошибок, если это необходимо.]]-- Chat-GPT Код (C++): --Вот пример скрипта на языке Lua для Esp8266, который собирает данные с датчика DS18B20 и передает их по протоколу MQTT перед переходом в режим Deep Sleep: ```lua -- Подключение к сети Wi-Fi wifi.setmode(wifi.STATION) wifi.sta.config("SSID", "password") -- Подключение к MQTT-брокеру m = mqtt.Client("client_id", 120, "username", "password") m:connect("mqtt_broker_ip", 1883, 0, function(conn) print("Connected to MQTT broker") end) -- Инициализация датчика DS18B20 pin = 3 -- GPIO2 ow.setup(pin) -- Чтение температуры с датчика DS18B20 function readTemperature() ow.reset(pin) ow.write(pin, 0xCC) ow.write(pin, 0x44) tmr.delay(1000000) -- Задержка 1 секунда для измерения ow.reset(pin) ow.write(pin, 0xCC) ow.write(pin, 0xBE) data = nil data = string.char(ow.read(pin)) for i = 1, 8 do data = data .. string.char(ow.read(pin)) end temp = (data:byte(1) + data:byte(2) * 256) * 0.0625 return temp end -- Отправка данных на MQTT-брокер function sendTemperature() temperature = readTemperature() m:publish("temperature_topic", temperature, 0, 0, function(conn) print("Temperature sent: " .. temperature) end) end -- Чтение и отправка данных при каждом запуске sendTemperature() -- Установка интервала для отправки данных (в миллисекундах) interval = 60000 -- 1 минута -- Уход в режим Deep Sleep после отправки данных node.dsleep(interval * 1000) ``` --[[Примечания: - Замените `"SSID"` и `"password"` на SSID и пароль своей Wi-Fi сети. - Замените `"client_id"`, `"username"` и `"password"` на соответствующие данные для подключения к вашему MQTT-брокеру. - Замените `"mqtt_broker_ip"` на IP-адрес вашего MQTT-брокера. - Подключите датчик DS18B20 к GPIO2 (GPIO номер 3 на Esp8266). - Задайте интервал времени (`interval` в миллисекундах), через который будут отправляться данные в MQTT. В данном примере установлен интервал в 1 минуту (60000 миллисекунд). - Обратите внимание, что после отправки данных происходит переход в режим Deep Sleep с помощью `node.dsleep()`. Если вам нужно задать другой интервал или выполнить другую логику перед переходом в режим Deep Sleep, измените соответствующий участок кода. ]]-- Еще раз, код не я писал! P.S. Оба Силиконовых Интеллекта не запускают таймер, а просто переводят в DeepSleep с интервалом. И еще, Яндекс зачем-то приплел humidity к датчику DS18b20 ))))