Esp от батарейки

Тема в разделе "ESP8266, ESP32", создана пользователем Airat777, 12 ноя 2022.

  1. ИгорьК

    ИгорьК Гуру

    Завтра ближе к вечеру посмотрю все с компьютера, проверьте, пожалуйста, чтобы и тот код что запускаете здесь был.

    А вот эта фраза наводит на определённые мысли. В системе не остаются никакие данные, если вы их специально не сохранили перед уходом в сон. Поэтому никакого третьего раза быть не может. "Раз" всегда первый. Но, повторюсь, я не могу с телефона все это осмыслить.

    Кроме того, вообще вся эта идея плоха, потому что ESP8266 от батарейки работает недолго. Летом мне удавалось работать 5 недель от пары АА. Зимой ситуация будет хуже. Поэтому я и забил на этот проект.

    Если мне сейчас нужно было передавать температуру без стационарного источника питания, я бы взял датчик Zigbee и получал бы с него данные через SLSYS.
     
  2. Airat777

    Airat777 Нерд

    Да я тока начинаю изучать есп, луа. Иерусалимского скачал. Параллельно повторяю ваши или еще у кого проекты. Не получается здесь загрузить не файлы, не фото. Загрузил все на майл. Все файлы которые я использую.
    https://cloud.mail.ru/public/gFMT/mrBrkcSND
     
  3. Airat777

    Airat777 Нерд

    Вложения:

    • screen1.jpg
      screen1.jpg
      Размер файла:
      65,9 КБ
      Просмотров:
      98
  4. ИгорьК

    ИгорьК Гуру

    upload_2022-11-14_9-7-11.png


    Вот смотрите, в вашем логе много отладочной информации. Если взглянуть тот исполняемый файл, что вы выложили здесь, там нет ни одного вывода в консоль.

    Первое умозаключение, которое приходит в голову - передо мной разные файлы. Это ваш косяк. Так нельзя.

    Тем не менее, в данном случае видно, что скрипт пытается опубликовать данные на народный мониторинг, но никакого ответа он него не получает и уходит в сон.
    ------------------------------------

    Какова логика работы скрипта? Устройство просыпается, измеряет температуру, заносит ее в память, при первом включении отправляет на Народный мониторинг и засыпает.

    При следующем включении опять измеряет температуру, сравнивает с записанной и если отклонение невелико - опять спит. Если отклонение большое - отправляет данные.

    На третий раз данные уходят независимо от того, какая разница температуры.

    Кроме того, если отправляются данные, устройство уходит в сон без проверки успеха доставки. Сделано это для того, что если по каким-то причинам у вас в сети Народный мониторинг недоступен - железка будет долбиться к нему и мгновенно просадит батарею.

    Два таймера определяют работу - таймер проверки wifi и таймер отправки в сон.

    ----------------------------------------

    Что в итоге? Устройство при первом включении отправляет данные, а затем - нет.
    Из лога видно, что попытка отправки есть, но устройство улетает в сон.

    Вывод простейший - устройство не успевает подхватить ВАШУ сеть и отправить информацию.
    Почему же это происходит в первый раз? Потому что вы стартуете в ручном режиме, и после подачи питания проходит больше времени: когда вы запускаете вручную скрипт железка уже в сети.

    Поскольку вы учитесь - разбирайтесь с логикой работы и таймерами, дело в них. И перепишите этот скрипт под новую прошивку, будет полезно.
     
  5. Airat777

    Airat777 Нерд

    Даа, и в правду не тот исполняемый файл. Тот с коммментариями, этот тот же без комментов рабочий. Я конечно не дома щас, приду, буду думать. Ну а с этим файлом же она при подаче питания с батареек сначала тоже передает, а потом нет. При включении даже секунд 15 не проходит. А потом когда принудительно она тока через 30 сек в сон уходит, но не передает почему то. 30 сек не хватает передать? В момент ухода в сон принудительно, вайфай уже выключен получается? @ИгорьК
     
  6. ИгорьК

    ИгорьК Гуру

    Это, возможно, особенности вашей сети: устройство пытается отправить данные, но с wifi соединения не происходит.

    Вставляйте в каждую строку отправки print(...) и смотрите где процесс останавливается.
    Попробуйте дополнительно вставить в код "wifi.sta.connect()"

    И, в общем, если вы изучаете проблему - пытайтесь соображать сами, это логика.
    Сейчас мне видится что у вас что-то с сетью, но до конца утверждать не возьмусь, ибо это можно понять только не месте. Экспериментируйте.
     
  7. ИгорьК

    ИгорьК Гуру

    Разбирайтесь с кодом глубже, иначе зачем это все?
     
  8. Sergku

    Sergku Нерд

    совет вам верный дают - идти построчно, пофункционально. я сам на эту удочку попал (луавский асинхрон) когда у меня при попытке запроса через http.get падало с ошибкой не найден днс. в итоге засунул в таймер, в блок успешного получения ип (а именно авторизацию на роутере) функцию и все заработало как надо
     
    ИгорьК нравится это.
  9. ИгорьК

    ИгорьК Гуру

    Здесь тоже можно было бы засунуть выброс в сон в калбэк получения ответа от Народного мониторинга, но с периодичностью раз в 10-15 запросов там происходит большая, до 30 секунд задержка. Поэтому проще поиграть таймером, чем тратить батарейку.

    Вообще, код следовало бы переработать, но все равно овчинка выделки не стоит - от батарейки это долго не работает.
     
  10. Sergku

    Sergku Нерд

    не не, у меня с питанием проблем не будет. я пытаюсь сказать об общей математике по работе с луа (все-таки, разница с ардуиной большая) и трудно даже заметить, банальные вещи сходу. ну, при повторном просмотре кода, все встает на свои места. И все более, чем логично
     
    ИгорьК нравится это.
  11. Airat777

    Airat777 Нерд

    @ИгорьК я в правильном направлении иду? Можете взглянуть на код. 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()
     
  12. Airat777

    Airat777 Нерд

    Lua error: script1.lua:23: function arguments expected near 'local' - такую ошибку выдает. Вот эта строчка: local dataN = "#8E-CE-4E-E2-49-56\n"
     
  13. Sergku

    Sergku Нерд

    имхо тут проблема
     
  14. Airat777

    Airat777 Нерд

    Правильно так? Не пойму, а 0 что значит?
    Код (Text):
    tmr.stop(0)
     
  15. Sergku

    Sergku Нерд

    если я правильно помню, то порядковый номер таймера (их может быть 5 штук). Но, я настоятельно рекомендую использовать сдк 3 версии
     
  16. ИгорьК

    ИгорьК Гуру

    @Airat777, давайте я не буду лично для вас переписывать эту тему. Там есть много про таймер.

    В версии прошивок 1.5 таймеров было шесть или семь, и они имели номера, начиная с 0.
    "tmr.stop(0)" - остановить нулевой таймер в прошивке 1.5. В современных прошивках таймеры имеют названия.

    Вы начали повторять непростой проект на старой прошивке. Это неудачное занятие для начинающего
    Вместо этого лучше читать указанную тему, иначе вы будете задавать вопросы по каждой мелочи.

    В теме про таймер я написал, кажется, все.
     
  17. serg3295

    serg3295 Гуру

    Конструкция 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
     
     
    Sergku нравится это.
  18. Airat777

    Airat777 Нерд

    @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()
     
     
  19. serg3295

    serg3295 Гуру

    А чего на этот код смотреть-то. Он чужой и логика не тривиальная. ИгорьК всё правильно вам сказал:
    Ну а так, навскидку, в первом таймере у вас t - это параметр callback функции (таймер, который вы убиваете) и тут же объявляется глобальная переменная t, которая используется для вычисления временного интервала. Переименуйте её что-ли, может заработает:)
     
  20. Airat777

    Airat777 Нерд

    @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()