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 data
int 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 data
float 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("% "));
// 封裝json
DynamicJsonDocument 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 MQTT
char *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后,可在在線除錯功能界面除錯,查看傳感器資料,驗證功能

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/382103.html
標籤:其他
上一篇:行業分析| 泛娛樂應用出海探索
