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

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

  1. obuhanoe

    obuhanoe Гик

    Прочитайте все статьи от Игоря от начала и до конца + книга по Lua, вопросов практически не будет по основам.
     
  2. Airat777

    Airat777 Нерд

    @ИгорьК читаю основы по вашим урокам. Таймер переделал работает таймер. Но почему то в функции 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()
     
     
  3. ИгорьК

    ИгорьК Гуру

    Не надо ничего пробовать. Разберитесь как код работает, вы же взялись за него.

    rtcmem... (...) - ключ к пониманию. Смотрите что вы из железки читаете после сна и что пишете. Разбирайтесь как работает код. Ставьте print(...) перед каждой операцией rtcmem.write() и после rtcmem.read(...).
     
  4. Sergku

    Sergku Нерд

    может стоит посмотреть эту переменную
    Это условие и дёргает ваш count. Напечатайте ее значение дебажным принтом
     
  5. Airat777

    Airat777 Нерд

    @ИгорьК заработало. Тока надо write и read делать в ячейке от 65 до 127. Почему то с 1 по 44 недоступно. На форумах где то прочитал что эти ячейки резервирует система вроде. Можно еще вопрос. Как надо сразу ip задать, или что надо еще сделать чтоб к вайфаю быстрее подключалось?
     
  6. ИгорьК

    ИгорьК Гуру

  7. Airat777

    Airat777 Нерд

    Да. Смотрел, сравнивал с вашим кодом в котором вы ip назначаете. Ну где тоже от батарейки. У вас там функция wifi.sta.eventMonStart(), а в realese нет его. Не пойму, как его определить. Как в realese его запустить...
     
  8. serg3295

    serg3295 Гик

    wifi.sta.eventMonStart, wifi.sta.eventMonStop, wifi.eventmon.Reg это устаревшие функции из версии v.1.5.4.1-final.
    Почитайте в документации на эту версию что делают эти функции и сделайте по аналогии.
    Только учтите, что регистрация callback'ов на события wifi должны производиться как можно раньше, то есть при самом старте программы.
     
    ИгорьК нравится это.
  9. Muhin555

    Muhin555 Нерд

    я тоже собрал градусник на батарейках на ESP-01. Вот только вынес его на балкон застекленный и DS18b20 высунул на улицу.... на улице было -13С (на балконе -6С) и через 15 мин две новые батарейки АА стали +2.4В на морозе. Пробовал разные батарейки и GP, Duracell, дешевые из FixPrice - результат одинаковый. И здесь даже никакой DeepSleep не поможет.
     
  10. parovoZZ

    parovoZZ Гуру

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

    ИгорьК Гуру

    ESP можно запускать от батарейки на пару месяцев, но при этом следует учитывать вот что.

    1. Устройство должно измерять температуру и уходить в ГЛУБОКИЙ сон.
    2. Измерять эту температуру лучше пореже - с интервалом минут 15.
    3. Если температура не изменилась более чем на 0.5, а лучше на 1градус - данные не отправлять.
    4. Датчик лучше применять какой-нибудь резистивный, а не DS18b20 ибо оный достаточно жручий.
    5. Если все таки DS18b20, то уменьшить его разрешение - быстрее происходит измерение / меньше корма.
    6. Лучше это будет ESP32. Потому что у нее сон экономнее.
    7. Если это ESP32, то надо посмотреть среди новых моделей - что там с сонным током.
    8. С платы лучше сдуть паяльником микросхему USB-UART - она тоже зря питается.

    Таким образом два месяца оно работает. В некоторых случаях и некоторым личностям этого бывает достаточно.
     
    DetSimen нравится это.
  12. parovoZZ

    parovoZZ Гуру

    а если перейти на BLE маячок, то работать будет ещё дольше. Правда, видеть будут все, кто захочет.
     
  13. Muhin555

    Muhin555 Нерд

    ИгорьК по вашим же комментариям на форуме, модуль ESP-01 может работать при падении напряжения до +2,82В. Здесь же падение напряжения батареек на морозе дошло до +2,4в, соответственно модуль ESP-01 уже не может проснуться из DeepSleep при напряжении +2,4В

    Я использовал ESP-01S у которого нет красного светодиода на питание
    брался ваш скрипт Версия для одного датчика для батареек и готовая прошивка NodeMCU
     
  14. Muhin555

    Muhin555 Нерд

    Пытаюсь найти информацию по модулю CBU из беспроводных датчиков Tyua , он в отличие от ESP работает на морозе от 2-х ААА батареек, но отправляет показания только один раз в час.
    IMG_20240130_120136_.jpg
    IMG_20240212_113222.jpg
    IMG_20240212_113243.jpg
     
  15. ИгорьК

    ИгорьК Гуру

    :) "Не виноватая я"

    Это 2016 год, не так ли? Сейчас я бы сделал кое-что по-другому.
    Если это устройство работает у вас всего четверть часа, то тдело в чем-то другом, нежели в этой версии. Да, в общем, я ни за что и не агитирую :)
     
    Muhin555 нравится это.
  16. Muhin555

    Muhin555 Нерд

    ;-) так я и не наезжаю!!!! Своим первым комментарием просто хотел обратить внимание на то, что батарейки на морозе сами по себе дохнут и не могут обеспечить напряжения для выхода из DeepSleep. А вот watermetr - этот "да", мог протянуть в тепле пару месяцев на батарейках. Жаль что скрипт не совсем доработан был, когда счетчик останавливался так, что геркон оставался замкнутым, то значения уходили в космос..... ))))
     
  17. Muhin555

    Muhin555 Нерд

    Ради прикола задал один и тот же вопрос к двум ИИ и получил ответы...
    Вопрос: "написать скрипт на языке 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 ))))
     
    ИгорьК нравится это.
  18. ИгорьК

    ИгорьК Гуру

    Вся тема насмарку. Теперь ИИ... :)
     
  19. ИгорьК

    ИгорьК Гуру

    Никак его не доработать - это железная особенность.
     
  20. parovoZZ

    parovoZZ Гуру

    Этот фокус давно раскусили. ИИ ничего не пишет - он ищет написанное другими.