emrizkis
Published © GPL3+

COVID-19 Monitoring

The project is to make Covid-19 monitoring tools from the API

IntermediateFull instructions provided1,213
COVID-19 Monitoring

Things used in this project

Hardware components

NodeMCU ESP8266 Breakout Board
NodeMCU ESP8266 Breakout Board
×1
Alphanumeric LCD, 16 x 2
Alphanumeric LCD, 16 x 2
×1
Tactile Switch, Top Actuated
Tactile Switch, Top Actuated
×1
Rocker Switch, SPST
Rocker Switch, SPST
×1
Plastic Enclosure, Project Box
Plastic Enclosure, Project Box
×1

Software apps and online services

Arduino IDE
Arduino IDE

Story

Read more

Schematics

Schematic

Code

covid-19-monitor.ino

Arduino
Please to install the ESP8266 package in Arduino IDE, as well as the required libraries. The Arduino JSON library uses version 6.
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <ESP8266HTTPClient.h>
#include <WiFiManager.h>
#include <ArduinoJson.h>

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display

//You can use a host with data from your country check in : services5.arcgis.com
//I took data from every province in my country (Indonesia) from the host
const char* host = "services5.arcgis.com";
String request = "/VS6HdKS0VfIhv8Ct/arcgis/rest/services/COVID19_Indonesia_per_Provinsi/FeatureServer/0/query?where=1%3D1&outFields=Provinsi,Kasus_Posi,Kasus_Semb,Kasus_Meni&returnGeometry=false&outSR=4326&f=json";
const int httpsPort = 443;
const char fingerprint[] PROGMEM = "70580e780c9d727550619d3e4efdb21d64d1e91e"; //SHA1 finger print

//integer data array for COVID-19
int dataCovid[9];
unsigned long previousMillis = 0;
const long intervalGetData = 300000;

unsigned long currentMillis, sleep;

//defines the LCD interrupt pin and backlight pin
#define BUTTON D3
#define BACKLIGHT D4

//function to turn on the LCD when the LCD is off
ICACHE_RAM_ATTR void wakeup(){
  lcd.display();
  digitalWrite(BACKLIGHT, HIGH);
  sleep = millis()+120000;
  Serial.print("lcd Off");
}

//function for displaying data on the LCD
void displayData(int c = 0){
if(c==0){
  
  lcd.clear();
  lcd.setCursor(4,0);
  lcd.print("W"); delay(100); lcd.print("E"); delay(100);
  lcd.print("L"); delay(100); lcd.print("C"); delay(100);
  lcd.print("O"); delay(100); lcd.print("M"); delay(100);
  lcd.print("E"); delay(500);
  
  lcd.clear();
  lcd.setCursor(20,0); lcd.print(F("COVID-19"));
  lcd.setCursor(19,1); lcd.print(F("MONITORING"));
  
  int u;
  for(u=0;u<16;u++){
    lcd.scrollDisplayLeft();
    delay(500);
    }
  }
  else{

  //DKI JAKARTA province
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print(F("DKI "));
  lcd.print(F(">POSITIF"));
  lcd.setCursor(4,1);
  lcd.print(dataCovid[0]);
  delay(2000);

  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print(F("DKI "));
  lcd.print(F(">SEMBUH"));
  lcd.setCursor(4,1);
  lcd.print(dataCovid[1]);
  delay(2000);

  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print(F("DKI "));
  lcd.print(F(">MENINGGAL"));
  lcd.setCursor(4,1);
  lcd.print(dataCovid[2]);
  delay(2000);

  //JABAR province
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print(F("JABAR "));
  lcd.print(F(">POSITIF"));
  lcd.setCursor(4,1);
  lcd.print(dataCovid[3]);
  delay(2000);

  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print(F("JABAR "));
  lcd.print(F(">SEMBUH"));
  lcd.setCursor(4,1);
  lcd.print(dataCovid[4]);
  delay(2000);

  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print(F("JABAR "));
  lcd.print(F(">MENINGGAL"));
  lcd.setCursor(4,1);
  lcd.print(dataCovid[5]);
  delay(2000);

  //JATENG province
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print(F("JATENG "));
  lcd.print(F(">Confirmed"));
  lcd.setCursor(4,1);
  lcd.print(dataCovid[6]);
  delay(2000);

  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print(F("JATENG "));
  lcd.print(F(">Recovered"));
  lcd.setCursor(4,1);
  lcd.print(dataCovid[7]);
  delay(2000);

  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print(F("JATENG "));
  lcd.print(F(">Deaths"));
  lcd.setCursor(4,1);
  lcd.print(dataCovid[8]);
  delay(2000);
  }
}

