一、前言
今天給大家?guī)?lái)的是ESP32系列聯(lián)網(wǎng)教程,因?yàn)槭鞘褂?a class="article-link" target="_blank" href="/tag/arduino/">Arduino開(kāi)發(fā),Arduino有很多庫(kù)函數(shù)可以讓我們直接使用,可謂是站在巨人的肩膀上乘涼。當(dāng)然網(wǎng)上教程一抹多,我也只是其中之一,只是給大家提供一寫思路和我實(shí)踐出來(lái)的方法,給大家避避雷。
二、云平臺(tái)
平臺(tái)選擇的話有很多喲,騰訊,阿里云,移動(dòng)云甚至EMQX自己去搭建一個(gè),這里我就選擇一個(gè)我常用的平臺(tái),阿里云作為這場(chǎng)教程的使用。
阿里云官網(wǎng)https://www.aliyun.com/
1. 添加產(chǎn)品
首先登陸賬號(hào)然后點(diǎn)擊控制臺(tái)
?點(diǎn)擊左上角目錄然后下滑找到 物聯(lián)網(wǎng)平臺(tái)
關(guān)注微信公眾號(hào)--星之援工作室 發(fā)送關(guān)鍵字(ESP32)可以獲取一些基本資料
????
點(diǎn)擊 公共實(shí)例 進(jìn)去(顯示沒(méi)有開(kāi)通就自行開(kāi)通一下就行了)
?點(diǎn)擊 產(chǎn)品 選項(xiàng)再點(diǎn)擊 創(chuàng)建產(chǎn)品
添加自己的 產(chǎn)品名稱 再點(diǎn)擊 自定義品類 最后點(diǎn)擊 確認(rèn) 產(chǎn)品就建立好了
?2. 添加設(shè)備
添加好產(chǎn)品后,我們需要給產(chǎn)品添加對(duì)應(yīng)的設(shè)備,用來(lái)識(shí)別我們的硬件和使用我們的mqtt協(xié)議,點(diǎn)擊 前往管理
再管理界面,我們點(diǎn)擊 添加設(shè)備 會(huì)彈出一個(gè)框,我們需要按要求添加名字和備注就行(這個(gè)是自定義的)
?我們點(diǎn)擊 查看設(shè)備信息
我框中的就是我們需要使用的連接平臺(tái)的數(shù)據(jù),可以先保存下來(lái)
三、Arduino
咱們就是默認(rèn)都安裝好了Arduino,當(dāng)然我這里也給出一個(gè)安裝教程,畢竟做就要做全套嘛~~
1.安裝教程
Arduino IDE 使用安裝以及ESP32庫(kù)的導(dǎo)入(離線)https://blog.csdn.net/herui_2/article/details/135296814?spm=1001.2014.3001.5501
?2.代碼編寫
所謂前人栽樹(shù)后人乘涼,現(xiàn)在就會(huì)體現(xiàn)的淋漓盡致,首先我們需要加載兩個(gè)庫(kù)
PubSubClient 庫(kù)
PubSubClient.h庫(kù)是Arduino中用于實(shí)現(xiàn)物聯(lián)網(wǎng)(IoT)功能的一個(gè)庫(kù),它支持 publish 和 subscribe 操作,使得Arduino開(kāi)發(fā)板能夠與各種物聯(lián)網(wǎng)平臺(tái)(如MQTT、CoAP等)進(jìn)行通信。這個(gè)庫(kù)的主要功能是將Arduino與云平臺(tái)連接,實(shí)現(xiàn)遠(yuǎn)程控制、數(shù)據(jù)傳輸和自動(dòng)化處理等。 PubSubClient.h庫(kù)的主要特點(diǎn)如下:
1. 易于使用:庫(kù)提供了簡(jiǎn)潔的API,便于開(kāi)發(fā)者進(jìn)行 Publish/Subscribe 操作。
2. 支持多種協(xié)議:支持MQTT、CoAP等物聯(lián)網(wǎng)協(xié)議,可根據(jù)項(xiàng)目需求選擇合適的協(xié)議。
3. 可靠性:庫(kù)中包含錯(cuò)誤處理和重傳機(jī)制,確保數(shù)據(jù)在傳輸過(guò)程中的可靠性。
4. 自動(dòng)重連:庫(kù)具有自動(dòng)重連功能,當(dāng)網(wǎng)絡(luò)連接斷開(kāi)時(shí),會(huì)自動(dòng)嘗試重新連接,確保設(shè)備始終在線。
5. 跨平臺(tái)兼容性:PubSubClient.h庫(kù)適用于各種Arduino開(kāi)發(fā)板,如Arduino Uno、Mega、Nano等。
6. 豐富的示例:庫(kù)提供了豐富的示例代碼,包括接入MQTT服務(wù)器、CoAP服務(wù)器等,幫助開(kāi)發(fā)者快速上手并實(shí)現(xiàn)實(shí)際應(yīng)用。
Ticker 庫(kù)
Arduino的Ticker庫(kù)是一個(gè)用于在預(yù)定時(shí)間間隔內(nèi)調(diào)用回調(diào)函數(shù)的庫(kù)。它使得Arduino開(kāi)發(fā)板能夠以固定周期執(zhí)行某些操作,適用于需要定期執(zhí)行的任務(wù)。Ticker庫(kù)不使用硬件計(jì)時(shí)器中斷,而是使用Arduino的micros()和millis()函數(shù)來(lái)實(shí)現(xiàn)定時(shí)功能。 Ticker庫(kù)的主要功能和用法如下:
1. 創(chuàng)建Ticker對(duì)象:通過(guò)構(gòu)造函數(shù)創(chuàng)建一個(gè)Ticker對(duì)象,傳入回調(diào)函數(shù)、時(shí)間間隔、重復(fù)次數(shù)和分辨率等參數(shù)。
2. 啟動(dòng)和暫停Ticker:使用start()和pause()方法控制Ticker的運(yùn)行狀態(tài)。 3. 停止Ticker:使用stop()方法隨時(shí)停止Ticker。
4. 更新Ticker:在main loop()中調(diào)用update()方法,以檢查Ticker的狀態(tài)并執(zhí)行回調(diào)函數(shù)。
5. 設(shè)置和獲取Ticker的時(shí)間間隔:使用interval()方法設(shè)置或獲取時(shí)間間隔。
6. 獲取Ticker的執(zhí)行次數(shù):使用counter()方法獲取已執(zhí)行的回調(diào)次數(shù)。
7. 獲取Ticker的狀態(tài):使用state()方法獲取Ticker的狀態(tài)(STOPPED、RUNNING或PAUSED)。
8. 獲取上次 tick 的時(shí)間:使用elapsed()方法獲取上次tick的時(shí)間。
9. 獲取下次tick的時(shí)間:使用remaining()方法獲取下次tick的時(shí)間。
完整代碼
?需要修改得到部分
想要連接上阿里云,還需要修改 PubSubClient.h 里面的配置參數(shù),這個(gè)文件再我們安裝的lib目錄里面可以找到
#include <WiFi.h>
#include <PubSubClient.h>
#include <Ticker.h>
// 設(shè)置wifi接入信息(請(qǐng)根據(jù)您的WiFi信息進(jìn)行修改)
const char* ssid = "NET";
const char* password = "12345678";
const char* mqttServer = "iot-06z00axdhgfk24n.mqtt.iothub.aliyuncs.com";
// 如以上MQTT服務(wù)器無(wú)法正常連接,請(qǐng)前往以下頁(yè)面尋找解決方案
// http://www.taichi-maker.com/public-mqtt-broker/
WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);
Ticker ticker;
int count; // Ticker計(jì)數(shù)用變量
// ****************************************************
// 注意!以下需要用戶根據(jù)然也物聯(lián)平臺(tái)信息進(jìn)行修改!否則無(wú)法工作!
// ****************************************************
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; // 客戶端訂閱主題時(shí)使用的QoS級(jí)別(截止2020-10-07,僅支持QoS = 1,不支持QoS = 2)
const bool cleanSession = false; // 清除會(huì)話(如QoS>0必須要設(shè)為false)
bool ledStatus = HIGH;
void setup() {
Serial.begin(9600); // 啟動(dòng)串口通訊
ticker.attach(1, tickerCount); // Ticker定時(shí)對(duì)象
//設(shè)置ESP8266工作模式為無(wú)線終端模式
WiFi.mode(WIFI_STA);
// 連接WiFi
connectWifi();
// 設(shè)置MQTT服務(wù)器和端口號(hào)
mqttClient.setServer(mqttServer, 1883);
mqttClient.setCallback(receiveCallback);
// 連接MQTT服務(wù)器
connectMQTTserver();
}
void loop() {
// 如果開(kāi)發(fā)板未能成功連接服務(wù)器,則嘗試連接服務(wù)器
if (!mqttClient.connected()) {
connectMQTTserver();
}
if (count == 3) {
pubMQTTmsg(); // 每隔3秒鐘發(fā)布一次信息
count = 0;
}
// 處理信息以及心跳
mqttClient.loop();
}
// 計(jì)時(shí)器
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è)備在離線時(shí)仍然能夠讓qos1工作,則connect時(shí)的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”為開(kāi)始
ledStatus = LOW;
} else {
ledStatus = HIGH;
}
pubMQTTmsg();
}
// 訂閱指定主題
void subscribeTopic() {
// 通過(guò)串口監(jiān)視器輸出是否成功訂閱主題以及訂閱的主題名稱
// 請(qǐng)注意subscribe函數(shù)第二個(gè)參數(shù)數(shù)字為QoS級(jí)別。這里為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"}";
// 實(shí)現(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("");
}
上傳程序
查看平臺(tái)
?只要修改成自己的設(shè)備信息,就可以看到設(shè)備在線了
實(shí)物效果
時(shí)間沖忙,簡(jiǎn)單的用面包板做了一個(gè)項(xiàng)目(PS:上面的代碼只是實(shí)現(xiàn)了聯(lián)網(wǎng)部分,沒(méi)有oled,舵機(jī),dht11的控制代碼,等我空了會(huì)一一講解一下)
四、參考與學(xué)習(xí)
【ESP32最全學(xué)習(xí)筆記(基礎(chǔ)篇)——1.ESP32簡(jiǎn)介】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/
當(dāng)然,需要完整項(xiàng)目可以質(zhì)詢博主
聯(lián)系方式 微信號(hào):13648103287