Нужна помощь 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. Использовать простой модуль радиоудлинителя. У каждой железяки свое применение. Надо под задачу выбирать железку, а не натягивать железяку на задачу. Ведь никто не делает авто представительского класса на шасси Белаза, да и перетачивать Порш под перевозку руды тоже желающих мало.
 
Сверху Снизу