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

Нужна помощь NodeMCU и потребление

sasa

New member
Здравствуйте, уважаемые форумчане!

Появилась необходимость реализовать следующую задачу: при появлении высокого уровня на одном из GPIO модуля ESP-07 передавать какую-либо информацию на ПК, находящийся в той же сети, что и модуль. В общем поставленную задачу я реализовал (скрипт прилагаю). Вопрос в энергопотреблении, так как модуль должен работать от батареи типа Крона и потреблять минимум возможного.

При запуске модуля ток потребления составляет 70мА и держится таковым порядка 5-7 с. Затем он уменьшается до 20мА и начинает скакать от 20 до 60 мА. При этом модуль находится в состоянии STATION, ничего не передает и просто подключен к роутеру.
Подскажите пожалуйста почему в таком режиме потребление скачет?

Промежутки между появлениями высокого уровня на GPIO модуля могут составлять десятки секунд. Логично, на это время погружать модуль в сон, но время от момента появления высокого уровня до момента передачи сообщения на ПК должно быть не более 1с, т.е. времени на подключение к WiFi нет. Режим deepsleep, как я понимаю, использовать не получится, так как после выхода из этого режима программа начинает выполняться заново (повторное подключение к WiFi и т.д.). Видимо, нужно использовать режимы сна WiFi модема (wifi.sta.sleeptype). Я поигрался со всеми режимами, но ничего путного не получилось - как потребление скакало от 20 до 60 мА, так и скачет. Даже в режиме MODEM_SLEEP, при котором, судя по описанию, связь с роутером теряется, ничего не вышло. Подскажите пожалуйста, как грамотно добиться минимума потребления модуля без потери соединения с точкой доступа, чтобы при появлении высокого уровня на GPIO, сообщение на ПК передавалось без больших задержек? И вообще на практике какого минимального потребления можно добиться в режиме поддержания связи с точкой доступа?

Код:
--подключаемся к точке доступа
ssid,pass = "SSID","PASS";
wifi.setmode(wifi.STATION);
wifi.sta.config(ssid,pass);
wifi.sta.connect();
print("Looking for a connection");
--пока подключаемся выводим "Connecting..." 
tmr.alarm(1, 500, 1, function()
     if(wifi.sta.getip()~=nil) then
          tmr.stop(1) --если подключились, то останавливаем таймер
          print("Connected!")
          print("Client IP Address:",wifi.sta.getip())          
          gpio.mode(2, gpio.INPUT); --задаем GPIO2 как вход
          --при появлении высокого уровня на GPIO2 подключаемся к ПК
          --и передаем "INDICATION"
          gpio.trig(2,"up",function() 
                cl=net.createConnection(net.TCP, 0)
                cl:connect(8080,"192.168.1.75")
                cl:on("connection", function(conn)
                    cl:send("INDICATION", function()
                        print("SENT DATA");
                        cl:close();
                    end);   
                end)     
          end)      
    else
        print("Connecting...")
    end
end)
 

Юрий Ботов

Moderator
Команда форума
Я конечно глупость сейчас скажу... но лучший режим пониженного энергопотребления у контроллеров с wifi это физическое отключение от электропитания. Так уже давно делают в пультах для бытовой техники.
Я сильно сомневаюсь, что вам нужна супер высокая скорость реакции на внешние события (хотя хотеть можно всякое). Думаю реально реакции порядка 1 секунды вполне достаточно. Не стержнями в реакторе управляем.
Поэтому ... допустим есть 2 входа по 1 на которых надо проснуться и квакнуть на сервер. Разрываем цепь питания (точнее земли) espшки и ставим в разрыв два КМОП полевика (важно: с низким напряжением открытия, и достаточно низким сопротивлением в открытом состоянии), я бы поставил 5 вольтовые 2n7000. Затворы полевиков соединяем с 2 соответствующими входами esp. "Вокруг" espшки по питанию разумеется надо поставить конденсаторы, электролит, где нибудь микрофарад на 200 и обычный 0.1 или около того, чтобы как то компенсировать влияние сопротивления полевика. Что получилось? В нормальном состоянии сопротивление полевиков порядка 5 мОм, нагрузки на батарейку практически нет. При "поднятии" одной из ног подается заодно питание на затвор полевика, он открывается и подает питание на контроллер. Контроллер загружается, цепляется к точке доступа, что-то передает и говорит себе что пора спать.
Да... логику программы естественно тоже придется менять.
 
  • Like
Реакции: sasa

Сергей_Ф

Moderator
Команда форума
@Юрий Ботов а почему Вы думаете, что длитеольности импульса открытия хватит на исполнение скрипта? Может он кратковременный, а блокировку отключения питания Вы не предлагаете.
 
  • Like
Реакции: sasa

sasa

New member
@Юрий Ботов, спасибо! Идея понятна! Но в данном случае, как я вижу, есть два ограничения:
1. Сейчас на подключение esp к точке доступа уходит от 2 до 3 сек (в том скрипте, который я прилагал сообщение "Connecting..." успевает появиться 4-6 раз с интервалом в 0.5 сек), а это недопустимо долго. Реакция все-таки должна быть намного быстрее (честно говоря, даже секунды многовато...)
2. То, о чем пишет @Сергей_Ф - длительность импульса может быть различной. Он может быть как кратковременным (менее секунды), так и длительным (несколько секунд). Поэтому действительно придется выдумывать какую-то схему блокировки отключения питания, чтобы esp успела подключиться и передать все, что ей нужно.
Второй пункт решаем, а вот первый... Нужно как-то совместить несовместимое - быстродействие с низким потреблением)
 

Юрий Ботов

Moderator
Команда форума
@Юрий Ботов а почему Вы думаете, что длитеольности импульса открытия хватит на исполнение скрипта? Может он кратковременный, а блокировку отключения питания Вы не предлагаете.
Не имея данных не могу их учитывать. Тем более что блокировка вещь достаточно примитивная.
Нужно как-то совместить несовместимое - быстродействие с низким потреблением
Отказаться от wifi. Использовать простой модуль радиоудлинителя. У каждой железяки свое применение. Надо под задачу выбирать железку, а не натягивать железяку на задачу. Ведь никто не делает авто представительского класса на шасси Белаза, да и перетачивать Порш под перевозку руды тоже желающих мало.
 
Сверху Снизу