隨著智慧城市的日益普及,每個領域都需要智能解決方案。物聯網通過互聯網控制功能實現了智能城市的可能性。一個人只需使用智能手機或任何連接互聯網的設備,就可以從世界任何地方控制安裝在他家或辦公室中的設備。智慧城市中有多個領域,智能停車是智慧城市中的熱門領域之一。
智能停車行業已經看到了許多創新,如智能停車管理系統、智能門禁、可以檢測車輛類型的智能攝像頭、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
}
評論
查看更多