Translate

quarta-feira, 24 de março de 2021

Teste de link com 2 gateways


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