//function to retrieve data with the API from the host that we access
void getData(){
  WiFiClientSecure httpsClient;    //Declare WiFiClient class object
    
  Serial.println(host);
  Serial.printf("Using fingerprint '%s'\n", fingerprint);

  httpsClient.setFingerprint(fingerprint);
  httpsClient.setTimeout(15000); // 15 Seconds
  delay(1000);

  Serial.println("HTTPS Connecting");

  int r = 0; //repeat counter
  while ((!httpsClient.connect(host, httpsPort)) && (r < 30)) {
    delay(100);
    Serial.print(".");
    r++;
  }
  
  if (r == 30) {
    Serial.println("Connection failed");
  }
  else {
    Serial.println("Connected");
  }

  Serial.print("Requesting: ");
  Serial.println(host + request);

  httpsClient.print(String("GET ") + request + " HTTP/1.1\r\n" +
                    "Host: " + host + "\r\n" +
                    "Connection: close\r\n\r\n");

  Serial.println("Request sent");

  while (httpsClient.connected()) {
    String line = httpsClient.readStringUntil('\n');
    if (line == "\r") {
      Serial.println("Headers received");
      break;
    }
  }

  Serial.println("Payload received:");

  String payload;
  while (httpsClient.available()) {
    payload = httpsClient.readStringUntil('\n');  //Read each row of data
    Serial.println(payload); //print response
  }

  Serial.println("Closing connection");
  
  //MEMBUAT JSON BARU, INI HARUS ADA KARENA JIKA TIDAK KITA AKAN SUSAH MENGAMBIL DATA YANG DIMAU KARENA TERBATASNYA LENGTH UNTUK MEMBUAT ARRAY
  //create new json data to retrieve data from several provinces
  int i;
  String dataCOVID = "{\"title\":\"Data Covid-19\",\"features\":[";
  for(i=1660-28
  ;i<1908-1;i++){
    
    dataCOVID += payload[i];
  
  }
  dataCOVID+="]}";
  Serial.println("JSON BARU: "+ dataCOVID);
  
  char charBuf[300];
  dataCOVID.toCharArray(charBuf, 300);


  //parsing json data from API response
  const size_t capacity = JSON_ARRAY_SIZE(3) + 3*JSON_OBJECT_SIZE(1) + JSON_OBJECT_SIZE(2) + 3*JSON_OBJECT_SIZE(4) + 250;
  DynamicJsonDocument doc(capacity);
  
  //const char* json = "{\"title\":\"Data Covid-19\",\"features\":[{\"attributes\":{\"Provinsi\":\"DKI Jakarta\",\"Kasus_Posi\":2815,\"Kasus_Semb\":204,\"Kasus_Meni\":246}},{\"attributes\":{\"Provinsi\":\"Jawa Barat\",\"Kasus_Posi\":632,\"Kasus_Semb\":41,\"Kasus_Meni\":56}},{\"attributes\":{\"Provinsi\":\"Jawa Tengah\",\"Kasus_Posi\":304,\"Kasus_Semb\":36,\"Kasus_Meni\":41}}]}";
  
  deserializeJson(doc, dataCOVID);
  
  const char* title = doc["title"]; // "Data Covid-19"
  
  JsonArray features = doc["features"];
  
  JsonObject features_0_attributes = features[0]["attributes"];
  const char* features_0_attributes_Provinsi = features_0_attributes["Provinsi"]; // "DKI Jakarta"
  dataCovid[0] = features_0_attributes["Kasus_Posi"]; // 2815
  dataCovid[1] = features_0_attributes["Kasus_Semb"]; // 204
  dataCovid[2] = features_0_attributes["Kasus_Meni"]; // 246
  
  JsonObject features_1_attributes = features[1]["attributes"];
  const char* features_1_attributes_Provinsi = features_1_attributes["Provinsi"]; // "Jawa Barat"
  dataCovid[3] = features_1_attributes["Kasus_Posi"]; // 632
  dataCovid[4] = features_1_attributes["Kasus_Semb"]; // 41
  dataCovid[5] = features_1_attributes["Kasus_Meni"]; // 56
  
  JsonObject features_2_attributes = features[2]["attributes"];
  const char* features_2_attributes_Provinsi = features_2_attributes["Provinsi"]; // "Jawa Tengah"
  dataCovid[6] = features_2_attributes["Kasus_Posi"]; // 304
  dataCovid[7] = features_2_attributes["Kasus_Semb"]; // 36
  dataCovid[8] = features_2_attributes["Kasus_Meni"]; // 41
}

void setup() { 
  //LCD initialization and interrupt button
  pinMode(BACKLIGHT, OUTPUT);
  pinMode(BUTTON, INPUT_PULLUP);
  lcd.init();
  lcd.backlight();
  sleep = 60000;
  digitalWrite(BACKLIGHT, HIGH);
  attachInterrupt(digitalPinToInterrupt(BUTTON), wakeup, CHANGE);
 
  displayData();
  
  Serial.begin(115200);
  Serial.print("Connecting");

  lcd.clear();
  lcd.setCursor(6,0);
  lcd.print("....");
  lcd.setCursor(0,1);
  lcd.print(F("WAITING FOR WIFI"));

  //Connection to WIFI, look for WIFI "COVID-19 MONITORING" then set by you
  WiFiManager wifiManager;  
  wifiManager.autoConnect("COVID-19 MONITORING");

  //If the connection is successful to an SSID, it will print an IP Address
  Serial.println("");  
  Serial.println("Connection Success ");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  lcd.clear();
  lcd.setCursor(3,0);
  lcd.print(F("CONNECTED"));
  lcd.clear();
  lcd.setCursor(4,0);
  lcd.print(F("GETTING"));
  lcd.setCursor(2,0);
  lcd.print(F("FIRST DATA"));
  
  //retrieve data the first time the device is turned on
  getData();
  displayData(1);
  
}

void loop() {

  
  currentMillis = millis();

  int selisih = currentMillis - previousMillis;
  
  //retrieve data every 5 minutes
  if(currentMillis - previousMillis >= intervalGetData){

      previousMillis = currentMillis;

      //debug time
      Serial.println(currentMillis);
      
      getData();
      displayData(1);
  }

  //turn off the LCD if the device has been on for 2 minutes
  if(currentMillis > sleep) {
    lcd.noDisplay();
    digitalWrite(BACKLIGHT, LOW);
  }
  
  Serial.println(selisih);
  displayData(1);
} 

Credits

emrizkis
3 projects • 4 followers

Comments