ESP8266 Monitor Data COVID-19 Waktu-Nyata
|
Jika Anda masih harus duduk di rumah karena COVID-19, ada banyak waktu untuk bermain-main. Terakhir kali kami bekerja dengan ESP32, kali ini kami bereksperimen dengan mikrokontroler ESP8266. ESP8266 Monitor Data COVID-19 Waktu-Nyata ini dapat dibandingkan dengan ESP32 COVID-19 CORONA Tracker. Sekali lagi kami menggunakan data dari Coronavirus Disease (COVID-19) GIS Hub dan kami memprogram “sketsa” kecil di Arduino IDE. Pada artikel ini, saya menggunakan ESP-WROOM-02 (dari VNGSystems di Gouda) tetapi tentu saja, Anda dapat menggunakan papan pengembangan ESP8266 lainnya.


Arduino IDE & Arduino core untuk ESP8266
Pertama-tama, Arduino IDE harus diinstal di komputer Anda. Jika Anda belum melakukannya, baca artikel “Arduino IDE: Menginstal di Windows 10“. Jika Anda menggunakan Linux, maka pilih “Arduino IDE: Instal atau tingkatkan di Linux“.
“Arduino core untuk chip WiFi ESP8266” juga harus diinstal. Lihat bab “Memasang inti ArPino ESP8266” di blog “ESP8266 NodeMcu dan Arduino IDE di Linux“. Prosedurnya sama untuk Linux dan Windows.
ESP8266 Monitor Data COVID-19 Waktu-Nyata dengan ESP-WROOM-02
Jika Anda juga menggunakan ESP-WROOM-02 untuk proyek ini, baca artikel “WEMOS D1 Esp-Wroom-02 dan Arduino IDE“. Di sini Anda dapat membaca bagaimana Anda dapat menginstal pustaka ThingPulse ESP8266 OLED SSD1306 dan pustaka Brzo I2C untuk tampilan selain di atas.
ArduinoJson library
Akhirnya, Anda membutuhkan perpustakaan ArduinoJson. Anda dapat menginstalnya dengan manajer perpustakaan di Arduino IDE.
Coronavirus Disease (COVID-19) GIS Hub API
Maka, tentu saja, kita membutuhkan data. Ini dapat ditemukan, misalnya, di situs web GIS Hub Coronavirus Disease (COVID-19). Menggunakan Explorer API di situs web itu, Anda dapat membuat URL kueri yang benar untuk REST API. Anda dapat membaca bagaimana melakukan ini di blog COVID-19 CORONA Tracker: ESP32 & Arduino IDE.


Hasilnya adalah URL seperti ini:
https://services1.arcgis.com/0MSEUqKaxRlEPj5g/arcgis/rest/services/Coronavirus_2019_nCoV_Cases/FeatureServer/1/query?where=Country_Region%20like%20'%25SWEDEN%25'&outFields=Last_Update,Confirmed,Deaths,Recovered&returnGeometry=false&outSR=4326&f=json
Ini akan menghasilkan data JSON berikut:
{ "objectIdFieldName": "OBJECTID", "uniqueIdField": { "name": "OBJECTID", "isSystemMaintained": true }, "globalIdFieldName": "", "geometryType": "esriGeometryPoint", "spatialReference": { "wkid": 4326, "latestWkid": 4326 }, "fields": [ { "name": "Last_Update", "type": "esriFieldTypeDate", "alias": "Last Update", "sqlType": "sqlTypeOther", "length": 8, "domain": null, "defaultValue": null }, { "name": "Confirmed", "type": "esriFieldTypeInteger", "alias": "Confirmed", "sqlType": "sqlTypeOther", "domain": null, "defaultValue": null }, { "name": "Deaths", "type": "esriFieldTypeInteger", "alias": "Deaths", "sqlType": "sqlTypeOther", "domain": null, "defaultValue": null }, { "name": "Recovered", "type": "esriFieldTypeInteger", "alias": "Recovered", "sqlType": "sqlTypeOther", "domain": null, "defaultValue": null } ], "features": [ { "attributes": { "Last_Update": 1585416253000, "Confirmed": 3069, "Deaths": 105, "Recovered": 16 } } ] }
ArduinoJson Assistant code generator
Kami dapat menghasilkan kode yang diperlukan untuk membaca data JSON dengan “ArduinoJson Assistant” online. Rekatkan data JSON yang kami buat di atas ke dalam Asisten, dan situs web akan menghasilkan kode.


