ESP8266 kết nối với nền tảng IoT của Alibaba Cloud để tải dữ liệu nhiệt độ và độ ẩm

Giới thiệu

Bài viết này sử dụng bo mạch NodeMCU (ESP8266) và cảm biến nhiệt độ độ ẩm SHTC3 để kết nối với nền tảng Internet of Things (IoT) của Alibaba Cloud và tải lên dữ liệu nhiệt độ và độ ẩm đã đọc được. Dữ liệu nhiệt độ và độ ẩm được đọc mỗi giây, và trung bình của dữ liệu trong 30 giây được tải lên mỗi 30 giây. Bạn có thể tự sửa chương trình để sử dụng các cảm biến nhiệt độ độ ẩm khác. Chương trình trong bài viết này được phát triển bằng Arduino IDE.

Chương trình đọc dữ liệu từ cảm biến nhiệt độ độ ẩm DHT11 và DHT22: https://blog.zeruns.com/archives/527.html
Hướng dẫn thiết lập môi trường phát triển ESP8266: https://blog.zeruns.com/archives/526.html

Chân SDA của SHTC3 kết nối với chân D5 của NodeMCU, chân SCL kết nối với chân D6 của NodeMCU.

Thiết lập nền tảng IoT

Đầu tiên, đăng ký tài khoản Alibaba Cloud và kích hoạt nền tảng IoT: https://www.aliyun.com/product/iot?source=5176.11533457&userCode=jdjc69nf&type=copy

Sau đó, mở bảng điều khiển IoT: https://iot.console.aliyun.com/product

Tiếp theo, làm theo hướng dẫn trong hình để tạo sản phẩm

Làm theo hướng dẫn trong hình để thêm thiết bị

Mã nguồn chương trình

Trước tiên, cài đặt ba thư viện: PubSubClient, ArduinoJson, SparkFun SHTC3.

Sau đó, làm theo hướng dẫn dưới đây để sửa đổi tệp PubSubClient.h.

Chỉ cần sửa các tham số theo hướng dẫn trong mã.

#include <ESP8266WiFi.h>
/* Phụ thuộc PubSubClient 2.4.0 */
#include <PubSubClient.h>
/* Phụ thuộc ArduinoJson 5.13.4 */
#include <ArduinoJson.h>
#include <SparkFun_SHTC3.h>

/* Kết nối với SSID và mật khẩu WiFi của bạn */
#define WIFI_SSID         "SSID của bộ định tuyến"
#define WIFI_PASSWD       "Mật khẩu"


/* Thông tin ba yếu tố thiết bị */
#define PRODUCT_KEY       "PRODUCT_KEY của thiết bị"
#define DEVICE_NAME       "Thay thế DEVICE_NAME"
#define DEVICE_SECRET     "Thay thế DEVICE_SECRET"
#define REGION_ID         "cn-shanghai"

/* Tên miền và cổng môi trường trực tuyến, không cần thay đổi */
#define MQTT_SERVER       PRODUCT_KEY ".iot-as-mqtt." REGION_ID ".aliyuncs.com"
#define MQTT_PORT         1883
#define MQTT_USRNAME      DEVICE_NAME "&" PRODUCT_KEY

#define CLIENT_ID         "ESP8266|securemode=3,timestamp=1234567890,signmethod=hmacsha1|"
// Công cụ mã hóa: http://iot-face.oss-cn-shanghai.aliyuncs.com/tools.htm để tạo password
// Hướng dẫn password: https://www.yuque.com/cloud-dev/iot-tech/mebm5g
#define MQTT_PASSWD       "Tham khảo hướng dẫn password ở trên, tạo bằng công cụ mã hóa. Nếu không hiểu hướng dẫn, xem bên dưới bài viết"

#define ALINK_BODY_FORMAT         "{\"id\":\"ESP8266\",\"version\":\"1.0\",\"method\":\"thing.event.property.post\",\"params\":%s}"
#define ALINK_TOPIC_PROP_POST     "/sys/" PRODUCT_KEY "/" DEVICE_NAME "/thing/event/property/post"

unsigned long lastMs = 0;
float RH,T,RH_sum,T_sum;
unsigned char count=0;
WiFiClient espClient;
PubSubClient  client(espClient);
SHTC3 mySHTC3;

void callback(char *topic, byte *payload, unsigned int length)
{
    Serial.print("Message arrived [");
    Serial.print(topic);
    Serial.print("] ");
    payload[length] = '\0';
    Serial.println((char *)payload);

}

void wifiInit()
{
    WiFi.mode(WIFI_STA);
    WiFi.begin(WIFI_SSID, WIFI_PASSWD);   // Kết nối WiFi
    while (WiFi.status() != WL_CONNECTED)
    {
        delay(1000);
        Serial.println("WiFi không kết nối");
    }
    Serial.println("Đã kết nối với AP");
    Serial.println("Địa chỉ IP: ");
    Serial.println(WiFi.localIP());  
    Serial.print("espClient [");
    client.setServer(MQTT_SERVER, MQTT_PORT);   /* Sau khi kết nối WiFi, kết nối đến máy chủ MQTT */
    client.setCallback(callback);
}


void mqttCheckConnect()
{
    while (!client.connected())
    {
        Serial.println("Đang kết nối đến máy chủ MQTT ...");
        if (client.connect(CLIENT_ID, MQTT_USRNAME, MQTT_PASSWD))

        {

            Serial.println("MQTT đã kết nối!");

        }
        else
        {
            Serial.print("Lỗi kết nối MQTT:");
            Serial.println(client.state());
            delay(5000);
        }
    }
}


