Aparelho simples que "ping"a no mesmo endereço, utilizando gateways diferentes e informando Timeout, latência ou latência muito alta. Isso feito no esp8266 mais simples, o esp-01. Útil e simples, mesmo que não utilize a reversão de gateway. O ping é dado 1 vez por segundo, alternando o gateway. No meu caso, o V e o A são iniciais dos provedores.
/*
* Monitoramento de IP com saida para OLED SSD1306 I2C
*
* Necessita do Gerenciador de Placas com Esp8266 v2.7.4
*
* Libraries:
* - Esp8266Ping https://github.com/dancol90/ESP8266Ping
* - SSD1306Wire https://github.com/ThingPulse/esp8266-oled-ssd1306
*
* Lembrar que para DHCP ip=0 ou msk=0 ou gw=0
*
*/
#include <ESP8266WiFi.h>
#include <ESP8266Ping.h>
#include "credentials.h"
#include "FS.h"
#include "SSD1306Wire.h"
//#include "SH1106Wire.h"
// ========================== Definições
// define se há saida serial de informações
#define MOSTRA_SERIAL 1
#define VEL_SERIAL 74880
// define o local
#define CASA 1
// Initialize the OLED display
// D3 -> SDA // D5 -> SCL // Placa NodeMCU 1.0 ou generico com D3=0 e D5=14
#define SDA 2
#define SCL 0
#define VERSAO "wn3"
// ======================= Declarações
char ap_ssid[15] = "config8266";
char ap_pwd[10] = "77777777";
char cl_ssid[15] = WIFI_SSID;
char cl_pwd[10] = WIFI_PASS;
int maxping = 200;
#ifdef CASA
IPAddress cl_ad1(192, 168, 15, 122);
IPAddress cl_ad2(192, 168, 15, 122);
IPAddress cl_mk(255, 255, 255, 0);
IPAddress cl_gw1(192, 168, 15, 1);
IPAddress cl_gw2(192, 168, 15, 2);
IPAddress cl_dns(1, 1, 1, 1);
IPAddress cl_png1(200, 160, 2, 3);
IPAddress cl_png2(200, 160, 2, 3);
#else
IPAddress cl_ad1(172, 16, 1, 11);
IPAddress cl_ad2(172, 16, 1, 11);
IPAddress cl_mk(255, 255, 255, 0);
IPAddress cl_gw1(172, 16, 1, 1);
IPAddress cl_gw2(172, 16, 1, 2);
IPAddress cl_dns(1, 1, 1, 1);
IPAddress cl_png1(200, 160, 2, 3);
IPAddress cl_png2(10, 7, 42, 52);
#endif
IPAddress ap_ad(172, 16, 2, 254);
IPAddress ap_mk(255, 255, 255, 0);
IPAddress gw,cl_png, ad;
int ngw = 1;
SSD1306Wire display(0x3c, SDA, SCL, GEOMETRY_128_32);
// SH1106Wire display(0x3c, SDA, SCL);
// =============== Funções =============
//
void conectar() { // ================================ Conexao wifi
WiFi.softAPConfig(ap_ad, ap_ad, ap_mk); // softAPConfig(ip, gw, msk)
WiFi.softAP(ap_ssid, ap_pwd);
WiFi.mode(WIFI_AP_STA);
WiFi.setAutoConnect(true);
WiFi.setAutoReconnect(true);
display.drawString(0, 0, "Conectando");
do {
#ifdef MOSTRA_SERIAL
Serial.print(".");
#endif
WiFi.begin(cl_ssid, cl_pwd);
WiFi.waitForConnectResult();
delay(100);
display.drawString(0, 20, String(WiFi.status())+" ");
display.display();
} while (WiFi.status() != WL_CONNECTED);
display.clear();
//display.drawString(0, 0, WiFi.localIP().toString());
display.display();
#ifdef MOSTRA_SERIAL
IPAddress myIP = WiFi.softAPIP();
Serial.print("AP IP address: ");
Serial.println(myIP);
#endif
}
void disp(uint col, uint lin, String s) { // ========== Mensagem Oled
display.setColor(BLACK);
display.fillRect(col, lin, 63, 32);
display.setColor(WHITE);
display.drawString(col, lin, s);
}
String formatBytes(size_t bytes){ // ==================== Formata K, G, MB
if (bytes < 1024){
return String(bytes)+"B";
} else if(bytes < (1024 * 1024)){
return String(bytes/1024.0)+"KB";
} else if(bytes < (1024 * 1024 * 1024)){
return String(bytes/1024.0/1024.0)+"MB";
} else {
return String(bytes/1024.0/1024.0/1024.0)+"GB";
}
}
void setup() { // ====================================== Inicializa
Serial.begin(VEL_SERIAL);
// Serial.setDebugOutput(true);
// Monta SPIFFS
if (!SPIFFS.begin()) {
#ifdef MOSTRA_SERIAL
Serial.println("Falha ao montar SPIFFS");
#endif
return;
}
// -------------------------------------
// Inicializa OLED
display.init();
//display.flipScreenVertically();
display.setFont(ArialMT_Plain_24);
display.setTextAlignment(TEXT_ALIGN_LEFT);
display.setContrast(1, 1, 0);
display.setBrightness(1);
display.clear();
// Inicializa defaults
ad = cl_ad1;
gw = cl_gw1;
cl_png = cl_png1;
// -------------------------------------
// Inicializa wifi
// if (ad > 0L && gw > 0L && cl_mk > 0L) {
WiFi.config(ad, cl_dns, gw, cl_mk); // ==== IP estatico
// }
conectar();
// -------------------------------------
#ifdef MOSTRA_SERIAL
WiFi.printDiag(Serial); // MOstra diagnostico de conexao
Serial.print("Connected, IP address: ");
Serial.println(WiFi.localIP());
#endif
}
void loop() { //======================================== Principal
int lin = 0;
String st ="";
WiFi.config(ad, cl_dns, gw, cl_mk);
if(Ping.ping(cl_png, 2)) {
int tempo = Ping.averageTime();
if (tempo > maxping) {
st += String(tempo) + "<";
}
else
{
st += String(tempo);
}
} else {
st += "T.O.";
}
if (ngw == 1) {
ngw = 2;
ad = cl_ad2;
gw = cl_gw2;
cl_png = cl_png2;
// disp(40, 20, st);
st = "v" + st;
disp(0, 0, st);
} else {
ngw = 1;
ad = cl_ad1;
gw = cl_gw1;
cl_png = cl_png1;
// disp(40, 20, st);
st = "a" + st;
disp(64, 0, st);
}
display.display();
#ifdef MOSTRA_SERIAL
Serial.print("@");
#endif
}
credentials.h:
#define WIFI_SSID "wifi"
#define WIFI_PASS "senha"
Biblioteca de partes do Fritzing utilizada no esquema.
Nenhum comentário:
Postar um comentário