构建一个带有LCD的自动洗手液分配器

描述

  冠状病毒 (Covid19) 正在世界范围内造成严重破坏。几乎每个国家都在遭受冠状病毒的折磨。世卫组织已经宣布它为大流行病,许多城市处于封锁状态,人们无法走出家门,数千人丧生。

  在这个项目中,我们将构建一个带有 LCD 的自动洗手液分配器,该 LCD 还显示冠状病毒病例的实时计数。该项目将使用 ESP32、超声波传感器、16x2 LCD 模块、水泵和洗手液。我们正在使用Esri 的 API Explorer来获取 Covid19 感染者的实时数据。超声波传感器用于检查消毒机出口下方是否存在手。它将不断计算消毒剂出口与自身之间的距离,并在距离小于 15 厘米时告诉 ESP 打开泵以将消毒剂推出。

  所需组件

  ESP32 开发模块

  超声波传感器

  16*2液晶显示器

  继电器模块

  迷你直流潜水泵

  消毒洗手液

  用于获取 Corona 实时数据的 API 链接

  在这里,我们需要从互联网上获取数据,然后将其发送到 ESP32 以在 16x2 LCD 上显示。为此,将调用 HTTP 获取请求以从 Internet 读取 JSON 文件。在这里,我们使用的是冠状病毒病 GIS Hub提供的 API 。您可以轻松编译正确的查询 URL 以获取印度的确诊和康复病例总数,如果您想将其用于其他国家/地区,还可以更改国家/地区。

分配器

  现在单击“立即尝试”或将查询 URL 粘贴到新浏览器中,该查询的输出将如下所示:

  {“objectIdFieldName”:“OBJECTID”,“uniqueIdField”:{“name”:“OBJECTID”,“isSystemMaintained”:true},“globalIdFieldName”:“”,“geometryType”:“esriGeometryPoint”,“spatialReference”:{“ wkid”:4326,“latestWkid”:4326},“fields”:[{“name”:“Country_Region”,“type”:“esriFieldTypeString”,“alias”:“Country/Region”,“sqlType”:“sqlTypeOther ”,“length”: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 数据后,现在生成代码以读取 JSON 数据并根据我们的需要对其进行短语处理。

分配器

  现在向下滚动到解析程序并复制对您有用的代码部分。我复制了以下变量,因为我只需要印度确诊和康复的病例。

分配器

  电路原理图

  下面给出了这款Covid19 追踪器和自动洗手液分配器的完整电路图

分配器

  水泵通过继电器模块连接到 ESP32。继电器的 Vcc 和 GND 引脚连接到 ESP32 的 Vin 和 GND 引脚,而继电器的输入引脚连接到 ESP32 的 D19 引脚。超声波传感器的 Trig 和 Echo 引脚连接到 Arduino 的 D5 和 D18 引脚。

  下表给出了完整的连接。

分配器

  这款运动传感器洗手液分配器的硬件如下所示

分配器

为 Covid19 追踪器编程 ESP32

Auto Hand Sanitizer 和 CORONA19 Tracker的完整代码可在页面末尾找到。这里解释了程序的重要部分。

通过包含所有必需的库文件来启动代码。HTTPClient库用于从 HTTP 服务器获取数据。ArduinoJson库用于短语数据数组。这里 ArduinoJson 库用于过滤已确认的案例并从我们从服务器获取的数据数组中恢复。LiquidCrystal 库用于 LCD 显示模块。

 

#include 
#include 
#include 
#include 

 

要从服务器获取数据,NodeMCU ESP32 必须连接到互联网。为此,请在以下行中输入您的 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;

 

现在我们输入之前生成的 API 链接。使用此链接,我们将获得印度的确诊病例总数和康复病例总数。您可以根据自己的需要更改 URL 中的国家/地区名称。

 

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 , 恢复";

 

现在在void setup()中,将超声波传感器的 Trig 和 Echo 引脚定义为输入引脚,将 Relay 引脚定义为输出。

 

pinMode(trigPin,输出);
pinMode(echoPin,输入);
pinMode(泵,输出);

 

要了解有关超声波传感器如何工作的更多信息,请查看其与 Arduino 的接口,我们已经解释了其 TRIG 和 ECHO 引脚的功能以及它如何用于计算任何物体之间的距离。另外,检查其他基于超声波的项目。

之后,检查 ESP 是否与 Wi-Fi 连接,如果没有,它将通过在串行监视器上打印“……”来等待 ESP 连接。

 

WiFi.开始(ssid,通过);
  而(WiFi.status()!= WL_CONNECTED)
  {
    延迟(500);
    Serial.print("."); //打印...直到没有连接
  }
  Serial.println("WiFi 连接");

 

在void ultra()函数内部,我们将使用超声波传感器不断计算距离,如果距离小于或等于 15 厘米,它将打开泵 2 秒,将消毒剂通过管道推到外面。不知不觉中,当有人将手放在出水管下方时,距离会减小,并会触发泵启动。

 

无效超(){
  数字写入(trigPin,低);
  延迟微秒(2);
  digitalWrite(trigPin, HIGH);
  延迟微秒(10);
  数字写入(trigPin,低);
  持续时间=脉冲输入(回声针,高);
  距离 = 持续时间 * 0.0340 / 2;
  Serial.println("距离");
  Serial.println(距离);
  如果(距离 <= 15){
    Serial.print("开泵");
    数字写入(泵,高);
    延迟(2000);
    数字写入(泵,低);
    ESP.restart();
    }
}

 

现在在void loop()函数中,通过读取 JSON 文件并使用以下行在串行监视器上打印 JSON 数据来检查 ESP32 是否接收到 JSON 文件

 

int httpCode = https.GET();
  if (httpCode > 0) { //检查返回码
 字符串有效载荷 = https.getString();

 

之后,使用ArduinoJson Assistant 生成的分词程序。这个措辞程序将为我们提供印度确诊和康复病例的总数。

 

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[“恢复”];

 

  使用 Covid19 Tracker 测试自动洗手液

  所以最后我们的电池供电的洗手液分配器已经准备好进行测试了。只需按照电路图连接硬件并将程序上传到 ESP32,在开始时您应该会在 LCD 上看到“Covid19 Tracker”和“Hand Sanitizer”消息,然后几秒钟后它会在屏幕上显示确认病例和恢复病例液晶屏如下图。

分配器

#include

#include

#include

#include

const char* ssid = "Galaxy-M20";

const char* pass = "ac312124";

整数计数;

常量 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;

持续时间长;

整数距离;

const char* url = " https://services1.arcgis.com/0MSEUqKaxRlEPj5g/arcgis/rest/services/ncov… ";

无效设置() {

Serial.begin(115200);

延迟(2000);

pinMode(trigPin,输出);

pinMode(echoPin,输入);

pinMode(泵,输出);

数字写入(泵,低);

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);

数字写入(trigPin,低);

持续时间=脉冲输入(回声针,高);

距离 = 持续时间 * 0.0340 / 2;

Serial.println("距离");

Serial.println(距离);

if (distance <= 15){

Serial.print("开泵");

数字写入(泵,高);

延迟(2000);

数字写入(泵,低);

ESP.restart();

}

}

无效循环() {

超();

HTTP客户端 https;

字符串数据;

https.开始(网址);

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[“恢复”];

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 已恢复:");

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();

计数++;

}
 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分