void mqttIntervalPost()
{
    char param[32];
    char jsonBuf[128];
    sprintf(param, "{\"CurrentTemperature\":%f}",T_sum/count);
    sprintf(jsonBuf, ALINK_BODY_FORMAT, param);
    Serial.println(jsonBuf);
    boolean d = client.publish(ALINK_TOPIC_PROP_POST, jsonBuf);
    if(d){
      Serial.println("Gửi nhiệt độ thành công"); 
    }else{
      Serial.println("Gửi nhiệt độ thất bại"); 
    }
    //https://blog.zeruns.com  
    sprintf(param, "{\"CurrentHumidity\":%f}",RH_sum/count);
    sprintf(jsonBuf, ALINK_BODY_FORMAT, param);
    Serial.println(jsonBuf);
    d = client.publish(ALINK_TOPIC_PROP_POST, jsonBuf);
    if(d){
      Serial.println("Gửi độ ẩm thành công"); 
    }else{
      Serial.println("Gửi độ ẩm thất bại"); 
    }
}

void errorDecoder(SHTC3_Status_TypeDef message) // Hàm errorDecoder in kết quả "SHTC3_Status_TypeDef" một cách thân thiện với người dùng
{
  switch(message)
  {
    case SHTC3_Status_Nominal : Serial.print("Bình thường"); break;
    case SHTC3_Status_Error : Serial.print("Lỗi"); break;
    case SHTC3_Status_CRC_Fail : Serial.print("CRC thất bại"); break;
    default : Serial.print("Mã trả về không xác định"); break;
  }
}
//https://blog.zeruns.com
void setup() 
{
    /* Khởi tạo serial để gỡ lỗi */
    Serial.begin(115200);
    Serial.println("Bắt đầu demo");
    wifiInit();
    Wire.begin(D5,D6);           // Khởi tạo thư viện Wire (IIC)
    unsigned char i=0;
    errorDecoder(mySHTC3.begin());
}


// Hàm loop chạy liên tục mãi mãi
void loop()
{
  delay(1000);                  // Trễ 1000 mili giây
  SHTC3_Status_TypeDef result = mySHTC3.update();
  if(mySHTC3.lastStatus == SHTC3_Status_Nominal)   // Kiểm tra trạng thái SHTC3 có bình thường không
  {
    RH = mySHTC3.toPercent();   // Đọc dữ liệu độ ẩm                  
    T = mySHTC3.toDegC();       // Đọc dữ liệu nhiệt độ
    RH_sum+=RH;
    T_sum+=T;
    count+=1;                
  }else{
    Serial.print("Cập nhật thất bại, lỗi: ");
    errorDecoder(mySHTC3.lastStatus); // In ra nguyên nhân lỗi
    Serial.println();
  }
  Serial.print("Độ ẩm:");  // In ra serial "Độ ẩm:"
  Serial.print(RH);           // In ra dữ liệu độ ẩm
  Serial.print("%");
  Serial.print("  Nhiệt độ:");
  Serial.print(T);            // In ra dữ liệu nhiệt độ
  Serial.println("°C"); 
  Serial.println("https://blog.zeruns.com");
  if (millis() - lastMs >= 30000)
  {
    lastMs = millis();
    mqttCheckConnect(); 

    /* Gửi dữ liệu */
    mqttIntervalPost();
    count=0;
    RH_sum=0;
    T_sum=0;
  }
  client.loop();
}

Sửa đổi PubSubClient.h

Tìm tệp PubSubClient.h, đổi số sau #define MQTT_MAX_PACKET_SIZE thành 1024, đổi số sau #define MQTT_KEEPALIVE thành 60

Hướng dẫn tạo password

Công cụ tạo password: http://iot-face.oss-cn-shanghai.aliyuncs.com/tools.htm

Giả sử thông tin ba yếu tố thiết bị của bạn như sau:

Ba yếu tố thiết bị
ProductKey = a14Xib5kdYd
DeviceName = ESP8266
DeviceSecret = oLyaKqVxtRvjH284LdhqVgVUx1UPy6zq

Thông số khi tạo kết nối MQTT, thông tin này là CLIENT_ID trong mã, bạn có thể tự đặt
clientId = ESP8266
timestamp = 1234567890
signmethod = hmacsha1

Sau đó tạo nội dung password dựa trên thông tin này:

clientIdESP8266deviceNameESP8266productKeya15ptdU1zhPtimestamp1234567890

Nhập nội dung rõ ràng, khóa bí mật nhập DeviceSecret, nhấn hmac-sha1 để tạo password

Giao diện kết quả

Bài viết nên đọc:

  • Khuyến nghị VPS/máy chủ đám mây giá rẻ và hiệu quả: https://blog.zeruns.com/archives/383.html
  • Thiết lập máy chủ xuyên tường nội mạng với giao diện web: https://blog.zeruns.com/archives/397.html
  • Tự xây dựng ổ đĩa đám mây bằng Cloudreve: https://blog.zeruns.com/archives/515.html
  • Cách xây dựng blog cá nhân: https://blog.zeruns.com/archives/218.html
  • Danh sách quyền lợi sinh viên: https://blog.zeruns.com/archives/321.html
2 Lượt thích