智慧家居·万物互联:我的智能花盆DIY之旅(ESP32)
智慧家居·萬(wàn)物互聯(lián):我的智能花盆DIY之旅
- 0 寫(xiě)在前面
- 1 架構(gòu)怎么搭?
- 1.1 系統(tǒng)層次
- 1.2 MQTT是什么?
- 1.3 項(xiàng)目流程
- 2 云平臺(tái)怎么用?
- 2.1 創(chuàng)建設(shè)備
- 2.2 設(shè)備開(kāi)發(fā)
- 2.3 設(shè)備管理
- 3 軟件怎么設(shè)計(jì)?
- 3.1 依賴(lài)庫(kù)配置
- 3.2 引腳定義與連接
- 3.3 WIFI配置
- 3.4 MQTT配置
- 3.5 連接云平臺(tái)
- 3.6 執(zhí)行設(shè)備
- 4 更進(jìn)一步
0 寫(xiě)在前面
🔥物聯(lián)網(wǎng)(Internet of things, IoT)就是物物相連的互聯(lián)網(wǎng),在智能家居、智慧城市等方面有廣泛應(yīng)用。這次,我從零開(kāi)始搭建一個(gè)基于ESP32的智能花盆,相信讀完本文,你也可以親自實(shí)現(xiàn)一個(gè)物聯(lián)網(wǎng)應(yīng)用,無(wú)論是參加創(chuàng)客大賽還是物聯(lián)網(wǎng)比賽,都先人一步!
首先,先看看最后的實(shí)物圖
1 架構(gòu)怎么搭?
1.1 系統(tǒng)層次
整個(gè)系統(tǒng)分為3部分:
- 云端服務(wù)部分 使用任何云服務(wù)器即可,本項(xiàng)目使用涂鴉云平臺(tái),官網(wǎng)放在這涂鴉云平臺(tái)
- 控制器部分 本項(xiàng)目使用ESP32控制器,也可以使用STM32、樹(shù)莓派等
- 外圍設(shè)備部分 即傳感器、執(zhí)行器等,本項(xiàng)目主要采用光敏電阻、DHT11溫濕度傳感器、燈管、風(fēng)扇。也可使用舵機(jī)(做水閥)以及各種感應(yīng)設(shè)備。
1.2 MQTT是什么?
MQTT(Message Queuing Telemetry Transport),消息隊(duì)列遙測(cè)傳輸協(xié)議),是一種基于發(fā)布/訂閱(publish/subscribe)模式的"輕量級(jí)"通訊協(xié)議。MQTT最大優(yōu)點(diǎn)在于,可以以極少的代碼和有限的帶寬,為連接遠(yuǎn)程設(shè)備提供實(shí)時(shí)可靠的消息服務(wù)。作為一種低開(kāi)銷(xiāo)、低帶寬占用的即時(shí)通訊協(xié)議,使其在物聯(lián)網(wǎng)、小型設(shè)備、移動(dòng)應(yīng)用等方面有較廣泛的應(yīng)用。
圖源網(wǎng)絡(luò),侵刪1.3 項(xiàng)目流程
MQTT的訂閱方和發(fā)布方遵守同一種開(kāi)發(fā)API格式,我們根據(jù)所選云平臺(tái)設(shè)計(jì)好的API進(jìn)行功能設(shè)計(jì)。在項(xiàng)目運(yùn)轉(zhuǎn)時(shí),ESP32(或其他任何控制器)通過(guò)WIFI連接到互聯(lián)網(wǎng),使得其能夠與云平臺(tái)通信,去訂閱云平臺(tái)發(fā)布的話題(即API),這樣就能把底層傳感器的數(shù)據(jù)收集并傳輸給平臺(tái),也能獲得平臺(tái)的反饋。
更進(jìn)一步,可將物聯(lián)網(wǎng)應(yīng)用部署到移動(dòng)端、Web等。
接下來(lái)就按系統(tǒng)層次一步步完成DIY。
2 云平臺(tái)怎么用?
2.1 創(chuàng)建設(shè)備
進(jìn)入涂鴉云平臺(tái)選擇產(chǎn)品開(kāi)發(fā),開(kāi)始創(chuàng)建設(shè)備。
按如下圖文步驟完成產(chǎn)品創(chuàng)建。
- 產(chǎn)品開(kāi)發(fā):創(chuàng)建產(chǎn)品
- 選擇產(chǎn)品:溫濕度傳感器
- 選擇智能化方式:設(shè)備接入
- 完善產(chǎn)品信息:
添加自定義功能
下面是本次實(shí)驗(yàn)設(shè)計(jì)的所有功能。
2.2 設(shè)備開(kāi)發(fā)
領(lǐng)取免費(fèi)激活碼并注冊(cè)一個(gè)設(shè)備,得到如下設(shè)備憑證。
記住這里的設(shè)備憑證,后續(xù)配置要用!!
2.3 設(shè)備管理
完成上述步驟后可以在設(shè)備管理中看到創(chuàng)建的設(shè)備。
3 軟件怎么設(shè)計(jì)?
3.1 依賴(lài)庫(kù)配置
本項(xiàng)目使用的DHT11驅(qū)動(dòng)需要從下面兩個(gè)地址下載庫(kù)文件。DHT11、Adafruit_Sensor
MQTT庫(kù)和JSON庫(kù)則可以在Arduin倉(cāng)庫(kù)中自行下載。
安裝MQTT庫(kù)
安裝Json庫(kù)
3.2 引腳定義與連接
查看下面的ESP32引腳定義
我的定義如下所示,大家可以參考
根據(jù)定義的實(shí)際接線圖如下:
3.3 WIFI配置
WIFI設(shè)置如下:
WIFI/// #define WIFI_SSID "Winter" // wifi名 #define WIFI_PASSWD "913982779" // wifi密碼 WIFI///3.4 MQTT配置
參考大家選用云平臺(tái)的協(xié)議規(guī)范,我這里參考涂鴉云MQTT協(xié)議
需要配置ClientID、UserName、Password三個(gè)屬性,都與前面設(shè)備憑證的DeviceId有關(guān),其中Password需要根據(jù)設(shè)備密碼用Hmac256算法加密。
3.5 連接云平臺(tái)
連接WIFI
WiFiClient espClient; //創(chuàng)建網(wǎng)絡(luò)連接客戶(hù)端//連接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(); }打開(kāi)串口,成功收到連接消息。
打開(kāi)云平臺(tái),成功看到設(shè)備在線。同時(shí)也能獲得設(shè)置的各個(gè)屬性信息。
3.6 執(zhí)行設(shè)備
由于我選擇了USB燈管,但ESP32無(wú)法驅(qū)動(dòng)USB(除非轉(zhuǎn)接),不得不以一種不甚優(yōu)雅的方式通過(guò)樹(shù)莓派間接驅(qū)動(dòng)這些執(zhí)行設(shè)備。大家只要選型選好就不存在這種兩個(gè)控制器的問(wèn)題,這里把樹(shù)莓派理解成一種驅(qū)動(dòng)器即可,它通過(guò)讀ESP32的信號(hào)來(lái)點(diǎn)燈和驅(qū)動(dòng)風(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ū)動(dòng)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)一步
寫(xiě)了個(gè)簡(jiǎn)單的網(wǎng)頁(yè)來(lái)實(shí)時(shí)監(jiān)測(cè)、可視化。
🔥 更多精彩專(zhuān)欄:
- 《ROS從入門(mén)到精通》
- 《機(jī)器人原理與技術(shù)》
- 《機(jī)器學(xué)習(xí)強(qiáng)基計(jì)劃》
- 《計(jì)算機(jī)視覺(jué)教程》
- …
👇源碼獲取 · 技術(shù)交流 · 抱團(tuán)學(xué)習(xí) · 咨詢(xún)分享 請(qǐng)聯(lián)系👇
總結(jié)
以上是生活随笔為你收集整理的智慧家居·万物互联:我的智能花盆DIY之旅(ESP32)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux文件系统F2FS,文件系统F2
- 下一篇: 服务器硬盘整体ghost,ghost备份