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