#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);
}
Comments