Arduino Esp8266開發 (三)上傳數據到阿里雲MQTT服務器

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

相關文章
相關標籤/搜索