esp32的MQTT物联网开发记录
生活随笔
收集整理的這篇文章主要介紹了
esp32的MQTT物联网开发记录
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
esp32的MQTT物聯網開發記錄
- 環境依賴
- 注冊產品
- 編寫程序
- 調試驗證
環境依賴
本項目在Windows環境下開發,所使用的軟件和三方庫如下
- Arduino IDE 1.8.16 (下載地址)
- DHT-sensor-library(地址 移動至 Arduino/libraries) DHT傳感器驅動
- Adafruit_Sensor(地址 移動至 Arduino/libraries) DHT傳感器依賴
- PubSubClient(工具=>管理庫 下載) MQTT庫
- ArduinoJson(工具=>管理庫 下載) JSON轉換工具
注冊產品
本項目使用的是涂鴉智能平臺提供的MQTT服務
創建產品
選擇產品類型,這里以溫濕度傳感器為例
選擇設備接入
完善產品信息
填寫功能定義
設備開發界面免費領取2個授權憑證
保存好DeviceID和DeviceSecret,編寫程序時填寫
編寫程序
引腳定義
#include "DHT.h" #include "WiFi.h" // #include "WiFiClientSecure.h" #include "PubSubClient.h" #include "ArduinoJson.h"GPIO/// #define DHTPIN 15 #define ADCPIN 32 #define DHTTYPE DHT11 // DHT 11 #define LIGHTPIN 2 #define FANPIN 13 GPIO///配置WiFi
WIFI/// #define WIFI_SSID "TJ***" //wifi名 #define WIFI_PASSWD "tjark***" //wifi密碼 WIFI///配置MQTT
這里的用戶名密碼參考tuyaMQTT開放協議
MQTT/// #define mqttServer "m1.tuyacn.com" #define mqttPort 1883 #define ClientId "tuyalink_6c7e8f5a8fd2eee79ea***" #define User "6c7e8f5a8fd2eee79ea***|signMethod=hmacSha256,timestamp=1639372190,securemode=1,accessType=1" #define Pass "1ccfff232bafe35be78d0eed7e952f7c37cde39b148c8c2f672fedd85875c***" #define TOPIC "tylink/6c7e8f5a8fd2eee79ea***/thing/property/set" MQTT///實例化
WiFiClient espClient; //創建網絡連接客戶端 PubSubClient client(espClient); //創建mqtt客戶端 DHT dht(DHTPIN, DHTTYPE); //DHT實例化連接WiFi
//連接WIFI相關函數 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回調函數
// MQTT回調函數 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"]["dehumi_switch"];if (lightOn){digitalWrite(LIGHTPIN,HIGH);}else{digitalWrite(LIGHTPIN,LOW);}if (dehumiOn){digitalWrite(FANPIN,HIGH);}else{digitalWrite(FANPIN,LOW);} }初始化
void setup() {// put your setup code here, to run once:pinMode(LIGHTPIN,OUTPUT);Serial.begin(115200);setupWifi();setupMQTT();dht.begin(); }主函數
void loop() {// put your main code here, to run repeatedly:// Wait a few seconds between measurements.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 illudata(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["illumi_current"] = illudata;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/6c7e8f5a8fd2eee79ea***/thing/property/report",p) == true){Serial.println("Success sending message.");}else{Serial.println("Failed sending message.");}client.loop(); }調試驗證
程序燒寫進esp32后,可在在線調試功能界面調試,查看傳感器數據,驗證功能
總結
以上是生活随笔為你收集整理的esp32的MQTT物联网开发记录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 简说生成器模式
- 下一篇: ae效果英文版翻译对照表_AE中英文对照