ESP8266: Автоматическая перезагрузка роутера. Бюджетный вариант.

Тема в разделе "Глядите, что я сделал", создана пользователем ИгорьК, 18 апр 2015.

  1. ИгорьК

    ИгорьК Гуру

    Последний вариант прошивки здесь.

    Самый последний вариант (UPD 14/02/2018): здесь.

    Работает это так:


    Мы видим устройство с белым огоньком: оно трудится и потеет. Сеть мониторится через WiFi, провода там лишь для доставки электронов с размахом 3,3 вольта.
    Перегружаем компьютером роутер: интернет, естественно, теряется. Как следствие, на устройстве гаснет фара, зато срабатывает реле на размыкание (типа роутер отключили от сети чтобы перезагрузить), на нем загорается светодиод - смотрите внимательно, видно его. Через некоторое время устройство заново входит в режим надзора за сетью, что означает подачу питания на роутер и возобновление проверки через установленное время.

    UPD. Торжественная передача вахты от UNO к ESP8266. (Предыдущий проект на Ардуино).
    205.jpg
    Перед заступлением на дежурство:
    284.jpg

    UPD. 01.10.2015. Краткое описание логики работы, для тех, кому необходимо.


    Внимание! Логика работы последней версии изменена. Описание в соответвующем сообщении.

    1. После включения, модуль запускает скрипт init.lua. Его задача - затормозить деятельность на 20 секунд, за которые через Esplorer на модуль можно послать команду на остановку Таймера 0. Если она послана за это время - устройство останавливается, если нет - запускается основной скрипт, в данном случае netCheck02003.lua.

    2. Реле устройства работает на размыкание. То есть, после старта устройства, оно не срабатывает! Реле сработает только в том случае, если нет Интернета или WiFi - разомкнет розетку, в которую включен роутер и модем, у кого он есть.

    3. При старте основного скрипта число попыток проверки устанавливается в - (минус!)14. Проверка соединения осуществляется сразу, каждый раз через 30 секунд, причем, если Интернет уже есть (то есть мы запустили устройство, а Интерент работал) счетчик проверок сразу обнуляется. В ином случае, модуль при каждой неудачной проверке увеличивает количество на единицу. Как только число неудачных проверок достигнет трех - реле получает команду на 10 секундное размыкание.
    Таким образом, при общем старте, когда интернет соединения нет, размыкание произойдет ((14 + 3) х 30 секунд)/60сек = 8,5 минут. Если за это время Интренет появится - счетчик будет сброшен в 0.

    4. При каждой проверке (через 30 секунд) счетчик устанавливается в единицу. Удачная проверка его сбрасывает.

    5. При неудачной проверке - счетчик увеличивается, 3 проверки - перезагрузка. При перезагрузке увеличивается на единицу счетчик перезагрузок. После первой перезагрузки счетчик проверок устанавливается в -14, чтобы очередная перезагрузка прошла через 8,5 минут. Если она оказывается неудачной - счетчик проверок устанавливается в -28. То есть следующая перезагрузка произойдет через 17 минут. Если и она окажется неудачной, счетчик устанавливается в -120, что будет вызывать перезагрузку каждый час.
    Любое удачное соединение с Интернетом обнуляет счетчик проверок и счетчик перезагрузок.

    6. При старте основного скрипта, нога светодиода устанавливается в ноль, в этом случае диод должен загореться. Потому ка плюсом он соединен (через резистор) к шине питания, а минусом - к ноге модуля. При срабатывании реле этот диод гаснет на время срабатывания.

    7. Работу модуля можно проверять не вставляя его в устройство - в UART порт он выдает некоторую информацию. "time is money" - проверка сети прошла успешно. "Restart No...(количество рестартов подряд) " - когда подается команда на реле. "Exit Restart Router!" - выключение реле. "Trying: (номер проверки), нормально - 1" - перед каждой проверкой, предыдущая была удачной. В ином случае число проверок будет другим. "No Time" - проверка прошла, удачная или неудачная. Модуль будет ожидать 30 секунд до следующей.
     
    Последнее редактирование: 23 июл 2018
    Un_ka, sys, Securbond и ещё 1-му нравится это.
  2. ИгорьК

    ИгорьК Гуру

    1. Собираем схему. Реализация может быть различной, но следует учитывать, что пины 3 и 4 во время включения модуля должны быть подцеплены к единице. У меня получилось так:
    [​IMG]

    Заводим устройство в сеть, выполняем следующие команды:
    Код (Lua):
    wifi.setmode(wifi.STATION)
    wifi.sta.config("APName","Password")
    wifi.sta.autoconnect(1)
    Если не заводится - у вас новая прошивка.
    Идем сюда.


    2. Заливаем две программки, а именно
    netCheck02003.lua. Считаю эту версию beta. Почищу еще код, возможно сделаю оповещение домашнего мозга о причинах перезагрузки. (У меня точка доступа к интернету и wifi роутер - разные устройства).
    Код (Lua):
    -- works beta!
    time = ""
    trying = - 14
    routerPin = 4
    lightPin = 3
    gpio.mode(routerPin,gpio.OUTPUT)
    gpio.mode(lightPin,gpio.OUTPUT)
    gpio.write(lightPin,gpio.LOW)
    nowifi = false
    noconnect = false
    restarting = 0
    togglepin = 0
    offrout = false -- роутер выключен

    function getTime()
        conn=net.createConnection(net.TCP, 0)
        conn:on("connection",function(conn, payload)
            conn:send("HEAD / HTTP/1.1\r\n"..
                    "Host: google.com\r\n"..
                    "Accept: */*\r\n"..
                    "User-Agent: Mozilla/4.0 (compatible; esp8266 Lua;)"..
                    "\r\n\r\n")
            connection = conn
        end)
        conn:on("receive", function(conn, payload)
                --time = string.sub(payload,string.find(payload,"Date: ")+23,string.find(payload,"Date: ")+31)
                print("time is money")
                noconnect, trying, restarting = false, 0, 0
                conn:close()
        end)
        --conn:connect(80,'google.com')
        conn:connect(80,'ya.ru')

    end

    function restartRouter()

        if offrout == false then
            gpio.write(routerPin,gpio.LOW)
            gpio.write(lightPin,gpio.HIGH)
            togglepin = tmr.now() + 10000000
            offrout = true
            restarting = restarting + 1
            print("Restart No "..restarting)
                if restarting == 1 then
                    trying = -14
                elseif restarting < 3 then
                    trying = -28
                else
                    trying = -120
                end
        end

        if togglepin < tmr.now() then
            gpio.write(routerPin,gpio.HIGH)
            gpio.write(lightPin,gpio.LOW)
            offrout = false
        end
        print("Exit Restart Router!")
    end

    getTime()

    tmr.alarm(0, 30000, 1, function()
        trying = trying + 1
        print("Trying: "..trying)
        if offrout == true then
            restartRouter()
        end
        if trying > 0 then
            ip = wifi.sta.getip()
                print(ip)
            if ip=="0.0.0.0" or ip==nil then
                  restartRouter()
            end
         
            if ((offrout == false) and (trying < 3)) then
                time="No Time"
                print(time)
                getTime()
            else
                restartRouter()
            end
        end
    end)
     
    init.lua
    Код (Lua):
    do
    FileToExecute="netCheck02003.lua"
    l = file.list()
    for k,v in pairs(l) do
      if k == FileToExecute then
        print("*** You have got 20 sec to stop timer 0 ***")
        print("*******    Execute: tmr.stop(0)    *******")
        tmr.alarm(0, 20000, 0, function()
          print("Executing ".. FileToExecute)
          dofile(FileToExecute)
        end)
      end
    end
    end
     
    Перезагружаем. Устройство не имеет шанса не работать.

    UPD. 20.06.2015. Полет нормальный. Ну очччччень доволен!
     
    Последнее редактирование: 12 сен 2017
    sys нравится это.
  3. Djvan

    Djvan Нерд

    Здравствуйте. А можете подсказать как залить эти файлы на есп? Как я понимаю :
    1)- нужно сначала прошить есп спец прошивкой? В инете поискал - нужна прошивка NodeMcu? (или есть ссылка на ту, которой вы прошивали?)
    2)потом esplorer'ом - закидываю на нее два этих файла.(или с помощью другой программы?)
    3)Потом надо выполнить эти три строки- с помощью какого нибудь терминала (можно вот эту часть поподробнее плиз)

    А то хочу на выходных тоже поставить такую розеточку, что то роутер частенько зависает - вот и хотелось бы получить стабильность :)

    Заранее спасибо за ответы :)
     
  4. geher

    geher Гуру

    Если я правильно понял, то nodeMCU - это вчерашний день. Актуально - EspLua
     
  5. ИгорьК

    ИгорьК Гуру

    1. Да. Сначала модуль необходимо прошить NodeMCU. Используйте флашер вот отсюда: https://github.com/nodemcu/nodemcu-flasher. При прошивке следует модуль включать так:
    [​IMG]
    2. Да, именно Esplorer.
    3. И три команды выполняются им же. Но!!!!! Это пункт 2. Файлы загружаются после этого.
     
  6. ИгорьК

    ИгорьК Гуру

  7. Djvan

    Djvan Нерд

    Блин - не получается чтото :( Качаю прошивальщик, в в нем выбираю прошивку nodemcu_integer_0.9.5_20150318.bin -
    прошиваю ей. После чего запускаю esplorer. там соединяюсь с модулем, снизу в окошке Send - отправляю построчно
    wifi.setmode(wifi.STATION) // нажимаю send
    wifi.sta.config("APName","Password") //свой ссид и пароль - нажимаю send
    wifi.sta.autoconnect(1) //нажимаю send

    после чего в разделе scripts загружаю netCheck02003.lua - и нажимаю Save to ESP
    далее там же загружаю init.lua - и нажимаю Save to ESP

    после чего я вижу, что в esp находятся 2 файла. Переагружаюсь - но тишина и покой - диод красный горит. но соединений никаких не происходит. Мне кажется у меня косяк где то в пункте 2 - где задается сеть и пароль :( может как то подругому эти три команды отправлять??? Подскажите пожалуйста. С esp только начинаю работать - пока сделал с помощью прошивки хом смарт погодную станцию для дачи, вот хочется еще поиграться с модулями - но пока чтото подтупливаю на базовых частях :(
     
  8. ИгорьК

    ИгорьК Гуру

    1. После трех команд на установку сети сделайте:
    Код (Lua):
    =wifi.sta.getip()
    Посмотрите, происходит ли соединение с сетью. Сейчас точно не помню - название сети и пароль надо вводить в кавычках или нет. Убедитесь что вы завели устройство в сеть.

    2. Внимательно посмотрите на то, как Вы собрали устройство. В момент его старта цифровые ноги не должны быть притянуты к земле - иначе устройство не стартует! Это очень важно. Изучите внимательно эту тему.
     
    Последнее редактирование: 30 сен 2015
  9. Djvan

    Djvan Нерд

    спасибо. вечером буду пробовать. пока все на макетке собрал - может действительно где то контакта нет - вечером спаяю - посмотрю.
     
  10. DIceberg

    DIceberg Гик

    А GPIO0 точно на землю посажен? А то я долго на этом моменте зависал... Посмотрите тут, мож поможет: http://smart-el.ru/?p=130 http://smart-el.ru/?cat=4
     
  11. Djvan

    Djvan Нерд

    Вы имеете ввиду при прошивке сажать его на минус? Это да - притягиваю на минус - прошивка ставится, доступ имеется к модулю, по есплореру подключаюсь и луа закидываю.... А если про сам проект - то там жпио 0 идет к диоду через резистор....
     
  12. DIceberg

    DIceberg Гик

    Сорри не понял вопрос, а передачу управления на скрипт даете?
    wifi.setmode(wifi.STATION)

    wifi.sta.config(«SSID»,»password»)

    wifi.sta.autoconnect(1)

    dofile(‘temp.lua’)

    в init.lua должна быть эта строчка
     
  13. Djvan

    Djvan Нерд

    Подождите - тут же нигде про это не указано - и вроде как в файле init.lua есть
    do
    FileToExecute="netCheck02003.lua"

    а как я понял - инит луа автоматом стартует при запуске? Чтото я уже запутался :)
     
  14. ИгорьК

    ИгорьК Гуру

    Инит стартует автоматически, ждет 20 секунд и запускает основной файл.
    Его задача - просто ждать 20 сек. В этот момент можно остановить таймер и основной файл не будет запущен.
     
  15. ИгорьК

    ИгорьК Гуру

    Она там есть: dofile(FileToExecute)
     
  16. DIceberg

    DIceberg Гик

    А в ините не прописывается какой именно запускать? Их может быть несколько. К примеру в одном библиотеки, в другом основная прога. Я не пробовал через FileToExecute, но dofile(‘temp.lua’) работает точно. (temp - это моя основная программа)
     
  17. ИгорьК

    ИгорьК Гуру

    Так FileToExecute="netCheck02003.lua" - а это и есть имя главной программы в нашем случае.
     
  18. geher

    geher Гуру

    Просто пытался скачать nodemcu, а получал 404. Оказалось, просто ссылка была немного не туда. Причем эта неправильная ссылка была сразу на нескольких найденных ресурсах, посвященных ESP8266.
    Например, тут: http://esp8266.ru/esp8266-nodemcu/
     
  19. Djvan

    Djvan Нерд

    нифига не могу понять. Прошился заново. Все норм - адрес получает. Два файла в ней. Отключаюсь, подключаю по схеме. Горит красный диод, реле ВЫКЛЮЧЕНО. Через какое то время начинает мигать синий диодик, и опять тишина - ни диод ни реле не работают. У меня честно говоря мозг кипит :( вчера два часа сидел, сегодня уже три часа - нифига не получается :(
     
  20. ИгорьК

    ИгорьК Гуру

    Если WiFi потерян и диод погас - устройство сработало. Возможно проблема в реле?
    Кстати, модуль можно и не вставлять в устройство. Запускайте его в Есплорер и смотрите в терминале что он выдаёт.
     
    Последнее редактирование: 30 сен 2015