#include <Arduino.h>
#include <WiFi.h>
#include <ESPping.h>
#include <mdns.h>
#include <WiFiUdp.h>
#include <U8g2lib.h>
#include "graphics.h"
//#include <ArduinoOTA.h>
#define FUNCTION_3 0x38 // Only for wokwi.com
//U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ 3, /* data=*/ 1, /* reset=*/ U8X8_PIN_NONE); //Low spped I2C
// const char* ssid = "ZTE_721EFD"; // подставить название своей сети WiFi
// const char* password = "6S24V4Q63K"; //подставить пароль свой сети WiFi
const char* ssid = "Wokwi-GUEST"; // подставить название своей сети WiFi
const char* password = ""; //подставить пароль свой сети WiFi
//IPAddress ip(192, 168, 1, 70); //Node static IP
//IPAddress gateway(192, 168, 0, 1);
//IPAddress subnet(255, 255, 255, 0);
//const char* remote_host = "www.ya.ru"; //адрес для пинга
const IPAddress remote_ip(8, 8, 8, 8); // адрес для пинга
unsigned long previousMillis = 0;
// const long interval = 30; //интервал между пингами в сек
const long T_ROUTER = 60; // время ожидания загрузки роутера в сек
const long T_RELAY = 5; // задержка от выключения реле до включения в сек
int PIN_RELAY = 12;
int PIN_LED = 13;
int PIN_BUTTON = 0;
int COUNT_PING = 0; //количество попыток при отсутствия пинга (не задается)
int COUNT_PING_MAX = 2; //максимальное количество отсутствия пинга до перезагрузки роутера
int COUNT_WIFI = 0; //счетчик попыток подключения к WiFi
int COUNT_WIFI_MAX = 60; //300; // Таймаут до перезагрузки роутера при отсутствии WiFi в сек
void IRAM_ATTR Click() // Обязательно объявить IRAM_ATTR для правильного распределения памяти
{ // иначе постоянно ребут по WDT
digitalWrite(PIN_RELAY, LOW); // <=== отключаем питание на розетке
//Serial.println("Реле выключено кнопкой");
}
// Основной модуль реле
void Relay()
{
if (digitalRead(PIN_RELAY) == HIGH) // <===
{
// Serial.println("Реле выключено");
}
delay(T_RELAY * 1000);
digitalWrite(PIN_RELAY, HIGH); //<===
// Serial.println("Реле включено, ждем загрузки роутера");
delay(T_ROUTER * 1000); // ждем загрузки роутера
COUNT_PING = 0; // сбрасываем счетчик неуспешных пингов
COUNT_WIFI = 0; // сбрасываем счетчик попыток подключения к WiFi
previousMillis = 0;
}
void ConnectWIFI()
{
// Serial.println("Подключение к WiFi");
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
// WiFi.config(ip, gateway, subnet);
while (WiFi.status() != WL_CONNECTED)
{
if (COUNT_WIFI <= COUNT_WIFI_MAX)
{
COUNT_WIFI++;
}
else
{
// Serial.println();
Relay(); //перезагружаемся так как нет подключения к WiFi
// Serial.println("Подключение к WiFi");
}
//Serial.println(WiFi.status());
// digitalWrite(PIN_LED, !digitalRead(PIN_LED)); //моргаем зеленым светодиодом
delay(1000);
// Serial.print(".");
}
COUNT_WIFI = 0; // сбрасываем счетчик попыток подключения к WiFi
// Serial.println();
// Serial.print("WiFi подключен, ip : ");
// Serial.println(WiFi.localIP());
//Serial.println(WiFi.status());
// digitalWrite(PIN_LED, LOW); // зажигаем зеленый светодиод
COUNT_PING = 0; // сбрасываем счетчик неуспешных пингов
}
void setup()
{
pinMode(1, FUNCTION_3); //GPIO 1 swap the pin to a GPIO. #define FUNCTION_3 0x38
pinMode(3, FUNCTION_3); //GPIO 3 swap the pin to a GPIO. #define FUNCTION_3 0x38
// pinMode(1, OUTPUT);
// pinMode(3, OUTPUT);
//Wire.begin(1, 3);
pinMode(PIN_LED, OUTPUT);
pinMode(PIN_RELAY, OUTPUT);
pinMode(PIN_BUTTON, INPUT);
digitalWrite(PIN_RELAY, HIGH); //<===
digitalWrite(PIN_LED, LOW);
// Serial.begin(74880);
u8g2.begin();
//u8g2.enableUTF8Print();
//u8g2.setFont(u8g2_font_6x12_tr);
delay(10);
attachInterrupt(PIN_BUTTON, Click, FALLING);
// ArduinoOTA.setHostname("ESP-164D8");
// ArduinoOTA.begin();
// Serial.println("OTA ready");
}
void loop()
{
if (WiFi.status() != WL_CONNECTED) // нет подключения к WiFi
{
ConnectWIFI(); //подключаемся к WiFi
}
u8g2.firstPage();
do {
int val = WiFi.RSSI();
u8g2.drawXBM(113, 0, 15, 16, net_allArray[map(val, 0, -100, 0, 5)]);
u8g2.setFont(u8g2_font_3x5im_mr);
u8g2.setCursor(109, 5);
u8g2.print(val);
} while ( u8g2.nextPage() );
unsigned long currentMillis = millis(); // | <===
if (((currentMillis - previousMillis) >= 30000) && (digitalRead(PIN_RELAY) == HIGH) && (WiFi.status() == WL_CONNECTED))
{
previousMillis = currentMillis;
// Serial.print("Пинг? ==> ");
//Serial.println(remote_host);
// Serial.println(remote_ip);
//if(Ping.ping(remote_host))
if (Ping.ping(remote_ip))
{ //пинг есть
// Serial.print(remote_ip);
// Serial.println(" ==> Понг!");
COUNT_PING = 0;// сбрасываем счетчик неуспешных пингов
} else
{ // пинга нет
// Serial.print("Пинг отсутствует :( ");
COUNT_PING ++;
// Serial.println(COUNT_PING);
}
}
if (COUNT_PING >= COUNT_PING_MAX) // если превышено количество попыток пинга перезагружаем роутер
{
Relay();
}
if (digitalRead(PIN_RELAY) == LOW) // <=== нажата кнопка, перезагружаем роутер
{
Relay();
}
// ArduinoOTA.handle();
}