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

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

  1. ИгорьК

    ИгорьК Давно здесь

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

    Некоторые пояснения.
    Код (Lua):
    -- реле на 4 ноге
    routerPin = 4
    -- светодиод на 3 ноге
    lightPin = 3

    -- выставили режимы ног
    gpio.mode(routerPin,gpio.OUTPUT)
    gpio.mode(lightPin,gpio.OUTPUT)
    gpio.write(lightPin,gpio.LOW)

    -- попыток до перезагрузки после включения питания:
    trying = 14
    -- количество произведенных размыканий реле:
    restarting = 0
    -- каждая проверка через (миллисекунд):
    checkperiod = 30000

    -- Это непосредственно проверяет коннект
    function check()
        -- Останавливаем таймер, что дергает эту функцию
        -- потому что проверка при отсутствии связи может затянуться
        -- и это вызовет еще один запуск этой функции что есть плохо
        checkTMR:stop()
        -- можете добавлять / убавлять любые сервера:
        local servrs = {"www.google.com", "ya.ru", "www.yahoo.com", "www.mail.ru"}
        -- Счетчик перебора серверов для коннекта
        local servNo = 1

        -- Это задает вопросы серверам
        local function isconnect(srv)
            net.dns.resolve(srv, function(sk, ip)
                if (ip == nil) or (ip == "10.0.0.1") then
                    print("DNS "..servrs[servNo].." fail!")
                    -- пока есть сервера в таблице
                    if servNo < #servrs then
                        servNo = servNo + 1
                        -- зовем сами себя
                        isconnect(servrs[servNo])
                    else
                        -- кончились сервера - запускаем таймер чтобы проверяться через 30 секунд
                        checkTMR:start()
                    end
                else
                    -- После удачного соединения оставляем три попытки до следующей перезагрузки
                    -- и обнуляем количество последовательных перезагрузок
                    trying, restarting = 3, 0
                    checkTMR:start()
                    print("Got IP: "..ip.." at "..servrs[servNo] )
                end
            end)
        end
        isconnect(servrs[1])
    end

    -- Просто щелкаем реле
    function restartRouter()
        -- Опять останавливаем таймер периодических проверок
        checkTMR:stop()
        -- вот оно и дергает ноги реле туда-сюда
        local function relay(muv)
            if muv then
                gpio.write(routerPin,gpio.LOW)
                gpio.write(lightPin,gpio.HIGH)
            else
                gpio.write(routerPin,gpio.HIGH)
                gpio.write(lightPin,gpio.LOW)
            end
        end
        print("Restart Router!")
        -- разомкнули
        relay(true)
        -- создали таймер чтобы замкнуть через 15 секунд
        local stoprelay = tmr.create()
        stoprelay:alarm(15000, 0, function()
            relay(false)
            print("Exit Restart Router!")
            tmr.unregister(stoprelay)
            stoprelay = nil
            countall()
            checkTMR:start()
        end)
    end

    -- дернули реле - считаем:
    function countall()
        -- сделали рестартов
        restarting = restarting + 1
        print("Restart No "..restarting)
        if restarting == 1 then
            -- после первого рестарта - 14 проверок (через 30 секунд/checkperiod каждая)
            trying = 14
        elseif restarting == 2 then
            -- после двух последовательных рестартов - 28 проверок
            trying = 28
        else
            -- после трех - 120 проверок
            trying = 120
        end
    end

    -- это таймер что постоянно запускает функцию проверки связи
    -- создали
    checkTMR = tmr.create()
    -- зарегистрировали что делать
    checkTMR:register(checkperiod, 1, function()
        print("Heap now: "..node.heap())
        local ip = wifi.sta.getip()
        print("Trying: "..trying.." and IP:", ip)
        -- перегружаем роутер если нет wifi после 2 попыток
        if (not ip and trying <= 2) then
            restartRouter()
        -- а если wifi есть, а сайты не пингуются - ждем 4 попытки
        elseif trying <= 0  then
            restartRouter()
        elseif ip then
            print("Check connection")
            check()
        end
        trying = trying - 1
    end)
    checkTMR:start()

    Лог такой:

    upload_2018-2-14_18-11-23.png
     

    Вложения:

    • routerSMALL.zip
      Размер файла:
      883 байт
      Просмотров:
      51
    Последнее редактирование: 16 фев 2018
    naz и sys нравится это.
  2. star003

    star003 Нерд

    Вчера повторил конструкцию. Есть у меня один не очень хороший момент: в момент включения на Пинк 4 - высокий уровень. При перезагрузке роутера он падает в 0. По моему это не хорошо. Где то написано , что сигнал на выходе инвертированный. Может это лечится как то? Если принудительно при включении изменить - то будет щёлкать реле, что совсем не хорошо для роутера.
     
  3. ИгорьК

    ИгорьК Давно здесь

    Тут смотри в чем дело. При старте ESP-8266 ESP-01 обе его свободные ноги должны быть подтянуты к единице, иначе модуль не загрузится.
    Это никак не обойти.

    Поэтому сигнал инвертированный и схема такая корявая. Что было тогда под рукой и как понимал электрический ток - так и наколхозил.

    Для нормального сигнала надо брать любой другой модуль где больше ног. Сейчас тот же NodeMcu недорого стоит, там можно управлять неинвертированно.

    Другой вариант, применять реле не от амперки, а от китайских друзей. У них как раз есть экземпляры, управляемые не единицей, а нулем. Правда, работают они с трехвольтовой логикой или нет - не знаю.

    Давно пора переделать эту железку, да вот в чем проблема - работает уж больно хорошо.
     
    Последнее редактирование: 7 июн 2018
  4. IvanUA

    IvanUA Гик

    Может стоит добавить один транзистор и пару резисторов? Тут тебе и инвертор, тут тебе и согласование по 5 вольтам если надо))))
     
  5. ИгорьК

    ИгорьК Давно здесь

    Это правильно.
    Но... работает оно! :)
     
    IvanUA нравится это.