Covid-19 en tiempo real ESP32 y LCD

Si desea seguir la situación con respecto a los casos de COVID-19 Coronavirus, puede usar un microcontrolador para esto. Junto con un LCD, puede desarrollar un dispositivo de monitoreo facilmente.

Objetivo:Consultar una página y extraer los casos de Covid-19 a desplegar en el LCD.
Material:

Software:

Diagrama

¿Como funciona?

Hay distintas páginas de orden público que muestran distintos indicadores de este virus a nivel mundial, nosotros mediante el microcontrolador ESP32 vamos a descargar el codigo html de uno de estos sitios y vamos a buscar un patrón en el codigo para identificar la cifra que estamos buscando, una vez obtenida simplemente mostraremos el valor en la pantalla.
En el codigo hay varios parámetros configurables, antes de compilar el codigo es necesario especificar Red y contraseña de tu wifi mediante las variables ssid y password.

El dispositivo esta configurado inicialmente para consultar los valores a nivel mundial, para consultar los valores por país solo es necesario cambiar la url, ya que los valores por país manejan los mismos patrones en la pagina que estamos consultando no es necesario cambiar el codigo.
Ejemplo
Para consultar la cantidad de casos en todo el mundo utilizaremos la siguiente url:
https://www.worldometers.info/coronavirus/

Para México utilizaremos:
https://www.worldometers.info/coronavirus/country/mexico/

Para Estados Unidos(USA):
https://www.worldometers.info/coronavirus/country/us/

Para españa:
https://www.worldometers.info/coronavirus/country/spain/

El proceso se repetira de manera indefinida con frecuencia de 1 minuto

Dispositivo funcionando

Código del microcontrolador


#include <LiquidCrystal_I2C.h>
#include <WiFi.h>
#include <HTTPClient.h>
 
const char* ssid = "ssid";
const char* password =  "passw";
const char* location =  "World"; //Title
const char* url = "https://www.worldometers.info/coronavirus/";
const int lcdRefresh =  5; //5 seconds for show another parameter
const int dataRefresh =  60; //60 seconds
const int lcdColumns = 16;
const int lcdRows = 2;


String totalCases;
String deaths;
String recovered;
int reverseCountSeconds=0;
int parameter=0;

LiquidCrystal_I2C lcd(0x3F, lcdColumns, lcdRows);  

void updateLcd()
{
    lcd.clear(); 
   switch(parameter)
   {
    case 0:
          
          lcd.print(location);
          lcd.print(" cases:");
          lcd.setCursor(0,1);
          lcd.print(totalCases);
          break;
    case 1:
          lcd.clear();
          lcd.print("Deaths:");
          lcd.setCursor(0,1);
          lcd.print(deaths);
          break;
   case 2:
          lcd.clear();
          lcd.print("Recovered:");
          lcd.setCursor(0,1);
          lcd.print(recovered);
          break;
   }
  
   parameter++;
  if(parameter>2)
  {
    parameter=0;
  }  
}

void setup(){
   Serial.begin(115200); 
   //init LCD
   lcd.init();
  // turn on LCD backlight                      
   lcd.backlight();
   WiFi.begin(ssid, password);
  lcd.print("Connecting to");
  lcd.setCursor(0,1);
  lcd.print("wifi...");
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
  
  }
   lcd.clear();
   lcd.print("Connected!!");
}

void loop(){
  

  if ((WiFi.status() == WL_CONNECTED) &&reverseCountSeconds<=0) { //Check the current connection status
    reverseCountSeconds=dataRefresh;
    HTTPClient http;
    http.begin(url); //Specify the URL
    int httpCode = http.GET();                  
    WiFiClient * stream = http.getStreamPtr();
    if (httpCode > 0) { //Check for the returning code
        size_t size = stream->available();
        if(stream->find("maincounter-number"))
        {
           
            stream->find("span");
            stream->find(">");
            totalCases =stream->readStringUntil('<');
            Serial.println(totalCases);
            stream->find("maincounter-number");
            stream->find("span");
            stream->find(">");
            deaths =stream->readStringUntil('<');
            stream->find("maincounter-number");
            stream->find("span");
            stream->find(">");
            recovered =stream->readStringUntil('<');
        }
        Serial.println(httpCode);
      }
    else {
      Serial.println("Error on HTTP request");
    }
 
    http.end(); //Free the resources
  }
  updateLcd();
  delay(lcdRefresh*1000);
  reverseCountSeconds-=lcdRefresh; 
}