一、前言
今天給大家?guī)淼氖荅SP32系列聯(lián)網(wǎng)教程,因為是使用Arduino開發(fā),Arduino有很多庫函數(shù)可以讓我們直接使用,可謂是站在巨人的肩膀上乘涼。當然網(wǎng)上教程一抹多,我也只是其中之一,只是給大家提供一寫思路和我實踐出來的方法,給大家避避雷。
二、云平臺
平臺選擇的話有很多喲,騰訊,阿里云,移動云甚至EMQX自己去搭建一個,這里我就選擇一個我常用的平臺,阿里云作為這場教程的使用。
阿里云官網(wǎng)https://www.aliyun.com/
1. 添加產(chǎn)品
首先登陸賬號然后點擊控制臺
?點擊左上角目錄然后下滑找到 物聯(lián)網(wǎng)平臺
關(guān)注微信公眾號--星之援工作室 發(fā)送關(guān)鍵字(ESP32)可以獲取一些基本資料
????
點擊 公共實例 進去(顯示沒有開通就自行開通一下就行了)
?點擊 產(chǎn)品 選項再點擊 創(chuàng)建產(chǎn)品
添加自己的 產(chǎn)品名稱 再點擊 自定義品類 最后點擊 確認 產(chǎn)品就建立好了
?2. 添加設(shè)備
添加好產(chǎn)品后,我們需要給產(chǎn)品添加對應(yīng)的設(shè)備,用來識別我們的硬件和使用我們的mqtt協(xié)議,點擊 前往管理
再管理界面,我們點擊 添加設(shè)備 會彈出一個框,我們需要按要求添加名字和備注就行(這個是自定義的)
?我們點擊 查看設(shè)備信息
我框中的就是我們需要使用的連接平臺的數(shù)據(jù),可以先保存下來
三、Arduino
咱們就是默認都安裝好了Arduino,當然我這里也給出一個安裝教程,畢竟做就要做全套嘛~~
1.安裝教程
Arduino IDE 使用安裝以及ESP32庫的導入(離線)https://blog.csdn.net/herui_2/article/details/135296814?spm=1001.2014.3001.5501
?2.代碼編寫
所謂前人栽樹后人乘涼,現(xiàn)在就會體現(xiàn)的淋漓盡致,首先我們需要加載兩個庫
PubSubClient 庫
PubSubClient.h庫是Arduino中用于實現(xiàn)物聯(lián)網(wǎng)(IoT)功能的一個庫,它支持 publish 和 subscribe 操作,使得Arduino開發(fā)板能夠與各種物聯(lián)網(wǎng)平臺(如MQTT、CoAP等)進行通信。這個庫的主要功能是將Arduino與云平臺連接,實現(xiàn)遠程控制、數(shù)據(jù)傳輸和自動化處理等。 PubSubClient.h庫的主要特點如下:
1. 易于使用:庫提供了簡潔的API,便于開發(fā)者進行 Publish/Subscribe 操作。
2. 支持多種協(xié)議:支持MQTT、CoAP等物聯(lián)網(wǎng)協(xié)議,可根據(jù)項目需求選擇合適的協(xié)議。
3. 可靠性:庫中包含錯誤處理和重傳機制,確保數(shù)據(jù)在傳輸過程中的可靠性。
4. 自動重連:庫具有自動重連功能,當網(wǎng)絡(luò)連接斷開時,會自動嘗試重新連接,確保設(shè)備始終在線。
5. 跨平臺兼容性:PubSubClient.h庫適用于各種Arduino開發(fā)板,如Arduino Uno、Mega、Nano等。
6. 豐富的示例:庫提供了豐富的示例代碼,包括接入MQTT服務(wù)器、CoAP服務(wù)器等,幫助開發(fā)者快速上手并實現(xiàn)實際應(yīng)用。
Ticker 庫
Arduino的Ticker庫是一個用于在預定時間間隔內(nèi)調(diào)用回調(diào)函數(shù)的庫。它使得Arduino開發(fā)板能夠以固定周期執(zhí)行某些操作,適用于需要定期執(zhí)行的任務(wù)。Ticker庫不使用硬件計時器中斷,而是使用Arduino的micros()和millis()函數(shù)來實現(xiàn)定時功能。 Ticker庫的主要功能和用法如下:
1. 創(chuàng)建Ticker對象:通過構(gòu)造函數(shù)創(chuàng)建一個Ticker對象,傳入回調(diào)函數(shù)、時間間隔、重復次數(shù)和分辨率等參數(shù)。
2. 啟動和暫停Ticker:使用start()和pause()方法控制Ticker的運行狀態(tài)。 3. 停止Ticker:使用stop()方法隨時停止Ticker。
4. 更新Ticker:在main loop()中調(diào)用update()方法,以檢查Ticker的狀態(tài)并執(zhí)行回調(diào)函數(shù)。
5. 設(shè)置和獲取Ticker的時間間隔:使用interval()方法設(shè)置或獲取時間間隔。
6. 獲取Ticker的執(zhí)行次數(shù):使用counter()方法獲取已執(zhí)行的回調(diào)次數(shù)。
7. 獲取Ticker的狀態(tài):使用state()方法獲取Ticker的狀態(tài)(STOPPED、RUNNING或PAUSED)。
8. 獲取上次 tick 的時間:使用elapsed()方法獲取上次tick的時間。
9. 獲取下次tick的時間:使用remaining()方法獲取下次tick的時間。
完整代碼
?需要修改得到部分
想要連接上阿里云,還需要修改 PubSubClient.h 里面的配置參數(shù),這個文件再我們安裝的lib目錄里面可以找到
#include <WiFi.h>
#include <PubSubClient.h>
#include <Ticker.h>
// 設(shè)置wifi接入信息(請根據(jù)您的WiFi信息進行修改)
const char* ssid = "NET";
const char* password = "12345678";
const char* mqttServer = "iot-06z00axdhgfk24n.mqtt.iothub.aliyuncs.com";
// 如以上MQTT服務(wù)器無法正常連接,請前往以下頁面尋找解決方案
// http://www.taichi-maker.com/public-mqtt-broker/
WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);
Ticker ticker;
int count; // Ticker計數(shù)用變量
// ****************************************************
// 注意!以下需要用戶根據(jù)然也物聯(lián)平臺信息進行修改!否則無法工作!
// ****************************************************
const char* mqttUserName = "ESP_Pet_device&h9sj0dFIZzO"; // 服務(wù)端連接用戶名(需要修改)
const char* mqttPassword = "9f86686e86c69f72d27515d6adb63c0223151e627bfa19284959647283210709"; // 服務(wù)端連接密碼(需要修改)
const char* clientId = "h9sj0dFIZzO.ESP_Pet_device|securemode=2,signmethod=hmacsha256,timestamp=1703866991146|"; // 客戶端id (需要修改)
const char* subTopic = "/broadcast/h9sj0dFIZzO/test1"; // 訂閱主題(需要修改)
const char* pubTopic = "/broadcast/h9sj0dFIZzO/test2"; // 訂閱主題(需要修改)
const char* willTopic = "/broadcast/h9sj0dFIZzO/test1"; // 遺囑主題名稱(需要修改)
// ****************************************************
//遺囑相關(guān)信息
const char* willMsg = "esp8266 offline"; // 遺囑主題信息
const int willQos = 0; // 遺囑QoS
const int willRetain = false; // 遺囑保留
const int subQoS = 1; // 客戶端訂閱主題時使用的QoS級別(截止2020-10-07,僅支持QoS = 1,不支持QoS = 2)
const bool cleanSession = false; // 清除會話(如QoS>0必須要設(shè)為false)
bool ledStatus = HIGH;
void setup() {
Serial.begin(9600); // 啟動串口通訊
ticker.attach(1, tickerCount); // Ticker定時對象
//設(shè)置ESP8266工作模式為無線終端模式
WiFi.mode(WIFI_STA);
// 連接WiFi
connectWifi();
// 設(shè)置MQTT服務(wù)器和端口號
mqttClient.setServer(mqttServer, 1883);
mqttClient.setCallback(receiveCallback);
// 連接MQTT服務(wù)器
connectMQTTserver();
}
void loop() {
// 如果開發(fā)板未能成功連接服務(wù)器,則嘗試連接服務(wù)器
if (!mqttClient.connected()) {
connectMQTTserver();
}
if (count == 3) {
pubMQTTmsg(); // 每隔3秒鐘發(fā)布一次信息
count = 0;
}
// 處理信息以及心跳
mqttClient.loop();
}
// 計時器
void tickerCount() {
count++;
}
// 連接MQTT服務(wù)器并訂閱信息
void connectMQTTserver() {
// 根據(jù)ESP8266的MAC地址生成客戶端ID(避免與其它ESP8266的客戶端ID重名)
/* 連接MQTT服務(wù)器
boolean connect(const char* id, const char* user,
const char* pass, const char* willTopic,
uint8_t willQos, boolean willRetain,
const char* willMessage, boolean cleanSession);
若讓設(shè)備在離線時仍然能夠讓qos1工作,則connect時的cleanSession需要設(shè)置為false
*/
if (mqttClient.connect(clientId, mqttUserName,
mqttPassword, willTopic,
willQos, willRetain, willMsg, cleanSession)) {
Serial.print("MQTT Server Connected. ClientId: ");
Serial.println(clientId);
Serial.print("MQTT Server: ");
Serial.println(mqttServer);
subscribeTopic(); // 訂閱指定主題
} else {
Serial.print("MQTT Server Connect Failed. Client State:");
Serial.println(mqttClient.state());
delay(5000);
}
}
// 收到信息后的回調(diào)函數(shù)
void receiveCallback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message Received [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println("");
Serial.print("Message Length(Bytes) ");
Serial.println(length);
if ((char)payload[0] == '1') { // 如果收到的信息以“1”為開始
ledStatus = LOW;
} else {
ledStatus = HIGH;
}
pubMQTTmsg();
}
// 訂閱指定主題
void subscribeTopic() {
// 通過串口監(jiān)視器輸出是否成功訂閱主題以及訂閱的主題名稱
// 請注意subscribe函數(shù)第二個參數(shù)數(shù)字為QoS級別。這里為QoS = 1
if (mqttClient.subscribe(subTopic, subQoS)) {
Serial.print("Subscribed Topic: ");
Serial.println(subTopic);
} else {
Serial.print("Subscribe Fail...");
}
}
// 發(fā)布信息
void pubMQTTmsg() {
char* pubMessage;
pubMessage = "{"heart":"1"}";
// 實現(xiàn)ESP8266向主題發(fā)布信息
if (mqttClient.publish(pubTopic, pubMessage)) {
Serial.println("Publish Topic:");
Serial.println(pubTopic);
Serial.println(pubMessage);
} else {
Serial.println("Message Publish Failed.");
}
}
// ESP8266連接wifi
void connectWifi() {
WiFi.begin(ssid, password);
//等待WiFi連接,成功連接后輸出成功信息
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi Connected!");
Serial.println("");
}
上傳程序
查看平臺
?只要修改成自己的設(shè)備信息,就可以看到設(shè)備在線了
實物效果
時間沖忙,簡單的用面包板做了一個項目(PS:上面的代碼只是實現(xiàn)了聯(lián)網(wǎng)部分,沒有oled,舵機,dht11的控制代碼,等我空了會一一講解一下)
四、參考與學習
【ESP32最全學習筆記(基礎(chǔ)篇)——1.ESP32簡介】https://blog.csdn.net/m0_46509684/article/details/129079088?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170401469316800186571625%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=170401469316800186571625&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-129079088-null-null.142%5Ev99%5Epc_search_result_base7&utm_term=%20ESP32%20&spm=1018.2226.3001.4187
太極創(chuàng)客http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-tuttorial/mqtt-application/esp8266-iot-basics/
當然,需要完整項目可以質(zhì)詢博主
聯(lián)系方式 微信號:13648103287