Kami mengambil baris yang diperlukan dari kode itu, dan menyesuaikan garis dengan “deserializeJson”, seperti yang ditunjukkan di bawah ini:
const size_t capacity = JSON_ARRAY_SIZE(1) + JSON_ARRAY_SIZE(4) + JSON_OBJECT_SIZE(1) + 2 * JSON_OBJECT_SIZE(2) + JSON_OBJECT_SIZE(4) + 3 * JSON_OBJECT_SIZE(6) + 2 * JSON_OBJECT_SIZE(7) + 690; DynamicJsonDocument doc(capacity); deserializeJson(doc, payload); JsonArray fields = doc["fields"]; JsonObject features_0_attributes = doc["features"][0]["attributes"];
Kode ini telah dimasukkan dalam sketsa di bawah ini.
ESP8266 Monitor Data COVID-19 Waktu-Nyata: Certificate fingerprint
Akhirnya, kita memerlukan sidik jari sertifikat situs web untuk dapat membuat koneksi https dengan ESP8288. Untuk peramban Google Chrome di Windows 10, Anda dapat menemukannya sebagai berikut. Pertama, klik pada kunci di sebelah URL. Kemudian pilih “Sertifikat” di menu dropdown.


Kemudian di jendela berikutnya, klik pada tab “Detail” dan gulir ke bawah ke “Fingerprint”. Pada kotak di bawah ini Anda sekarang akan melihat sidik jari yang dapat Anda tempel-tempelkan ke sketsa.


Dalam sketsa itu terlihat seperti ini:
const char fingerprint[] PROGMEM = "70580e780c9d727550619d3e4efdb21d64d1e91e"; //SHA1 finger print
Anda akan menemukan aturan ini dalam sketsa di bawah ini.
ESP8266 Monitor Data COVID-19 Waktu-Nyata Sketsa
Semua hal di atas akhirnya digabungkan dalam sketsa di bawah ini. Seperti biasa di blog ini, ini hanyalah sebuah contoh. Gunakan di proyek Anda sendiri dan buat sesuatu yang menarik!
Anda juga dapat mengunduh kode ini dari GitHub: https://github.com/oneguyoneblog/COVID-19-Corona-ESP8266
#include <ESP8266WiFi.h> #include <WiFiClientSecure.h> #include <ESP8266HTTPClient.h> #include "SSD1306Brzo.h" #include <ArduinoJson.h> SSD1306Brzo display(0x3c, 5, 4); // Initialize OLED display const char* ssid = "yournetworkname"; const char* password = "yournetworkpassword"; const char* host = "services1.arcgis.com"; String request = "/0MSEUqKaxRlEPj5g/arcgis/rest/services/Coronavirus_2019_nCoV_Cases/FeatureServer/1/query?where=Country_Region%20like%20'%25SWEDEN%25'&outFields=Last_Update,Confirmed,Deaths,Recovered&returnGeometry=false&outSR=4326&f=json"; const int httpsPort = 443; const char fingerprint[] PROGMEM = "70580e780c9d727550619d3e4efdb21d64d1e91e"; //SHA1 finger print void setup() { Serial.begin(115200); Serial.print("Connecting"); delay(1000); WiFi.mode(WIFI_OFF); //Prevents reconnection issue delay(1000); WiFi.mode(WIFI_STA); //Station mode WiFi.begin(ssid, password); //Connect to WiFi display.init(); // Initialise the display display.setTextAlignment(TEXT_ALIGN_LEFT); display.setFont(ArialMT_Plain_16); display.drawString(0, 0, "Connecting"); display.display(); // Write the buffer to the display while (WiFi.status() != WL_CONNECTED) { // Wait for connection delay(500); Serial.print("."); } Serial.println(""); //If connection successful show IP address of ESP8266 in serial monitor Serial.print("Connected to "); Serial.println(ssid); Serial.print("IP address: "); Serial.println(WiFi.localIP()); } void loop() { WiFiClientSecure httpsClient; //Declare object of class WiFiClient 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; //retry 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 Line by Line Serial.println(payload); //Print response } Serial.println("Closing connection"); char charBuf[500]; payload.toCharArray(charBuf, 500); const size_t capacity = JSON_ARRAY_SIZE(1) + JSON_ARRAY_SIZE(4) + JSON_OBJECT_SIZE(1) + 2 * JSON_OBJECT_SIZE(2) + JSON_OBJECT_SIZE(4) + 3 * JSON_OBJECT_SIZE(6) + 2 * JSON_OBJECT_SIZE(7) + 690; DynamicJsonDocument doc(capacity); deserializeJson(doc, payload); JsonArray fields = doc["fields"]; JsonObject features_0_attributes = doc["features"][0]["attributes"]; String Confirmed = features_0_attributes["Confirmed"]; String Deaths = features_0_attributes["Deaths"]; String Recovered = features_0_attributes["Recovered"]; long Last_Update = features_0_attributes["Last_Update"]; // not used yet display.clear(); // Clear OLED display display.setTextAlignment(TEXT_ALIGN_LEFT); display.setFont(ArialMT_Plain_16); display.drawString(0, 0, "Conf: " + Confirmed); display.drawString(0, 24, "Dead: " + Deaths); display.drawString(0, 48, "Recv: " + Recovered); display.display(); // Write the buffer to the display delay(60000); }