Завтра ближе к вечеру посмотрю все с компьютера, проверьте, пожалуйста, чтобы и тот код что запускаете здесь был. А вот эта фраза наводит на определённые мысли. В системе не остаются никакие данные, если вы их специально не сохранили перед уходом в сон. Поэтому никакого третьего раза быть не может. "Раз" всегда первый. Но, повторюсь, я не могу с телефона все это осмыслить. Кроме того, вообще вся эта идея плоха, потому что ESP8266 от батарейки работает недолго. Летом мне удавалось работать 5 недель от пары АА. Зимой ситуация будет хуже. Поэтому я и забил на этот проект. Если мне сейчас нужно было передавать температуру без стационарного источника питания, я бы взял датчик Zigbee и получал бы с него данные через SLSYS.
Да я тока начинаю изучать есп, луа. Иерусалимского скачал. Параллельно повторяю ваши или еще у кого проекты. Не получается здесь загрузить не файлы, не фото. Загрузил все на майл. Все файлы которые я использую. https://cloud.mail.ru/public/gFMT/mrBrkcSND
Вот смотрите, в вашем логе много отладочной информации. Если взглянуть тот исполняемый файл, что вы выложили здесь, там нет ни одного вывода в консоль. Первое умозаключение, которое приходит в голову - передо мной разные файлы. Это ваш косяк. Так нельзя. Тем не менее, в данном случае видно, что скрипт пытается опубликовать данные на народный мониторинг, но никакого ответа он него не получает и уходит в сон. ------------------------------------ Какова логика работы скрипта? Устройство просыпается, измеряет температуру, заносит ее в память, при первом включении отправляет на Народный мониторинг и засыпает. При следующем включении опять измеряет температуру, сравнивает с записанной и если отклонение невелико - опять спит. Если отклонение большое - отправляет данные. На третий раз данные уходят независимо от того, какая разница температуры. Кроме того, если отправляются данные, устройство уходит в сон без проверки успеха доставки. Сделано это для того, что если по каким-то причинам у вас в сети Народный мониторинг недоступен - железка будет долбиться к нему и мгновенно просадит батарею. Два таймера определяют работу - таймер проверки wifi и таймер отправки в сон. ---------------------------------------- Что в итоге? Устройство при первом включении отправляет данные, а затем - нет. Из лога видно, что попытка отправки есть, но устройство улетает в сон. Вывод простейший - устройство не успевает подхватить ВАШУ сеть и отправить информацию. Почему же это происходит в первый раз? Потому что вы стартуете в ручном режиме, и после подачи питания проходит больше времени: когда вы запускаете вручную скрипт железка уже в сети. Поскольку вы учитесь - разбирайтесь с логикой работы и таймерами, дело в них. И перепишите этот скрипт под новую прошивку, будет полезно.
Даа, и в правду не тот исполняемый файл. Тот с коммментариями, этот тот же без комментов рабочий. Я конечно не дома щас, приду, буду думать. Ну а с этим файлом же она при подаче питания с батареек сначала тоже передает, а потом нет. При включении даже секунд 15 не проходит. А потом когда принудительно она тока через 30 сек в сон уходит, но не передает почему то. 30 сек не хватает передать? В момент ухода в сон принудительно, вайфай уже выключен получается? @ИгорьК
Это, возможно, особенности вашей сети: устройство пытается отправить данные, но с wifi соединения не происходит. Вставляйте в каждую строку отправки print(...) и смотрите где процесс останавливается. Попробуйте дополнительно вставить в код "wifi.sta.connect()" И, в общем, если вы изучаете проблему - пытайтесь соображать сами, это логика. Сейчас мне видится что у вас что-то с сетью, но до конца утверждать не возьмусь, ибо это можно понять только не месте. Экспериментируйте.
совет вам верный дают - идти построчно, пофункционально. я сам на эту удочку попал (луавский асинхрон) когда у меня при попытке запроса через http.get падало с ошибкой не найден днс. в итоге засунул в таймер, в блок успешного получения ип (а именно авторизацию на роутере) функцию и все заработало как надо
Здесь тоже можно было бы засунуть выброс в сон в калбэк получения ответа от Народного мониторинга, но с периодичностью раз в 10-15 запросов там происходит большая, до 30 секунд задержка. Поэтому проще поиграть таймером, чем тратить батарейку. Вообще, код следовало бы переработать, но все равно овчинка выделки не стоит - от батарейки это долго не работает.
не не, у меня с питанием проблем не будет. я пытаюсь сказать об общей математике по работе с луа (все-таки, разница с ардуиной большая) и трудно даже заметить, банальные вещи сходу. ну, при повторном просмотре кода, все встает на свои места. И все более, чем логично
@ИгорьК я в правильном направлении иду? Можете взглянуть на код. 3й день учу луа. Таймеры переделал. И подключение к инету написал по другому. На прошивку release Код (Text): ap = "RT" appass = "P" pin = 4 -- сюда вешаем датчики sleepdelay = 30 -- десять минут между проверками = 600 секунд. killdelay = 10 -- через 35 секунд после пробуждения - спать принудительно. -- killdelay зависит от скорости вашего соединения. Отрегулируйте! Чем меньше - тем лучше, -- но если слишком мало - модуль не успеет передать данные и принудительно уйдет в сон. countsleep = 1 -- двенадцать циклов проверки до принудительной передачи = 2 часа -- устанавливайте сами сколько считаете правильным. Чем меньше - тем больше расход батареи. function sendNarod(temperature) wifi.setmode(wifi.STATION) wifi.sta.config{ssid= "ap", pwd="appas"} tmr.create():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 print("Got wi-fi!") tmr.create():stop 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 t = 85 t = getTemp() print("Got "..t) if t ~= 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 = t - 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, t) print("countsleep = "..count) rtcmem.write32(1, 0) if bit.isset(t, 15) then t = 1 - bit.bxor(t, 0xffff) end t = t * 625 / 10000 print("t = "..t) print("Pubish Data!") sendNarod(t) else print("Not changes. Go...") disconnect() end end end function getTemp() print("get t") local t = 85 local ds18b20 = require('ds18b20') ds18b20.setup(pin) local addres={} addres=ds18b20.addrs() if addres[1] ~= nil then t = ds18b20.read(addres[1]) end print("Got "..t) return t end function disconnect() tmr.create():alarm( 500, tmr.ALARM_AUTO, function() print("Sleep Now!") node.dsleep(1000000*sleepdelay, 0) end) end tmr.create():alarm( 1000*killdelay, tmr.ALARM_AUTO, function() print("Get Sleep By Timer") disconnect() end) publish_data()
Lua error: script1.lua:23: function arguments expected near 'local' - такую ошибку выдает. Вот эта строчка: local dataN = "#8E-CE-4E-E2-49-56\n"
если я правильно помню, то порядковый номер таймера (их может быть 5 штук). Но, я настоятельно рекомендую использовать сдк 3 версии
@Airat777, давайте я не буду лично для вас переписывать эту тему. Там есть много про таймер. В версии прошивок 1.5 таймеров было шесть или семь, и они имели номера, начиная с 0. "tmr.stop(0)" - остановить нулевой таймер в прошивке 1.5. В современных прошивках таймеры имеют названия. Вы начали повторять непростой проект на старой прошивке. Это неудачное занятие для начинающего Вместо этого лучше читать указанную тему, иначе вы будете задавать вопросы по каждой мелочи. В теме про таймер я написал, кажется, все.
Конструкция tmr.create:stop() не имеет смысла. Обычно методы stop и start используют для управления таймером, созданным с помощью tmr.create(). Я не смотрел весь код, поэтому не знаю какой таймер вы хотите остановить и зачем. Но есть общие подходы к работе с таймерами. Создать безымянный таймер, и при наступлении события уничтожить его. Код (C++): tmr.create():alarm( 1000, tmr.ALARM_AUTO, function(t) if wifi.sta.status() == 5 and wifi.sta.getip() ~= nil then --wifi пойман? print("Got wi-fi!") t:unregister() t = nil end
@serg3295 можешь взглянуть на код) почему-то к вайфаю через раз подключается и count не считает. powered by Lua 5.1.4 on SDK 3.0.1 Код (Text): pin = 4 -- сюда вешаем датчикир sleepdelay = 20 -- десять минут между проверками = 600 секунд. killdelay = 15-- через 35 секунд после пробуждения - спать принудительно. -- killdelay зависит от скорости вашего соединения. Отрегулируйте! Чем меньше - тем лучше, -- но если слишком мало - модуль не успеет передать данные и принудительно уйдет в сон. countsleep = 3 -- двенадцать циклов проверки до принудительной передачи = 2 часа -- устанавливайте сами сколько считаете правильным. Чем меньше - тем больше расход батареи. function sendNarod(temperature) wifi.setmode(wifi.STATION) wifi.sta.autoconnect(0) tmr.create(): alarm (1000, tmr.ALARM_AUTO, function(t) if wifi.sta.status() == 5 and wifi.sta.getip() ~= nil then t:unregister() t = 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 t = 85 t = getTemp() print("Got "..t) if t ~= 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 = t - 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, t) print("countsleep = "..count) rtcmem.write32(1, 0) if bit.isset(t, 15) then t = 1 - bit.bxor(t, 0xffff) end t = t * 625 / 10000 print("t = "..t) print("Pubish Data!") sendNarod(t) else print("Not changes. Go...") disconnect() end end end function getTemp() print("get t") local t = 85 local ds18b20 = require('ds18b20') ds18b20.setup(pin) local addres={} addres=ds18b20.addrs() if addres[1] ~= nil then t = ds18b20.read(addres[1]) end print("Got "..t) return t end function disconnect() tmr.create(): alarm (500, tmr.ALARM_AUTO, function(t) print("Sleep Now!") node.dsleep(1000000*sleepdelay, 0) t:unregister() t = nil end) end tmr.create(): alarm (1000*killdelay, tmr.ALARM_SINGLE, function(t) print("Get Sleep By Timer") disconnect() t:unregister() t = nil end) publish_data()
А чего на этот код смотреть-то. Он чужой и логика не тривиальная. ИгорьК всё правильно вам сказал: Ну а так, навскидку, в первом таймере у вас t - это параметр callback функции (таймер, который вы убиваете) и тут же объявляется глобальная переменная t, которая используется для вычисления временного интервала. Переименуйте её что-ли, может заработает
@serg3295 сделал вот так, count всегда 0. Не считает. Код (Text): ap = "RTF72" appass = "P" pin = 4 -- сюда вешаем датчикир sleepdelay = 20 -- десять минут между проверками = 600 секунд. killdelay = 15-- через 35 секунд после пробуждения - спать принудительно. -- killdelay зависит от скорости вашего соединения. Отрегулируйте! Чем меньше - тем лучше, -- но если слишком мало - модуль не успеет передать данные и принудительно уйдет в сон. countsleep=2 -- двенадцать циклов проверки до принудительной передачи = 2 часа -- устанавливайте сами сколько считаете правильным. Чем меньше - тем больше расход батареи. function sendNarod(temperature) wifi.setmode(wifi.STATION) wifi.sta.connect() tmr.create(): alarm (1000, tmr.ALARM_AUTO, function(t) print(wifi.sta.getip()) print( wifi.sta.status()) if wifi.sta.status() == 5 and wifi.sta.getip() ~= nil then t:unregister() 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(2) if (count + 1) < 1 then rtcmem.write32(2, 0) else rtcmem.write32(2, (count+1)) end rtcmem.write32(2, (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(2, 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() tmr.create(): alarm (500, tmr.ALARM_AUTO, function(t) print("Sleep Now!") node.dsleep(1000000*sleepdelay, 0) t:unregister() end) end tmr.create(): alarm (1000*killdelay, tmr.ALARM_AUTO, function(t) print("Get Sleep By Timer") disconnect() t:unregister() end) publish_data()