What If Your Link Crashes?

by Fernando Koyanagi in Circuits > Electronics

841 Views, 1 Favorites, 0 Comments

What If Your Link Crashes?

E se o seu link cair?
1.png
demo.png

In this video, we will create a link drop sensor with an ESP32 and a SIM800. This means that with this project, we can verify the connection to the internet, and in the event of a connection failure, call a telephone number to notify that the network is in trouble.

This is one many ways you can perform this type of monitoring. While it's simple, it allows you to test various devices that may exist within your CPD. Its power of check becomes much greater when using the ESP32. Though I use WiFi in this example, you can use wired internet, if you prefer.

Assembly

7.png

Assembly – Table

8.png

TFT_eSPI Library

9.png
10.png

In the Arduino IDE, go to Sketch-> Include

Library-> Manage Libraries ...

Install TFT_eSPI

Go to the library folder and change the lines of the User_Setup.h file to leave it as shown in the image.

ESP32_Check_Internet_Connection.ino

Includes and define

#define TINY_GSM_MODEM_SIM800
#include <TinyGsmClient.h>

#include <WiFi.h>

#include <TFT_eSPI.h>

#include <SPI.h>

//Mude para o nome e senha da sua rede WiFi que quer testar #define SSID "SSID" #define PASSWORD "12345678" //+55 DDD Número do celular #define USER_PHONE_NUMBER "+5518912345678" //Tempo que deve esperar para considerar como desconectado #define MAX_DISCONNECTED_TIME 10000 //10 seg //Tempo que deve esperar para cada ligação #define MAX_CALL_TIME_INTERVAL 1800000 //30 min //Usar serial 1 para o módulo gsm HardwareSerial SerialGSM(1); TinyGsm modemGSM(SerialGSM); //Tempo em que conectou à internet pela última vez uint32_t lastTimeConnected = 0; //Tempo em que fez a última ligação. Colocamos como -MAX_CALL_TIME_INTERVAL para ligar imediatamente //da primeira vez que cair uint32_t lastTimeCalledPhone = -MAX_CALL_TIME_INTERVAL; //Pinagem em User_Setup.h na pasta da biblioteca TFT_eSPI display = TFT_eSPI();

Setup

void setup()
{ Serial.begin(115200); setupDisplay(); //Inicializa e configura o display setupGSM(); //Inicializa o módulo GSM xTaskCreatePinnedToCore( checkWiFiConnection, //Função que será executada "checkWiFiConnection", //Nome da tarefa 10000, //Tamanho da pilha NULL, //Parâmetro da tarefa (no caso não usamos) 2, //Prioridade da tarefa NULL, //Caso queria manter uma referência para a tarefa que vai ser criada (no caso não precisamos) 0); //Número do core que será executada a tarefa (usamos o core 0 para o loop ficar livre com o core 1) xTaskCreatePinnedToCore( checkInternet, //Função que será executada "checkInternet", //Nome da tarefa 10000, //Tamanho da pilha NULL, //Parâmetro da tarefa (no caso não usamos) 2, //Prioridade da tarefa NULL, //Caso queria manter uma referência para a tarefa que vai ser criada (no caso não precisamos) 0); //Número do core que será executada a tarefa (usamos o core 0 para o loop ficar livre com o core 1) }

SetupDisplay

void setupDisplay()
{ display.init(); //Inicializa o display display.setRotation(1); //Rotaciona display.fillScreen(TFT_BLUE); //Limpa o display com a cor azul display.setTextColor(TFT_WHITE, TFT_BLUE); //Coloca o texto como branco com fundo azul display.setTextWrap(false, false);//Desativa a quebra de linha display.setTextSize(1); //Muda o tamanho do texto display.setCursor(0, 0, 2); //Posição x, y e fonte do texto }

SetupGSM

void setupGSM()
{ showDisplay("Setup GSM"); //O Módulo GSM está nos GPIOs 4 e 2 SerialGSM.begin(9600, SERIAL_8N1, 4, 2, false); delay(1000); //Restart o módulo if (!modemGSM.restart()) { ESP.restart(); return; } //Espera pela rede celular if (!modemGSM.waitForNetwork()) { display.setCursor(0, 0); showDisplay("GSM Network Error"); delay(3000); ESP.restart(); return; } }

checkWiFiConnection

void checkWiFiConnection(void* p)
{ while(true) { //Se não estiver conectado ao roteador if(WiFi.status() != WL_CONNECTED) { //Manda conectar connectWiFi(); } //Delay de 1s da tarefa. É feita em ticks. Para executar em millis dividimos pela constante portTICK_PERIOD_MS TickType_t taskDelay = 1000 / portTICK_PERIOD_MS; vTaskDelay(taskDelay); } }

connectWiFi

void connectWiFi()
{ //Manda conectar ao roteador com o nome e senha WiFi.begin(SSID, PASSWORD); Serial.println("Connecting"); //Espera no while até conectar while(WiFi.status() != WL_CONNECTED) { Serial.print("."); delay(500); } //Se chegou aqui está conectado Serial.println(); Serial.println("Connected"); }

checkInternet

void checkInternet(void* p)
{ //Delay de 5 segundos da tarefa. É feita em ticks. Para executar em millis dividimos pela constante portTICK_PERIOD_MS TickType_t taskDelay = 5000 / portTICK_PERIOD_MS; while(true) { //Se tem internet if(hasInternet()) { //Atualiza o tempo em que aconteceu a útlima conexão lastTimeConnected = millis(); } //Aplica o delay vTaskDelay(taskDelay); } }

hasInternet

bool hasInternet()
{ WiFiClient client; //Endreço IP do Google 172.217.3.110 IPAddress adr = IPAddress(172, 217, 3, 110); //Tempo limite para conexão client.setTimeout(5); //Tenta conectar bool connected = client.connect(adr, 80); //Fecha a conexão client.stop(); //Retorna true se está conectado ou false se está desconectado return connected; }

Loop

void loop()
{ //Se está desconectado por mais tempo que definimos if(isDisconnectedForTooLong()) { //Mostra no display que está desconectado showDisplay("Disconnected"); //Se faz tempo que não liga para o telefone definido if(hasNotCalledPhoneInAWhile()) { //Liga para o telefone definido callPhone(); } } else { //Mostra no display que está conectado showDisplay("Connected"); } //Espera 1 segundo para a próxima iteração do loop delay(1000); }

isDisconnectedForTooLong

bool isDisconnectedForTooLong()
{ //Retorna true se o tempo desde a última conexão for maior que o definido return millis() - lastTimeConnected > MAX_DISCONNECTED_TIME; } bool hasNotCalledPhoneInAWhile() { //Retorna true se o tempo desde a última ligacão para o telefone for maior que o definido return millis() - lastTimeCalledPhone > MAX_CALL_TIME_INTERVAL; }

callPhone

void callPhone()
{ //Faz a ligação para o telefone definido if(modemGSM.callNumber(USER_PHONE_NUMBER)) { //Se entrou aqui é porque conseguiu realizar a ligação Serial.println("callphone ok"); //Atualiza o tempo em que foi feita a última ligação lastTimeCalledPhone = millis(); } else { //Se entrou aqui é porque não conseguiu fazer a ligação Serial.println("callphone failed"); } //Termina a ligação modemGSM.callHangup(); }

showDisplay

void showDisplay(String message)
{ //Mostra a mensagem na primeira linha do display, limpando os eventuais caracteres extras display.setCursor(0, 0); display.println(message + " "); }

Download the Files