1、前言
一、可以使用Arduino的軟串口控制Esp8266接入網絡,能夠看看個人前兩個博客。服務器
二、瞭解MQTT協議,阿里雲搭建MQTT服務器。網絡
三、須要的庫文件函數
WiFiEsp庫是一個Arduino的封裝好AT指令的WiFi操做庫,可使用Arduino的軟串口操做oop
PubSubClient是一個用於Esp8266發佈/訂閱MQTT消息的庫。ui
連接:https://pan.baidu.com/s/1mAaIbO3-SzVaN-jaaFwVbw 提取碼:ol2p
四、修改Esp8266串口波特率爲9600阿里雲
使用AT指令輸入AT+UART_DEF=9600,8,1,0,0,如何使用AT指令請看Arduino Esp8266開發 (一)AT指令調試spa
五、參考的文章網址.net
2、Arduino代碼
#include "DHT.h" #include <WiFiEspClient.h> #include <WiFiEsp.h> #include <WiFiEspUdp.h> #include <PubSubClient.h> #include "SoftwareSerial.h" #define WIFI_AP "xxxx" //你家Wifi名稱 #define WIFI_PASSWORD "****" //密碼 // DHT #define DHTPIN 10 //DHT引腳 #define DHTTYPE DHT11 // 初始化DHT11傳感器 DHT dht(DHTPIN, DHTTYPE); char MqttServer[] = "1.11.111.0"; //MQTT服務器的IP地址(阿里雲公網IP) WiFiEspClient espClient; // 初始化以太網客戶端對象 -- WiFiEspClient.h PubSubClient client(espClient); // 初始化MQTT庫PubSubClient.h的對象 SoftwareSerial mySerial(2, 3); // RX, TX,聲明一個軟串口 int status = WL_IDLE_STATUS; unsigned long lastSend; void setup() { Serial.begin(9600); dht.begin(); InitWiFi(); // 鏈接WiFi client.setServer( MqttServer, 1883 ); // 鏈接WiFi以後,鏈接MQTT服務器 lastSend = 0; } void loop() { status = WiFi.status(); if ( status != WL_CONNECTED) { while ( status != WL_CONNECTED) { Serial.print("[loop()]Attempting to connect to WPA SSID: "); Serial.println(WIFI_AP); // 鏈接WiFi熱點 status = WiFi.begin(WIFI_AP, WIFI_PASSWORD); delay(500); } Serial.println("[loop()]Connected to AP"); } if ( !client.connected() ) { reconnect(); } if ( millis() - lastSend > 1000 ) { // 用於定時1秒鐘發送一次數據 getAndSendTemperatureAndHumidityData(); // 獲取溫溼度數據發送到MQTT服務器上去 lastSend = millis(); } client.loop(); } /* * 讀取溫溼度數據,而後發送到MQTT服務器上去 */ void getAndSendTemperatureAndHumidityData() { Serial.println("Collecting temperature data."); // 大概250ms讀取一次 float h = dht.readHumidity(); float t = dht.readTemperature(); // 查看是否讀取溫溼度失敗的 if (isnan(h) || isnan(t)) { Serial.println("Failed to read from DHT sensor!"); return; } Serial.print("Humidity: "); Serial.print(h); Serial.print(" %\t"); Serial.print("Temperature: "); Serial.print(t); Serial.print(" *C "); String temperature = String(t); String humidity = String(h); Serial.print( "Sending temperature and humidity : [" ); Serial.print( temperature ); Serial.print( "," ); Serial.print( humidity ); Serial.print( "] -> " ); // 構建一個 JSON 格式的payload的字符串 String payload = "{"; payload += "\"temperature\":"; payload += temperature; payload += ","; payload += "\"humidity\":"; payload += humidity; payload += "}"; char attributes[100]; payload.toCharArray( attributes, 100 ); client.publish( "DHT11", attributes ); //發佈名字爲「DHT11」的主題 Serial.print("[publish]-->>"); Serial.println( attributes ); } /** *Wifi鏈接初始化 */ void InitWiFi() { // 初始化軟串口,軟串口鏈接ESP模塊 mySerial.begin(9600); // 初始化ESP模塊 WiFi.init(&mySerial); // 檢測WiFi模塊在不在,宏定義:WL_NO_SHIELD = 255,WL_IDLE_STATUS = 0, if (WiFi.status() == WL_NO_SHIELD) { Serial.println("WiFi shield not present"); while (true); } Serial.println("[InitWiFi]Connecting to AP ..."); // 嘗試鏈接WiFi網絡 while ( status != WL_CONNECTED) { Serial.print("[InitWiFi]Attempting to connect to WPA SSID: "); Serial.println(WIFI_AP); status = WiFi.begin(WIFI_AP, WIFI_PASSWORD); delay(500); } Serial.println("[InitWiFi]Connected to AP"); } /** * MQTT客戶端斷線重連函數 */ void reconnect() { // 一直循環直到鏈接上MQTT服務器 while (!client.connected()) { Serial.print("[reconnect]Connecting to MQTT Server ..."); // 嘗試鏈接connect是個重載函數 (clientId, username, password) if ( client.connect("mqttx_f4bb1f54", "zky", "135") ) { //設置客戶端ID(自定義),用戶名,密碼 Serial.println( "[DONE]" ); } else { Serial.print( "[FAILED] [ mqtt connect error code = " ); Serial.print( client.state() ); Serial.println( " : retrying in 5 seconds]" );// Wait 5 seconds before retrying delay( 5000 ); } } }
3、效果
一、登陸EMQ X Dashboard
調試
二、鏈接客戶端
三、訂閱
四、發送和接收
code