冠狀病毒 (Covid19) 正在世界范圍內(nèi)造成嚴(yán)重破壞。幾乎每個國家都在遭受冠狀病毒的折磨。世衛(wèi)組織已經(jīng)宣布它為大流行病,許多城市處于封鎖狀態(tài),人們無法走出家門,數(shù)千人喪生。
在這個項目中,我們將構(gòu)建一個帶有 LCD 的自動洗手液分配器,該 LCD 還顯示冠狀病毒病例的實時計數(shù)。該項目將使用 ESP32、超聲波傳感器、16x2 LCD 模塊、水泵和洗手液。我們正在使用Esri 的 API Explorer來獲取 Covid19 感染者的實時數(shù)據(jù)。超聲波傳感器用于檢查消毒機出口下方是否存在手。它將不斷計算消毒劑出口與自身之間的距離,并在距離小于 15 厘米時告訴 ESP 打開泵以將消毒劑推出。
所需組件
ESP32 開發(fā)模塊
超聲波傳感器
16*2液晶顯示器
繼電器模塊
迷你直流潛水泵
消毒洗手液
用于獲取 Corona 實時數(shù)據(jù)的 API 鏈接
在這里,我們需要從互聯(lián)網(wǎng)上獲取數(shù)據(jù),然后將其發(fā)送到 ESP32 以在 16x2 LCD 上顯示。為此,將調(diào)用 HTTP 獲取請求以從 Internet 讀取 JSON 文件。在這里,我們使用的是冠狀病毒病 GIS Hub提供的 API 。您可以輕松編譯正確的查詢 URL 以獲取印度的確診和康復(fù)病例總數(shù),如果您想將其用于其他國家/地區(qū),還可以更改國家/地區(qū)。
現(xiàn)在單擊“立即嘗試”或?qū)⒉樵?URL 粘貼到新瀏覽器中,該查詢的輸出將如下所示:
{“objectIdFieldName”:“OBJECTID”,“uniqueIdField”:{“name”:“OBJECTID”,“isSystemMaintained”:true},“globalIdFieldName”:“”,“geometryType”:“esriGeometryPoint”,“spatialReference”:{“ wkid”:4326,“l(fā)atestWkid”:4326},“fields”:[{“name”:“Country_Region”,“type”:“esriFieldTypeString”,“alias”:“Country/Region”,“sqlType”:“sqlTypeOther ”,“l(fā)ength”:8000,“domain”:null,“defaultValue”:null},{“name”:“Province_State”,“type”:“esriFieldTypeString”,“alias”:“Province/State”,“sqlType ”:“sqlTypeOther”,“長度”:8000,“域”:null,“defaultValue”:null},{“name”:“Confirmed”,“type”:“esriFieldTypeInteger”,“alias”:“Confirmed”,“sqlType”:“sqlTypeOther”,“domain”:null,“defaultValue”:null },{“name”:“Recovered”,“type”:“esriFieldTypeInteger”,“alias”:“Recovered”,“sqlType”:“sqlTypeOther”,“domain”:null,“defaultValue”:null},{“ name”:“Deaths”,“type”:“esriFieldTypeInteger”,“alias”:“Deaths”,“sqlType”:“sqlTypeOther”,“domain”:null,“defaultValue”:null},{“name”:“活動”,“類型”:“esriFieldTypeInteger”,“別名”:“活動”,“sqlType”:“sqlTypeOther”,“domain”:null,“defaultValue”:null}],“features”:[{“attributes”:{“Country_Region”:“India”,“Province_State”:null,“Confirmed”:194,“Recovered ”:20,“Deaths”:4,“Active”:170}}]}
獲取 JSON 數(shù)據(jù)后,現(xiàn)在生成代碼以讀取 JSON 數(shù)據(jù)并根據(jù)我們的需要對其進行短語處理。
現(xiàn)在向下滾動到解析程序并復(fù)制對您有用的代碼部分。我復(fù)制了以下變量,因為我只需要印度確診和康復(fù)的病例。
電路原理圖
下面給出了這款Covid19 追蹤器和自動洗手液分配器的完整電路圖
水泵通過繼電器模塊連接到 ESP32。繼電器的 Vcc 和 GND 引腳連接到 ESP32 的 Vin 和 GND 引腳,而繼電器的輸入引腳連接到 ESP32 的 D19 引腳。超聲波傳感器的 Trig 和 Echo 引腳連接到 Arduino 的 D5 和 D18 引腳。
下表給出了完整的連接。
這款運動傳感器洗手液分配器的硬件如下所示
為 Covid19 追蹤器編程 ESP32
Auto Hand Sanitizer 和 CORONA19 Tracker的完整代碼可在頁面末尾找到。這里解釋了程序的重要部分。
通過包含所有必需的庫文件來啟動代碼。HTTPClient庫用于從 HTTP 服務(wù)器獲取數(shù)據(jù)。ArduinoJson庫用于短語數(shù)據(jù)數(shù)組。這里 ArduinoJson 庫用于過濾已確認的案例并從我們從服務(wù)器獲取的數(shù)據(jù)數(shù)組中恢復(fù)。LiquidCrystal 庫用于 LCD 顯示模塊。
#include#include #include #include
要從服務(wù)器獲取數(shù)據(jù),NodeMCU ESP32 必須連接到互聯(lián)網(wǎng)。為此,請在以下行中輸入您的 Wi-Fi SSID 和密碼。
const char* ssid = "銀河-M20"; const char* pass = "ac312124";
之后定義連接 LCD 模塊、超聲波傳感器和繼電器模塊的引腳。
常量 int rs = 22, en = 4, d4 = 15, d5 = 13, d6 = 26, d7 = 21; LiquidCrystal lcd(rs, en, d4, d5, d6, d7); 常量 int trigPin = 5; 常量 int echoPin = 18; 常量 int 泵 = 19;
現(xiàn)在我們輸入之前生成的 API 鏈接。使用此鏈接,我們將獲得印度的確診病例總數(shù)和康復(fù)病例總數(shù)。您可以根據(jù)自己的需要更改 URL 中的國家/地區(qū)名稱。
constchar*url="https://services1.arcgis.com/0MSEUqKaxRlEPj5g/arcgis/rest/services/ncov_cases/FeatureServer/1/query?f=json&where=(Country_Region=%27India%27)&returnGeometry=false&outFields=Country_Region,Confirmed , 恢復(fù)";
現(xiàn)在在void setup()中,將超聲波傳感器的 Trig 和 Echo 引腳定義為輸入引腳,將 Relay 引腳定義為輸出。
pinMode(trigPin,輸出); pinMode(echoPin,輸入); pinMode(泵,輸出);
要了解有關(guān)超聲波傳感器如何工作的更多信息,請查看其與 Arduino 的接口,我們已經(jīng)解釋了其 TRIG 和 ECHO 引腳的功能以及它如何用于計算任何物體之間的距離。另外,檢查其他基于超聲波的項目。
之后,檢查 ESP 是否與 Wi-Fi 連接,如果沒有,它將通過在串行監(jiān)視器上打印“……”來等待 ESP 連接。
WiFi.開始(ssid,通過); 而(WiFi.status()!= WL_CONNECTED) { 延遲(500); Serial.print("."); //打印...直到?jīng)]有連接 } Serial.println("WiFi 連接");
在void ultra()函數(shù)內(nèi)部,我們將使用超聲波傳感器不斷計算距離,如果距離小于或等于 15 厘米,它將打開泵 2 秒,將消毒劑通過管道推到外面。不知不覺中,當(dāng)有人將手放在出水管下方時,距離會減小,并會觸發(fā)泵啟動。
無效超(){ 數(shù)字寫入(trigPin,低); 延遲微秒(2); digitalWrite(trigPin, HIGH); 延遲微秒(10); 數(shù)字寫入(trigPin,低); 持續(xù)時間=脈沖輸入(回聲針,高); 距離 = 持續(xù)時間 * 0.0340 / 2; Serial.println("距離"); Serial.println(距離); 如果(距離 <= 15){ Serial.print("開泵"); 數(shù)字寫入(泵,高); 延遲(2000); 數(shù)字寫入(泵,低); ESP.restart(); } }
現(xiàn)在在void loop()函數(shù)中,通過讀取 JSON 文件并使用以下行在串行監(jiān)視器上打印 JSON 數(shù)據(jù)來檢查 ESP32 是否接收到 JSON 文件
int httpCode = https.GET(); if (httpCode > 0) { //檢查返回碼 字符串有效載荷 = https.getString();
之后,使用ArduinoJson Assistant 生成的分詞程序。這個措辭程序?qū)槲覀兲峁┯《却_診和康復(fù)病例的總數(shù)。
JsonArray 字段 = doc["fields"]; JsonObject features_0_attributes = doc["features"][0]["attributes"]; 長 features_0_attributes_Last_Update = features_0_attributes["Last_Update"]; int features_0_attributes_Confirmed = features_0_attributes[“已確認”]; //int features_0_attributes_Deaths = features_0_attributes["Deaths"]; int features_0_attributes_Recovered = features_0_attributes[“恢復(fù)”];
使用 Covid19 Tracker 測試自動洗手液
所以最后我們的電池供電的洗手液分配器已經(jīng)準(zhǔn)備好進行測試了。只需按照電路圖連接硬件并將程序上傳到 ESP32,在開始時您應(yīng)該會在 LCD 上看到“Covid19 Tracker”和“Hand Sanitizer”消息,然后幾秒鐘后它會在屏幕上顯示確認病例和恢復(fù)病例液晶屏如下圖。
#include
#include
#include
#include
const char* ssid = "Galaxy-M20";
const char* pass = "ac312124";
整數(shù)計數(shù);
常量 int rs = 22, en = 4, d4 = 15, d5 = 13, d6 = 26, d7 = 21;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
常量 int trigPin = 5;
常量 int echoPin = 18;
常量 int 泵 = 19;
持續(xù)時間長;
整數(shù)距離;
const char* url = " https://services1.arcgis.com/0MSEUqKaxRlEPj5g/arcgis/rest/services/ncov… ";
無效設(shè)置() {
Serial.begin(115200);
延遲(2000);
pinMode(trigPin,輸出);
pinMode(echoPin,輸入);
pinMode(泵,輸出);
數(shù)字寫入(泵,低);
lcd.begin(16, 2);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Covid19 追蹤器");
lcd.setCursor(0,1);
lcd.print("洗手液");
Serial.println("正在連接");
序列號.println(ssid);
WiFi.開始(ssid,通過);
而(WiFi.status()!= WL_CONNECTED)
{
延遲(500);
Serial.print("."); // 打印 ... 直到未連接
}
Serial.println("WiFi connected");
}
void ultra(){
digitalWrite(trigPin, LOW);
延遲微秒(2);
digitalWrite(trigPin, HIGH);
延遲微秒(10);
數(shù)字寫入(trigPin,低);
持續(xù)時間=脈沖輸入(回聲針,高);
距離 = 持續(xù)時間 * 0.0340 / 2;
Serial.println("距離");
Serial.println(距離);
if (distance <= 15){
Serial.print("開泵");
數(shù)字寫入(泵,高);
延遲(2000);
數(shù)字寫入(泵,低);
ESP.restart();
}
}
無效循環(huán)() {
超();
HTTP客戶端 https;
字符串?dāng)?shù)據(jù);
https.開始(網(wǎng)址);
int httpCode = https.GET();
if (httpCode > 0) { //檢查返回碼
字符串有效載荷 = https.getString();
char charBuf[500];
payload.toCharArray(charBuf, 500);
//Serial.println(payload);
常量 size_t 容量 = 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(容量);
反序列化Json(文檔,有效載荷);
JsonArray 字段 = doc["fields"];
JsonObject features_0_attributes = doc["features"][0]["attributes"];
長 features_0_attributes_Last_Update = features_0_attributes["Last_Update"];
int features_0_attributes_Confirmed = features_0_attributes[“已確認”];
//int features_0_attributes_Deaths = features_0_attributes["Deaths"];
int features_0_attributes_Recovered = features_0_attributes[“恢復(fù)”];
if (count < 3){
//Serial.println(features_0_attributes_Confirmed);
lcd.setCursor(0, 0);
lcd.print("IN 確認:");
lcd.print(features_0_attributes_Confirmed);
//Serial.println(features_0_attributes_Recovered);
lcd.setCursor(0, 1);
lcd.print("IN 已恢復(fù):");
lcd.print(features_0_attributes_Recovered);
}
if (count > 3){
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("洗手");
lcd.setCursor(0, 1);
lcd.print("避免接觸");
}
if (count > 6){
count = 0;
}
}
else {
Serial.println("HTTP 請求錯誤");
}
https.end();
計數(shù)++;
}
-
lcd
+關(guān)注
關(guān)注
34文章
4426瀏覽量
167508 -
分配器
+關(guān)注
關(guān)注
0文章
194瀏覽量
25755 -
ESP32
+關(guān)注
關(guān)注
18文章
971瀏覽量
17276
發(fā)布評論請先 登錄
相關(guān)推薦
評論