冠狀病毒 (Covid19) 正在世界范圍內(nèi)造成嚴(yán)重破壞。幾乎每個(gè)國(guó)家都在遭受冠狀病毒的折磨。世衛(wèi)組織已經(jīng)宣布它為大流行病,許多城市處于封鎖狀態(tài),人們無(wú)法走出家門(mén),數(shù)千人喪生。
在這個(gè)項(xiàng)目中,我們將構(gòu)建一個(gè)帶有 LCD 的自動(dòng)洗手液分配器,該 LCD 還顯示冠狀病毒病例的實(shí)時(shí)計(jì)數(shù)。該項(xiàng)目將使用 ESP32、超聲波傳感器、16x2 LCD 模塊、水泵和洗手液。我們正在使用Esri 的 API Explorer來(lái)獲取 Covid19 感染者的實(shí)時(shí)數(shù)據(jù)。超聲波傳感器用于檢查消毒機(jī)出口下方是否存在手。它將不斷計(jì)算消毒劑出口與自身之間的距離,并在距離小于 15 厘米時(shí)告訴 ESP 打開(kāi)泵以將消毒劑推出。
所需組件
ESP32 開(kāi)發(fā)模塊
超聲波傳感器
16*2液晶顯示器
繼電器模塊
迷你直流潛水泵
消毒洗手液
用于獲取 Corona 實(shí)時(shí)數(shù)據(jù)的 API 鏈接
在這里,我們需要從互聯(lián)網(wǎng)上獲取數(shù)據(jù),然后將其發(fā)送到 ESP32 以在 16x2 LCD 上顯示。為此,將調(diào)用 HTTP 獲取請(qǐng)求以從 Internet 讀取 JSON 文件。在這里,我們使用的是冠狀病毒病 GIS Hub提供的 API 。您可以輕松編譯正確的查詢 URL 以獲取印度的確診和康復(fù)病例總數(shù),如果您想將其用于其他國(guó)家/地區(qū),還可以更改國(guó)家/地區(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”,“長(zhǎng)度”: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”:“活動(dòng)”,“類(lèi)型”:“esriFieldTypeInteger”,“別名”:“活動(dòng)”,“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ù)我們的需要對(duì)其進(jìn)行短語(yǔ)處理。
現(xiàn)在向下滾動(dòng)到解析程序并復(fù)制對(duì)您有用的代碼部分。我復(fù)制了以下變量,因?yàn)槲抑恍枰《却_診和康復(fù)的病例。
電路原理圖
下面給出了這款Covid19 追蹤器和自動(dòng)洗手液分配器的完整電路圖
水泵通過(guò)繼電器模塊連接到 ESP32。繼電器的 Vcc 和 GND 引腳連接到 ESP32 的 Vin 和 GND 引腳,而繼電器的輸入引腳連接到 ESP32 的 D19 引腳。超聲波傳感器的 Trig 和 Echo 引腳連接到 Arduino 的 D5 和 D18 引腳。
下表給出了完整的連接。
這款運(yùn)動(dòng)傳感器洗手液分配器的硬件如下所示
為 Covid19 追蹤器編程 ESP32
Auto Hand Sanitizer 和 CORONA19 Tracker的完整代碼可在頁(yè)面末尾找到。這里解釋了程序的重要部分。
通過(guò)包含所有必需的庫(kù)文件來(lái)啟動(dòng)代碼。HTTPClient庫(kù)用于從 HTTP 服務(wù)器獲取數(shù)據(jù)。ArduinoJson庫(kù)用于短語(yǔ)數(shù)據(jù)數(shù)組。這里 ArduinoJson 庫(kù)用于過(guò)濾已確認(rèn)的案例并從我們從服務(wù)器獲取的數(shù)據(jù)數(shù)組中恢復(fù)。LiquidCrystal 庫(kù)用于 LCD 顯示模塊。
#include#include #include #include
要從服務(wù)器獲取數(shù)據(jù),NodeMCU ESP32 必須連接到互聯(lián)網(wǎng)。為此,請(qǐng)?jiān)谝韵滦兄休斎肽?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 中的國(guó)家/地區(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)超聲波傳感器如何工作的更多信息,請(qǐng)查看其與 Arduino 的接口,我們已經(jīng)解釋了其 TRIG 和 ECHO 引腳的功能以及它如何用于計(jì)算任何物體之間的距離。另外,檢查其他基于超聲波的項(xiàng)目。
之后,檢查 ESP 是否與 Wi-Fi 連接,如果沒(méi)有,它將通過(guò)在串行監(jiān)視器上打印“……”來(lái)等待 ESP 連接。
WiFi.開(kāi)始(ssid,通過(guò)); 而(WiFi.status()!= WL_CONNECTED) { 延遲(500); Serial.print("."); //打印...直到?jīng)]有連接 } Serial.println("WiFi 連接");
在void ultra()函數(shù)內(nèi)部,我們將使用超聲波傳感器不斷計(jì)算距離,如果距離小于或等于 15 厘米,它將打開(kāi)泵 2 秒,將消毒劑通過(guò)管道推到外面。不知不覺(jué)中,當(dāng)有人將手放在出水管下方時(shí),距離會(huì)減小,并會(huì)觸發(fā)泵啟動(dòng)。
無(wú)效超(){ 數(shù)字寫(xiě)入(trigPin,低); 延遲微秒(2); digitalWrite(trigPin, HIGH); 延遲微秒(10); 數(shù)字寫(xiě)入(trigPin,低); 持續(xù)時(shí)間=脈沖輸入(回聲針,高); 距離 = 持續(xù)時(shí)間 * 0.0340 / 2; Serial.println("距離"); Serial.println(距離); 如果(距離 <= 15){ Serial.print("開(kāi)泵"); 數(shù)字寫(xiě)入(泵,高); 延遲(2000); 數(shù)字寫(xiě)入(泵,低); ESP.restart(); } }
現(xiàn)在在void loop()函數(shù)中,通過(guò)讀取 JSON 文件并使用以下行在串行監(jiān)視器上打印 JSON 數(shù)據(jù)來(lái)檢查 ESP32 是否接收到 JSON 文件
int httpCode = https.GET(); if (httpCode > 0) { //檢查返回碼 字符串有效載荷 = https.getString();
之后,使用ArduinoJson Assistant 生成的分詞程序。這個(gè)措辭程序?qū)槲覀兲峁┯《却_診和康復(fù)病例的總數(shù)。
JsonArray 字段 = doc["fields"]; JsonObject features_0_attributes = doc["features"][0]["attributes"]; 長(zhǎng) features_0_attributes_Last_Update = features_0_attributes["Last_Update"]; int features_0_attributes_Confirmed = features_0_attributes[“已確認(rèn)”]; //int features_0_attributes_Deaths = features_0_attributes["Deaths"]; int features_0_attributes_Recovered = features_0_attributes[“恢復(fù)”];
使用 Covid19 Tracker 測(cè)試自動(dòng)洗手液
所以最后我們的電池供電的洗手液分配器已經(jīng)準(zhǔn)備好進(jìn)行測(cè)試了。只需按照電路圖連接硬件并將程序上傳到 ESP32,在開(kāi)始時(shí)您應(yīng)該會(huì)在 LCD 上看到“Covid19 Tracker”和“Hand Sanitizer”消息,然后幾秒鐘后它會(huì)在屏幕上顯示確認(rèn)病例和恢復(fù)病例液晶屏如下圖。
#include
#include
#include
#include
const char* ssid = "Galaxy-M20";
const char* pass = "ac312124";
整數(shù)計(jì)數(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í)間長(zhǎng);
整數(shù)距離;
const char* url = " https://services1.arcgis.com/0MSEUqKaxRlEPj5g/arcgis/rest/services/ncov… ";
無(wú)效設(shè)置() {
Serial.begin(115200);
延遲(2000);
pinMode(trigPin,輸出);
pinMode(echoPin,輸入);
pinMode(泵,輸出);
數(shù)字寫(xiě)入(泵,低);
lcd.begin(16, 2);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Covid19 追蹤器");
lcd.setCursor(0,1);
lcd.print("洗手液");
Serial.println("正在連接");
序列號(hào).println(ssid);
WiFi.開(kāi)始(ssid,通過(guò));
而(WiFi.status()!= WL_CONNECTED)
{
延遲(500);
Serial.print("."); // 打印 ... 直到未連接
}
Serial.println("WiFi connected");
}
void ultra(){
digitalWrite(trigPin, LOW);
延遲微秒(2);
digitalWrite(trigPin, HIGH);
延遲微秒(10);
數(shù)字寫(xiě)入(trigPin,低);
持續(xù)時(shí)間=脈沖輸入(回聲針,高);
距離 = 持續(xù)時(shí)間 * 0.0340 / 2;
Serial.println("距離");
Serial.println(距離);
if (distance <= 15){
Serial.print("開(kāi)泵");
數(shù)字寫(xiě)入(泵,高);
延遲(2000);
數(shù)字寫(xiě)入(泵,低);
ESP.restart();
}
}
無(wú)效循環(huán)() {
超();
HTTP客戶端 https;
字符串?dāng)?shù)據(jù);
https.開(kāi)始(網(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"];
長(zhǎng) features_0_attributes_Last_Update = features_0_attributes["Last_Update"];
int features_0_attributes_Confirmed = features_0_attributes[“已確認(rèn)”];
//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 確認(rèn):");
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 請(qǐng)求錯(cuò)誤");
}
https.end();
計(jì)數(shù)++;
}
-
lcd
+關(guān)注
關(guān)注
34文章
4437瀏覽量
168071 -
分配器
+關(guān)注
關(guān)注
0文章
195瀏覽量
25801 -
ESP32
+關(guān)注
關(guān)注
18文章
977瀏覽量
17461
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論