随着智慧城市的日益普及,每个领域都需要智能解决方案。物联网通过互联网控制功能实现了智能城市的可能性。一个人只需使用智能手机或任何连接互联网的设备,就可以从世界任何地方控制安装在他家或办公室中的设备。智慧城市中有多个领域,智能停车是智慧城市中的热门领域之一。
智能停车行业已经看到了许多创新,如智能停车管理系统、智能门禁、可以检测车辆类型的智能摄像头、ANPR(自动车牌识别)、智能支付系统、智能进入系统等等。今天将采用类似的方法并构建智能停车解决方案,该解决方案将使用超声波传感器检测车辆的存在并触发门自动打开或关闭。ESP8266 NodeMCU 将在此处用作主控制器,以控制与其连接的所有外围设备。
在这个物联网智能停车系统中,我们会将数据发送到网络服务器,以查找车辆停车位的可用性。在这里,我们使用 firebase 作为物联网数据库来获取停车可用性数据。为此,我们需要找到 Firebase 主机地址和授权密钥。
所需组件
ESP8266 NodeMCU
超声波传感器
直流伺服电机
红外传感器
16x2 i2c 液晶显示器
跳线
电路原理图
下面给出了这个基于物联网的车辆停车系统的电路图。它包括两个红外传感器、两个伺服电机、一个超声波传感器和一个 16x2 液晶显示器。
在这里,ESP8266 将控制整个过程,并将停车可用性信息发送到 Google Firebase,以便可以通过互联网从世界任何地方对其进行监控。两个红外传感器用于入口和出口大门,以检测汽车的存在并自动打开或关闭大门。IR 传感器用于通过发送和接收红外线来检测任何物体,在此处了解有关 IR 传感器的更多信息。我们还介绍了有关Arduino IR 传感器接口的详细教程,您可以查看该教程以了解更多 IR 传感器模块的工作原理以及如何将其与 Arduino uno 连接。
两个伺服器将充当入口和出口门,它们旋转以打开或关闭门。最后,使用超声波传感器检测停车位是否可用或被占用,并将数据相应地发送到 ESP8266。查看本教程末尾提供的视频以了解该项目的完整工作。
这是这个完整的智能停车系统原型的外观:
为智能停车解决方案编程 ESP8266 NodeMCU
带有工作视频的完整代码本教程末尾
要对 NodeMCU 进行编程,只需使用 Micro USB 电缆将 NodeMCU 插入计算机并打开 Arduino IDE。I2C 显示器和伺服电机需要这些库。LCD 将显示停车位的可用性,伺服电机将用于打开和关闭出入口。Wire.h库将用于在 i2c 协议中连接 LCD 。ESP8266 NodeMCU 中的 I2C 引脚为 D1 (SCL) 和 D2 (SDA)。这里使用的数据库将是 Firebase,所以这里我们还包括相同的库(FirebaseArduino.h)。
#include#include #include #include #include
然后包含从 Google Firebase 获得的 Firebase 凭据。这些将包括包含您的项目名称和密钥的主机名。要查找这些值,请遵循Firebase 上的上一教程。
#define FIREBASE_HOST "smart-parking-7f5b6.firebaseio.com" #define FIREBASE_AUTH "suAkUQ4wXRPW7nA0zJQVsx3H2LmeBDPGmfTMBHCT"
包括 WiFi SSID 和密码等 WiFi 凭据。
#define WIFI_SSID "CircuitDigest" #define WIFI_PASSWORD "circuitdigest101"
使用设备地址(此处为 0x27)和 LCD 类型初始化 I2C LCD。还包括用于进出大门的伺服电机。
LiquidCrystal_I2C lcd(0x27, 16, 2); 伺服myservo; 伺服myservo1;
启动 I2C LCD 的 I2C 通信。
Wire.begin(D2, D1);
将进出伺服电机连接到 NodeMCU 的 D5、D6 引脚。
myservo.attach(D6); myservos.attach(D5);
选择超声波传感器的触发引脚作为输出,回波引脚作为输入。超声波传感器将用于检测停车位的可用性。如果汽车占据了空间,那么它会发光,否则它不会发光。
pinMode(TRIG,输出); pinMode(回声,输入);
NodeMCU 的两个引脚 D0 和 D4 用于获取 IR 传感器读数。红外传感器将充当入口和出口门传感器。这将检测汽车的存在。
pinMode(carExited,输入); pinMode(carEnter,输入);
连接到 WiFi 并等待一段时间,直到它连接上。
WiFi.begin(WIFI_SSID, WIFI_PASSWORD); Serial.print("正在连接"); Serial.print(WIFI_SSID); while (WiFi.status() != WL_CONNECTED) { Serial.print("."); 延迟(500); }
使用主机和密钥作为凭据开始与 Firebase 连接。
Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);
启动 i2c 16x2 LCD 并将光标位置设置在第 0行第0列。
液晶显示器开始(); lcd.setCursor(0, 0);
从超声波传感器中获取距离。这将用于检测特定地点的车辆存在。首先发送 2 微秒脉冲,然后读取接收到的脉冲。然后将其转换为'cm'。在此处了解有关使用超声波传感器测量距离的更多信息。
数字写入(触发,低); 延迟微秒(2); 数字写入(触发,高); 延迟微秒(10); 数字写入(触发,低); 持续时间=脉冲输入(回声,高); 距离 = (持续时间 / 2) / 29.1;
以数字方式读取 IR 传感器引脚作为进入传感器并检查其是否为高电平。如果它很高,则增加条目计数并将其打印到16x2 LCD 显示器和串行监视器。
int carEntry = digitalRead(carEnter); if (carEntry == HIGH) { countYes++; Serial.print("汽车进入 = " ); Serial.println(countYes); lcd.setCursor(0, 1); lcd.print("汽车进入");
同时移动伺服电机角度以打开入口门。根据您的用例更改角度。
for (pos = 140; pos >= 45; pos -= 1) { myservos.write(pos); 延迟(5); } 延迟(2000); for (pos = 45; pos <= 140; pos += 1) { // 以 1 度为步长 myservos.write(pos); 延迟(5); }
并使用Firebase 库的pushString函数将读数发送到firebase。
Firebase.pushString("/停车状态/", fireAvailable );
对出口红外传感器和出口伺服电机执行与上述类似的步骤。
int carExit = digitalRead(carExited); if (carExit == HIGH) { countYes--; Serial.print("汽车退出 = " ); Serial.println(countYes); lcd.setCursor(0, 1); lcd.print("汽车退出"); for (pos1 = 140; pos1 >= 45; pos1 -= 1) { myservo.write(pos1); 延迟(5); } 延迟(2000); for (pos1 = 45; pos1 <= 140; pos1 += 1) { // 以 1 度为步长 myservo.write(pos1); 延迟(5); } Firebase.pushString("/停车状态/", fireAvailable ); lcd.clear(); }
检查汽车是否已到达停车位,如果已到达,则发光 LED 会发出停车位已满的信号。
if (distance < 6) { Serial.println("Occupied"); 数字写入(领导,高); }
否则表明该位置可用。
if (距离 > 6) { Serial.println("可用"); 数字写入(领导,低); }
计算停车场内的总空闲空间并将其保存在字符串中以将数据发送到 firebase。
Empty = allSpace - countYes; 可用 = String("可用= ") + String(Empty) + String("/") + String(allSpace); fireAvailable = String("Available=") + String(Empty) + String("/") + String(allSpace); 还将数据打印到 i2C LCD。 lcd.setCursor(0, 0); lcd.print(可用);
这就是如何在 Firebase 上在线跟踪停车位的可用性,如下面的快照所示:
这样就完成了使用 ESP8266 NodeMCU 模块和不同外设的完整智能停车系统。
#include
#include
#include
#include
#include
#define FIREBASE_HOST "smart-parking-7f5b6.firebaseio.com" // 来自 firebase id 的项目名称地址
#define FIREBASE_AUTH "suAkUQ4wXRPW7nA0zJQVsx3H2LmeBDPGmfTMBHCT" // 从 firebase 生成的密钥
#define WIFI_SSID "CircuitDigest" // 输入您的家庭或公共 wifi 名称
#define WIFI_PASSWORD "circuitdigest101" // Wifi 的密码
String Available = ""; //可用性字符串
String fireAvailable = "";
LiquidCrystal_I2C lcd(0x27, 16, 2); //i2c 显示地址 27 和 16x2 lcd 显示
Servo myservo; //伺服作为门
伺服myservos; //伺服作为门
int Empty; //可用空间整数
int allSpace = 90;
整数计数是 = 0;
int carEnter = D0; // 进入传感器
int carExited = D4; //exi 传感器
int TRIG = D7; //超声波触发引脚
int ECHO = D8; // 超声波回波引脚
int led = D3; // 现场占用信号
int pos;
诠释 pos1;
持续时间长,距离远;
无效设置(){
延迟(1000);
串行.开始(9600);// 串口调试
Wire.begin(D2, D1); // i2c 启动
myservo.attach(D6); //伺服引脚到D6
myservos.attach(D5); // 伺服管脚到 D5
pinMode(TRIG, OUTPUT); // 触发引脚作为输出
pinMode(ECHO, INPUT); // echo pin 作为输入
pinMode(led, OUTPUT); // 现场指示
pinMode(carExited, INPUT); // ir 作为输入
pinMode(carEnter, INPUT); // ir 作为输入
WiFi.begin(WIFI_SSID, WIFI_PASSWORD); //尝试连接wifi
Serial.print("Connecting to ");
Serial.print(WIFI_SSID); // 显示 ssid
while (WiFi.status() != WL_CONNECTED) {
Serial.print("."); // 如果未连接,则打印此
延迟(500);
}
Serial.println();
Serial.print("连接到");
Serial.println(WIFI_SSID);
Serial.print("IP 地址为:");
Serial.println(WiFi.localIP()); //打印本地IP地址
Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH); // 开始 Firebase 身份验证
液晶显示器开始();//开始液晶
屏 lcd.home();
lcd.setCursor(0, 0); // 第 0 行第 0 列
lcd.print("Smart Parking");
}
无效循环(){
数字写入(触发,低);// 使触发引脚为低
delayMicroseconds(2);
数字写入(触发,高);// 使触发引脚高
delayMicroseconds(10);
数字写入(触发,低);
持续时间=脉冲输入(回声,高);
距离 = (持续时间 / 2) / 29.1; // 以厘米为单位取距离
Serial.print("厘米:");
Serial.println(距离);
int carEntry = digitalRead(carEnter); // 读取 ir 输入
if (carEntry == HIGH) { // 如果高则计数并发送数据
countYes++; //递增计数
Serial.print("Car Entered = " ); Serial.println(countYes);
lcd.setCursor(0, 1);
lcd.print("汽车进入");
for (pos = 140; pos >= 45; pos -= 1) { // 改变伺服位置
myservos.write(pos);
延迟(5);
}
延迟(2000);
for (pos = 45; pos <= 140; pos += 1) { // 改变伺服位置
// 以 1 度为步长
myservos.write(pos);
延迟(5);
}
Firebase.pushString("/停车状态/", fireAvailable ); // 发送字符串到
firebase lcd.clear();
}
int carExit = digitalRead(carExited); //读取退出红外传感器
if (carExit == HIGH) { //如果高则计数并发送
countYes--; //递减计数
Serial.print("Car Exited = " ); Serial.println(countYes);
lcd.setCursor(0, 1);
lcd.print("汽车退出");
for (pos1 = 140; pos1 >= 45; pos1 -= 1) { // 改变伺服位置
myservo.write(pos1);
延迟(5);
}
延迟(2000);
for (pos1 = 45; pos1 <= 140; pos1 += 1) { // 改变伺服位置
// 以 1 度为步长
myservo.write(pos1);
延迟(5);
}
Firebase.pushString("/停车状态/", fireAvailable ); // 发送字符串到
firebase lcd.clear();
}
if (distance < 6) { //如果距离小于 6cm 然后在 led
Serial.println("Occupied");
数字写入(领导,高);
}
if (distance > 6) { //如果距离大于 6cm 则关闭
LED Serial.println("Available");
数字写入(领导,低);
}
Empty = allSpace - countYes;//计算可用数据
Available = String("Available=") + String(Empty) + String("/") + String(allSpace); // 将 int 转换为字符串
fireAvailable = String("Available=") + String(Empty) + String("/") + String(allSpace);
lcd.setCursor(0, 0);
lcd.print(可用);//将可用数据打印到lcd
}
评论
查看更多