智慧家居·万物互联:我的智能花盆DIY之旅(ESP32)
智慧家居·萬物互聯(lián):我的智能花盆DIY之旅
- 0 寫在前面
- 1 架構(gòu)怎么搭?
- 1.1 系統(tǒng)層次
- 1.2 MQTT是什么?
- 1.3 項目流程
- 2 云平臺怎么用?
- 2.1 創(chuàng)建設(shè)備
- 2.2 設(shè)備開發(fā)
- 2.3 設(shè)備管理
- 3 軟件怎么設(shè)計?
- 3.1 依賴庫配置
- 3.2 引腳定義與連接
- 3.3 WIFI配置
- 3.4 MQTT配置
- 3.5 連接云平臺
- 3.6 執(zhí)行設(shè)備
- 4 更進(jìn)一步
0 寫在前面
🔥物聯(lián)網(wǎng)(Internet of things, IoT)就是物物相連的互聯(lián)網(wǎng),在智能家居、智慧城市等方面有廣泛應(yīng)用。這次,我從零開始搭建一個基于ESP32的智能花盆,相信讀完本文,你也可以親自實現(xiàn)一個物聯(lián)網(wǎng)應(yīng)用,無論是參加創(chuàng)客大賽還是物聯(lián)網(wǎng)比賽,都先人一步!
首先,先看看最后的實物圖
1 架構(gòu)怎么搭?
1.1 系統(tǒng)層次
整個系統(tǒng)分為3部分:
- 云端服務(wù)部分 使用任何云服務(wù)器即可,本項目使用涂鴉云平臺,官網(wǎng)放在這涂鴉云平臺
- 控制器部分 本項目使用ESP32控制器,也可以使用STM32、樹莓派等
- 外圍設(shè)備部分 即傳感器、執(zhí)行器等,本項目主要采用光敏電阻、DHT11溫濕度傳感器、燈管、風(fēng)扇。也可使用舵機(jī)(做水閥)以及各種感應(yīng)設(shè)備。
1.2 MQTT是什么?
MQTT(Message Queuing Telemetry Transport),消息隊列遙測傳輸協(xié)議),是一種基于發(fā)布/訂閱(publish/subscribe)模式的"輕量級"通訊協(xié)議。MQTT最大優(yōu)點(diǎn)在于,可以以極少的代碼和有限的帶寬,為連接遠(yuǎn)程設(shè)備提供實時可靠的消息服務(wù)。作為一種低開銷、低帶寬占用的即時通訊協(xié)議,使其在物聯(lián)網(wǎng)、小型設(shè)備、移動應(yīng)用等方面有較廣泛的應(yīng)用。
圖源網(wǎng)絡(luò),侵刪1.3 項目流程
MQTT的訂閱方和發(fā)布方遵守同一種開發(fā)API格式,我們根據(jù)所選云平臺設(shè)計好的API進(jìn)行功能設(shè)計。在項目運(yùn)轉(zhuǎn)時,ESP32(或其他任何控制器)通過WIFI連接到互聯(lián)網(wǎng),使得其能夠與云平臺通信,去訂閱云平臺發(fā)布的話題(即API),這樣就能把底層傳感器的數(shù)據(jù)收集并傳輸給平臺,也能獲得平臺的反饋。
更進(jìn)一步,可將物聯(lián)網(wǎng)應(yīng)用部署到移動端、Web等。
接下來就按系統(tǒng)層次一步步完成DIY。
2 云平臺怎么用?
2.1 創(chuàng)建設(shè)備
進(jìn)入涂鴉云平臺選擇產(chǎn)品開發(fā),開始創(chuàng)建設(shè)備。
按如下圖文步驟完成產(chǎn)品創(chuàng)建。
- 產(chǎn)品開發(fā):創(chuàng)建產(chǎn)品
- 選擇產(chǎn)品:溫濕度傳感器
- 選擇智能化方式:設(shè)備接入
- 完善產(chǎn)品信息:
添加自定義功能
下面是本次實驗設(shè)計的所有功能。
2.2 設(shè)備開發(fā)
領(lǐng)取免費(fèi)激活碼并注冊一個設(shè)備,得到如下設(shè)備憑證。
記住這里的設(shè)備憑證,后續(xù)配置要用!!
2.3 設(shè)備管理
完成上述步驟后可以在設(shè)備管理中看到創(chuàng)建的設(shè)備。
3 軟件怎么設(shè)計?
3.1 依賴庫配置
本項目使用的DHT11驅(qū)動需要從下面兩個地址下載庫文件。DHT11、Adafruit_Sensor
MQTT庫和JSON庫則可以在Arduin倉庫中自行下載。
安裝MQTT庫
安裝Json庫
3.2 引腳定義與連接
查看下面的ESP32引腳定義
我的定義如下所示,大家可以參考
根據(jù)定義的實際接線圖如下:
3.3 WIFI配置
WIFI設(shè)置如下:
WIFI/// #define WIFI_SSID "Winter" // wifi名 #define WIFI_PASSWD "913982779" // wifi密碼 WIFI///3.4 MQTT配置
參考大家選用云平臺的協(xié)議規(guī)范,我這里參考涂鴉云MQTT協(xié)議
需要配置ClientID、UserName、Password三個屬性,都與前面設(shè)備憑證的DeviceId有關(guān),其中Password需要根據(jù)設(shè)備密碼用Hmac256算法加密。
3.5 連接云平臺
連接WIFI
WiFiClient espClient; //創(chuàng)建網(wǎng)絡(luò)連接客戶端//連接WIFI相關(guān)函數(shù) void setupWifi() {delay(10);Serial.println("Connecting WIFI");WiFi.begin(WIFI_SSID, WIFI_PASSWD);while (!WiFi.isConnected()){Serial.print(".");delay(500);}Serial.println("OK");Serial.println("Wifi connected successfully!");Serial.println("IP address: ");Serial.println(WiFi.localIP()); }配置并連接MQTT
//鏈接mqtt void setupMQTT() {client.setServer(mqttServer, mqttPort);client.setCallback(callback); while (!client.connected()){Serial.println("Connecting MQTT");if(client.connect(ClientId,User,Pass)){Serial.println("MQTT connected successfully!");client.subscribe(TOPIC);}else{Serial.print("Failed with state ");Serial.println(client.state());delay(2000);}} }其中MQTT回調(diào)函數(shù)的作用:若訂閱的主題有消息則觸發(fā)回調(diào)獲取消息
// MQTT回調(diào)函數(shù) void callback(char * topic,byte * payload,unsigned int length){DynamicJsonDocument doc(512);char charbuffer[512];Serial.print("Message arrived [");Serial.print(topic);Serial.println("]");int i = 0;for(;i<length;i++){charbuffer[i] = (char)payload[i];}charbuffer[i] = '\0';DeserializationError error = deserializeJson(doc,charbuffer);if(error){Serial.print(F("deserializeJson() failed: "));Serial.println(error.f_str());return;}bool lightOn = doc["data"]["light_switch"];bool dehumiOn = doc["data"]["fan_switch"];if (lightOn){digitalWrite(LIGHTPIN,HIGH);}else{digitalWrite(LIGHTPIN,LOW);}if (dehumiOn){digitalWrite(FANPIN,HIGH);}else{digitalWrite(FANPIN,LOW);} }Arduino的設(shè)置函數(shù)
void setup() {// put your setup code here, to run once:pinMode(LIGHTPIN,OUTPUT);Serial.begin(115200);setupWifi();setupMQTT();dht.begin(); }Arduino的循環(huán)函數(shù)
void loop() {delay(5000);// Read humidity dataint h = dht.readHumidity();// Read temperature as Celsius (the default)int t = dht.readTemperature();// Check if any reads failed and exit early (to try again).if (isnan(h) || isnan(t)) {Serial.println(F("Failed to read from DHT sensor!"));return;}// Read illumination datafloat l = analogRead(ADCPIN);int percent = 100 - l / 4096.0 * 100.0;// 串口打印Serial.print(F("Humidity: "));Serial.print(h);Serial.print(F("% Temperature: "));Serial.print(t);Serial.print(F("C "));Serial.print(F("illumination: "));Serial.print(percent);Serial.println(F("% "));// 封裝jsonDynamicJsonDocument doc(512);DynamicJsonDocument jsdata(256);DynamicJsonDocument tempdata(32);DynamicJsonDocument humidata(32);DynamicJsonDocument light(32);tempdata["value"] = t;tempdata["time"] = 1639454915;humidata["value"] = h;humidata["time"] = 1639454915;illudata["value"] = percent;illudata["time"] = 1639454915;jsdata["temp_current"] = tempdata;jsdata["humidity_current"] = humidata;jsdata["light_current"] = light;doc["msgId"] = "45lkj3551234001";doc["time"] = 1639454915;doc["data"] = jsdata;String str;serializeJson(doc, str); // Serial.println(str);// Sending to MQTTchar *p = (char *)str.c_str();if(client.publish("tylink/6c9a1bfe77510a9904vbva/thing/property/report",p) == true)Serial.println("Success sending message.");else Serial.println("Failed sending message.");client.loop(); }打開串口,成功收到連接消息。
打開云平臺,成功看到設(shè)備在線。同時也能獲得設(shè)置的各個屬性信息。
3.6 執(zhí)行設(shè)備
由于我選擇了USB燈管,但ESP32無法驅(qū)動USB(除非轉(zhuǎn)接),不得不以一種不甚優(yōu)雅的方式通過樹莓派間接驅(qū)動這些執(zhí)行設(shè)備。大家只要選型選好就不存在這種兩個控制器的問題,這里把樹莓派理解成一種驅(qū)動器即可,它通過讀ESP32的信號來點(diǎn)燈和驅(qū)動風(fēng)扇。下面代碼僅供參考
import RPi.GPIO as GPIO#------------------------------------------------------# # @breif: 執(zhí)行設(shè)備 #-------------------------------------------------------# class Exe:def __init__(self): self.light = 11 # 引腳11接燈self.fan = 13 # 引腳13接風(fēng)扇self.esp = 15 # 引腳15接ESP32GPIO.setmode(GPIO.BOARD)GPIO.setup(self.light,GPIO.OUT)GPIO.output(self.light,GPIO.LOW)GPIO.setup(self.fan ,GPIO.OUT)GPIO.output(self.fan ,GPIO.LOW)# @breif:驅(qū)動def run(self):if GPIO.input(self.esp):GPIO.output(self.light, GPIO.HIGH)GPIO.output(self.fan , GPIO.HIGH)else:GPIO.output(self.light, GPIO.LOW)GPIO.output(self.fan , GPIO.LOW)4 更進(jìn)一步
寫了個簡單的網(wǎng)頁來實時監(jiān)測、可視化。
🔥 更多精彩專欄:
- 《ROS從入門到精通》
- 《機(jī)器人原理與技術(shù)》
- 《機(jī)器學(xué)習(xí)強(qiáng)基計劃》
- 《計算機(jī)視覺教程》
- …
👇源碼獲取 · 技術(shù)交流 · 抱團(tuán)學(xué)習(xí) · 咨詢分享 請聯(lián)系👇
總結(jié)
以上是生活随笔為你收集整理的智慧家居·万物互联:我的智能花盆DIY之旅(ESP32)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux文件系统F2FS,文件系统F2
- 下一篇: 服务器硬盘整体ghost,ghost备份