隨著智慧城市的日益普及,每個(gè)領(lǐng)域都需要智能解決方案。物聯(lián)網(wǎng)通過(guò)互聯(lián)網(wǎng)控制功能實(shí)現(xiàn)了智能城市的可能性。一個(gè)人只需使用智能手機(jī)或任何連接互聯(lián)網(wǎng)的設(shè)備,就可以從世界任何地方控制安裝在他家或辦公室中的設(shè)備。智慧城市中有多個(gè)領(lǐng)域,智能停車(chē)是智慧城市中的熱門(mén)領(lǐng)域之一。
智能停車(chē)行業(yè)已經(jīng)看到了許多創(chuàng)新,如智能停車(chē)管理系統(tǒng)、智能門(mén)禁、可以檢測(cè)車(chē)輛類型的智能攝像頭、ANPR(自動(dòng)車(chē)牌識(shí)別)、智能支付系統(tǒng)、智能進(jìn)入系統(tǒng)等等。今天將采用類似的方法并構(gòu)建智能停車(chē)解決方案,該解決方案將使用超聲波傳感器檢測(cè)車(chē)輛的存在并觸發(fā)門(mén)自動(dòng)打開(kāi)或關(guān)閉。ESP8266 NodeMCU 將在此處用作主控制器,以控制與其連接的所有外圍設(shè)備。
在這個(gè)物聯(lián)網(wǎng)智能停車(chē)系統(tǒng)中,我們會(huì)將數(shù)據(jù)發(fā)送到網(wǎng)絡(luò)服務(wù)器,以查找車(chē)輛停車(chē)位的可用性。在這里,我們使用 firebase 作為物聯(lián)網(wǎng)數(shù)據(jù)庫(kù)來(lái)獲取停車(chē)可用性數(shù)據(jù)。為此,我們需要找到 Firebase 主機(jī)地址和授權(quán)密鑰。
所需組件
ESP8266 NodeMCU
超聲波傳感器
直流伺服電機(jī)
紅外傳感器
16x2 i2c 液晶顯示器
跳線
電路原理圖
下面給出了這個(gè)基于物聯(lián)網(wǎng)的車(chē)輛停車(chē)系統(tǒng)的電路圖。它包括兩個(gè)紅外傳感器、兩個(gè)伺服電機(jī)、一個(gè)超聲波傳感器和一個(gè) 16x2 液晶顯示器。
在這里,ESP8266 將控制整個(gè)過(guò)程,并將停車(chē)可用性信息發(fā)送到 Google Firebase,以便可以通過(guò)互聯(lián)網(wǎng)從世界任何地方對(duì)其進(jìn)行監(jiān)控。兩個(gè)紅外傳感器用于入口和出口大門(mén),以檢測(cè)汽車(chē)的存在并自動(dòng)打開(kāi)或關(guān)閉大門(mén)。IR 傳感器用于通過(guò)發(fā)送和接收紅外線來(lái)檢測(cè)任何物體,在此處了解有關(guān) IR 傳感器的更多信息。我們還介紹了有關(guān)Arduino IR 傳感器接口的詳細(xì)教程,您可以查看該教程以了解更多 IR 傳感器模塊的工作原理以及如何將其與 Arduino uno 連接。
兩個(gè)伺服器將充當(dāng)入口和出口門(mén),它們旋轉(zhuǎn)以打開(kāi)或關(guān)閉門(mén)。最后,使用超聲波傳感器檢測(cè)停車(chē)位是否可用或被占用,并將數(shù)據(jù)相應(yīng)地發(fā)送到 ESP8266。查看本教程末尾提供的視頻以了解該項(xiàng)目的完整工作。
這是這個(gè)完整的智能停車(chē)系統(tǒng)原型的外觀:
為智能停車(chē)解決方案編程 ESP8266 NodeMCU
帶有工作視頻的完整代碼本教程末尾
要對(duì) NodeMCU 進(jìn)行編程,只需使用 Micro USB 電纜將 NodeMCU 插入計(jì)算機(jī)并打開(kāi) Arduino IDE。I2C 顯示器和伺服電機(jī)需要這些庫(kù)。LCD 將顯示停車(chē)位的可用性,伺服電機(jī)將用于打開(kāi)和關(guān)閉出入口。Wire.h庫(kù)將用于在 i2c 協(xié)議中連接 LCD?。ESP8266 NodeMCU 中的 I2C 引腳為 D1 (SCL) 和 D2 (SDA)。這里使用的數(shù)據(jù)庫(kù)將是 Firebase,所以這里我們還包括相同的庫(kù)(FirebaseArduino.h)。
?
#include#include #include #include #include
?
然后包含從 Google Firebase 獲得的 Firebase 憑據(jù)。這些將包括包含您的項(xiàng)目名稱和密鑰的主機(jī)名。要查找這些值,請(qǐng)遵循Firebase 上的上一教程。
?
#define FIREBASE_HOST "smart-parking-7f5b6.firebaseio.com" #define FIREBASE_AUTH "suAkUQ4wXRPW7nA0zJQVsx3H2LmeBDPGmfTMBHCT"
?
包括 WiFi SSID 和密碼等 WiFi 憑據(jù)。
?
#define WIFI_SSID "CircuitDigest" #define WIFI_PASSWORD "circuitdigest101"
?
使用設(shè)備地址(此處為 0x27)和 LCD 類型初始化 I2C LCD。還包括用于進(jìn)出大門(mén)的伺服電機(jī)。
?
LiquidCrystal_I2C lcd(0x27, 16, 2); 伺服myservo; 伺服myservo1;
?
啟動(dòng) I2C LCD 的 I2C 通信。
?
Wire.begin(D2, D1);
?
將進(jìn)出伺服電機(jī)連接到 NodeMCU 的 D5、D6 引腳。
?
myservo.attach(D6); myservos.attach(D5);
?
選擇超聲波傳感器的觸發(fā)引腳作為輸出,回波引腳作為輸入。超聲波傳感器將用于檢測(cè)停車(chē)位的可用性。如果汽車(chē)占據(jù)了空間,那么它會(huì)發(fā)光,否則它不會(huì)發(fā)光。
?
pinMode(TRIG,輸出); pinMode(回聲,輸入);
?
NodeMCU 的兩個(gè)引腳 D0 和 D4 用于獲取 IR 傳感器讀數(shù)。紅外傳感器將充當(dāng)入口和出口門(mén)傳感器。這將檢測(cè)汽車(chē)的存在。
?
pinMode(carExited,輸入); pinMode(carEnter,輸入);
?
連接到 WiFi 并等待一段時(shí)間,直到它連接上。
?
WiFi.begin(WIFI_SSID, WIFI_PASSWORD); Serial.print("正在連接"); Serial.print(WIFI_SSID); while (WiFi.status() != WL_CONNECTED) { Serial.print("."); 延遲(500); }
?
使用主機(jī)和密鑰作為憑據(jù)開(kāi)始與 Firebase 連接。
?
Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);
?
啟動(dòng) i2c 16x2 LCD 并將光標(biāo)位置設(shè)置在第 0行第0列。
?
液晶顯示器開(kāi)始(); lcd.setCursor(0, 0);
?
從超聲波傳感器中獲取距離。這將用于檢測(cè)特定地點(diǎn)的車(chē)輛存在。首先發(fā)送 2 微秒脈沖,然后讀取接收到的脈沖。然后將其轉(zhuǎn)換為'cm'。在此處了解有關(guān)使用超聲波傳感器測(cè)量距離的更多信息。
?
數(shù)字寫(xiě)入(觸發(fā),低); 延遲微秒(2); 數(shù)字寫(xiě)入(觸發(fā),高); 延遲微秒(10); 數(shù)字寫(xiě)入(觸發(fā),低); 持續(xù)時(shí)間=脈沖輸入(回聲,高); 距離 = (持續(xù)時(shí)間 / 2) / 29.1;
?
以數(shù)字方式讀取 IR 傳感器引腳作為進(jìn)入傳感器并檢查其是否為高電平。如果它很高,則增加條目計(jì)數(shù)并將其打印到16x2 LCD 顯示器和串行監(jiān)視器。
?
int carEntry = digitalRead(carEnter); if (carEntry == HIGH) { countYes++; Serial.print("汽車(chē)進(jìn)入 = " ); Serial.println(countYes); lcd.setCursor(0, 1); lcd.print("汽車(chē)進(jìn)入");
?
同時(shí)移動(dòng)伺服電機(jī)角度以打開(kāi)入口門(mén)。根據(jù)您的用例更改角度。
?
for (pos = 140; pos >= 45; pos -= 1) { myservos.write(pos); 延遲(5); } 延遲(2000); for (pos = 45; pos <= 140; pos += 1) { // 以 1 度為步長(zhǎng) myservos.write(pos); 延遲(5); }
?
并使用Firebase 庫(kù)的pushString函數(shù)將讀數(shù)發(fā)送到firebase。
?
Firebase.pushString("/停車(chē)狀態(tài)/", fireAvailable );
?
對(duì)出口紅外傳感器和出口伺服電機(jī)執(zhí)行與上述類似的步驟。
?
int carExit = digitalRead(carExited); if (carExit == HIGH) { countYes--; Serial.print("汽車(chē)退出 = " ); Serial.println(countYes); lcd.setCursor(0, 1); lcd.print("汽車(chē)退出"); for (pos1 = 140; pos1 >= 45; pos1 -= 1) { myservo.write(pos1); 延遲(5); } 延遲(2000); for (pos1 = 45; pos1 <= 140; pos1 += 1) { // 以 1 度為步長(zhǎng) myservo.write(pos1); 延遲(5); } Firebase.pushString("/停車(chē)狀態(tài)/", fireAvailable ); lcd.clear(); }
?
檢查汽車(chē)是否已到達(dá)停車(chē)位,如果已到達(dá),則發(fā)光 LED 會(huì)發(fā)出停車(chē)位已滿的信號(hào)。
?
if (distance < 6) { Serial.println("Occupied"); 數(shù)字寫(xiě)入(領(lǐng)導(dǎo),高); }
?
否則表明該位置可用。
?
if (距離 > 6) { Serial.println("可用"); 數(shù)字寫(xiě)入(領(lǐng)導(dǎo),低); }
?
計(jì)算停車(chē)場(chǎng)內(nèi)的總空閑空間并將其保存在字符串中以將數(shù)據(jù)發(fā)送到 firebase。
?
Empty = allSpace - countYes; 可用 = String("可用= ") + String(Empty) + String("/") + String(allSpace); fireAvailable = String("Available=") + String(Empty) + String("/") + String(allSpace); 還將數(shù)據(jù)打印到 i2C LCD。 lcd.setCursor(0, 0); lcd.print(可用);
?
這就是如何在 Firebase 上在線跟蹤停車(chē)位的可用性,如下面的快照所示:
這樣就完成了使用 ESP8266 NodeMCU 模塊和不同外設(shè)的完整智能停車(chē)系統(tǒng)。
#include
#include
#include
#include
#include
#define FIREBASE_HOST "smart-parking-7f5b6.firebaseio.com" // 來(lái)自 firebase id 的項(xiàng)目名稱地址
#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; //伺服作為門(mén)
伺服myservos; //伺服作為門(mén)
int Empty; //可用空間整數(shù)
int allSpace = 90;
整數(shù)計(jì)數(shù)是 = 0;
int carEnter = D0; // 進(jìn)入傳感器
int carExited = D4; //exi 傳感器
int TRIG = D7; //超聲波觸發(fā)引腳
int ECHO = D8; // 超聲波回波引腳
int led = D3; // 現(xiàn)場(chǎng)占用信號(hào)
int pos;
詮釋 pos1;
持續(xù)時(shí)間長(zhǎng),距離遠(yuǎn);
無(wú)效設(shè)置(){
延遲(1000);
串行.開(kāi)始(9600);// 串口調(diào)試
Wire.begin(D2, D1); // i2c 啟動(dòng)
myservo.attach(D6); //伺服引腳到D6
myservos.attach(D5); // 伺服管腳到 D5
pinMode(TRIG, OUTPUT); // 觸發(fā)引腳作為輸出
pinMode(ECHO, INPUT); // echo pin 作為輸入
pinMode(led, OUTPUT); // 現(xiàn)場(chǎng)指示
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); // 開(kāi)始 Firebase 身份驗(yàn)證
液晶顯示器開(kāi)始();//開(kāi)始液晶
屏 lcd.home();
lcd.setCursor(0, 0); // 第 0 行第 0 列
lcd.print("Smart Parking");
}
無(wú)效循環(huán)(){
數(shù)字寫(xiě)入(觸發(fā),低);// 使觸發(fā)引腳為低
delayMicroseconds(2);
數(shù)字寫(xiě)入(觸發(fā),高);// 使觸發(fā)引腳高
delayMicroseconds(10);
數(shù)字寫(xiě)入(觸發(fā),低);
持續(xù)時(shí)間=脈沖輸入(回聲,高);
距離 = (持續(xù)時(shí)間 / 2) / 29.1; // 以厘米為單位取距離
Serial.print("厘米:");
Serial.println(距離);
int carEntry = digitalRead(carEnter); // 讀取 ir 輸入
if (carEntry == HIGH) { // 如果高則計(jì)數(shù)并發(fā)送數(shù)據(jù)
countYes++; //遞增計(jì)數(shù)
Serial.print("Car Entered = " ); Serial.println(countYes);
lcd.setCursor(0, 1);
lcd.print("汽車(chē)進(jìn)入");
for (pos = 140; pos >= 45; pos -= 1) { // 改變伺服位置
myservos.write(pos);
延遲(5);
}
延遲(2000);
for (pos = 45; pos <= 140; pos += 1) { // 改變伺服位置
// 以 1 度為步長(zhǎng)
myservos.write(pos);
延遲(5);
}
Firebase.pushString("/停車(chē)狀態(tài)/", fireAvailable ); // 發(fā)送字符串到
firebase lcd.clear();
}
int carExit = digitalRead(carExited); //讀取退出紅外傳感器
if (carExit == HIGH) { //如果高則計(jì)數(shù)并發(fā)送
countYes--; //遞減計(jì)數(shù)
Serial.print("Car Exited = " ); Serial.println(countYes);
lcd.setCursor(0, 1);
lcd.print("汽車(chē)退出");
for (pos1 = 140; pos1 >= 45; pos1 -= 1) { // 改變伺服位置
myservo.write(pos1);
延遲(5);
}
延遲(2000);
for (pos1 = 45; pos1 <= 140; pos1 += 1) { // 改變伺服位置
// 以 1 度為步長(zhǎng)
myservo.write(pos1);
延遲(5);
}
Firebase.pushString("/停車(chē)狀態(tài)/", fireAvailable ); // 發(fā)送字符串到
firebase lcd.clear();
}
if (distance < 6) { //如果距離小于 6cm 然后在 led
Serial.println("Occupied");
數(shù)字寫(xiě)入(領(lǐng)導(dǎo),高);
}
if (distance > 6) { //如果距離大于 6cm 則關(guān)閉
LED Serial.println("Available");
數(shù)字寫(xiě)入(領(lǐng)導(dǎo),低);
}
Empty = allSpace - countYes;//計(jì)算可用數(shù)據(jù)
Available = String("Available=") + String(Empty) + String("/") + String(allSpace); // 將 int 轉(zhuǎn)換為字符串
fireAvailable = String("Available=") + String(Empty) + String("/") + String(allSpace);
lcd.setCursor(0, 0);
lcd.print(可用);//將可用數(shù)據(jù)打印到lcd
}
評(píng)論
查看更多