ESP8266를 알리바바 클라우드 IoT 플랫폼에 연결하여 온도 및 습도 데이터 업로드

소개

이 문서에서는 NodeMCU(ESP8266) 개발 보드와 SHTC3 온습도 센서를 사용하여 알리바바 클라우드 IoT 플랫폼에 연결하고, 측정된 온도 및 습도 데이터를 업로드합니다. 매초 온습도 데이터를 읽고, 매 30초마다 30초 동안의 평균 온습도 값을 업로드합니다. 다른 온습도 센서를 사용하려면 코드를 수정할 수 있습니다. 본 문서의 코드는 Arduino IDE로 개발되었습니다.

DHT11 및 DHT22 온습도 센서 데이터 읽기 코드: https://blog.zeruns.com/archives/527.html
ESP8266 개발 환경 설정 튜토리얼: https://blog.zeruns.com/archives/526.html

SHTC3의 SDA 핀은 NodeMCU의 D5 핀에, SCL 핀은 NodeMCU의 D6 핀에 연결합니다.

IoT 플랫폼 설정

먼저 알리바바 클라우드 계정을 등록하고 IoT 플랫폼을 활성화하세요: https://www.aliyun.com/product/iot?source=5176.11533457&userCode=jdjc69nf&type=copy

그 후 IoT 플랫폼 콘솔을 열어주세요: https://iot.console.aliyun.com/product

다음으로 아래 이미지에 따라 제품을 생성하세요.

이어서 아래 이미지에 따라 장치를 추가하세요.

소스 코드

다음 라이브러리를 먼저 설치해야 합니다: PubSubClient, ArduinoJson, SparkFun SHTC3.

그 후 아래 지침에 따라 PubSubClient.h 파일을 수정하세요.

코드 내의 지시사항에 따라 매개변수를 수정하세요.

#include <ESP8266WiFi.h>
/* PubSubClient 2.4.0 의존성 */
#include <PubSubClient.h>
/* ArduinoJson 5.13.4 의존성 */
#include <ArduinoJson.h>
#include <SparkFun_SHTC3.h>

/* Wi-Fi SSID 및 비밀번호를 입력하세요 */
#define WIFI_SSID         "라우터 SSID"
#define WIFI_PASSWD       "비밀번호"


/* 장치의 트리플렛 정보 */
#define PRODUCT_KEY       "장치 PRODUCT_KEY"
#define DEVICE_NAME       "DEVICE_NAME 교체"
#define DEVICE_SECRET     "DEVICE_SECRET 교체"
#define REGION_ID         "cn-shanghai"

/* 클라우드 환경 도메인 및 포트 번호(수정 불필요) */
#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|"
// 비밀번호 생성 도구: http://iot-face.oss-cn-shanghai.aliyuncs.com/tools.htm
// 비밀번호 생성 튜토리얼: https://www.yuque.com/cloud-dev/iot-tech/mebm5g
#define MQTT_PASSWD       "위 비밀번호 튜토리얼 및 도구를 사용해 생성하세요. 튜토리얼이 이해되지 않으면 문서 하단을 참조하세요"

#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);   // Wi-Fi 연결
    while (WiFi.status() != WL_CONNECTED)
    {
        delay(1000);
        Serial.println("WiFi not Connect");
    }
    Serial.println("Connected to AP");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());  
    Serial.print("espClient [");
    client.setServer(MQTT_SERVER, MQTT_PORT);   /* Wi-Fi 연결 후 MQTT 서버 연결 */
    client.setCallback(callback);
}


void mqttCheckConnect()
{
    while (!client.connected())
    {
        Serial.println("Connecting to MQTT Server ...");
        if (client.connect(CLIENT_ID, MQTT_USRNAME, MQTT_PASSWD))

        {

            Serial.println("MQTT Connected!");

        }
        else
        {
            Serial.print("MQTT Connect err:");
            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("publish Temperature success"); 
    }else{
      Serial.println("publish Temperature fail"); 
    }
    //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("publish Humidity success"); 
    }else{
      Serial.println("publish Humidity fail"); 
    }
}

void errorDecoder(SHTC3_Status_TypeDef message) // errorDecoder 함수는 SHTC3_Status_TypeDef 결과를 인간이 이해하기 쉬운 방식으로 출력합니다
{
  switch(message)
  {
    case SHTC3_Status_Nominal : Serial.print("Nominal"); break;
    case SHTC3_Status_Error : Serial.print("Error"); break;
    case SHTC3_Status_CRC_Fail : Serial.print("CRC Fail"); break;
    default : Serial.print("Unknown return code"); break;
  }
}
//https://blog.zeruns.com
void setup() 
{
    /* 디버깅을 위한 시리얼 초기화 */
    Serial.begin(115200);
    Serial.println("Demo Start");
    wifiInit();
    Wire.begin(D5,D6);           // Wire(IIC) 라이브러리 초기화
    unsigned char i=0;
    errorDecoder(mySHTC3.begin());
}


// loop 함수는 무한히 반복됩니다
void loop()
{
  delay(1000);                  // 1000ms 지연
  SHTC3_Status_TypeDef result = mySHTC3.update();
  if(mySHTC3.lastStatus == SHTC3_Status_Nominal)   // SHTC3 상태가 정상인지 확인
  {
    RH = mySHTC3.toPercent();   // 습도 데이터 읽기                  
    T = mySHTC3.toDegC();       // 온도 데이터 읽기
    RH_sum+=RH;
    T_sum+=T;
    count+=1;               
  }else{
    Serial.print("Update failed, error: ");
    errorDecoder(mySHTC3.lastStatus); // 오류 원인 출력
    Serial.println();
  }
  Serial.print("Humidity:");  // 시리얼에 Humidity: 출력
  Serial.print(RH);           // 습도 데이터 출력
  Serial.print("%");
  Serial.print("  Temperature:");
  Serial.print(T);            // 온도 데이터 출력
  Serial.println("C"); 
  Serial.println("https://blog.zeruns.com");
  if (millis() - lastMs >= 30000)
  {
    lastMs = millis();
    mqttCheckConnect(); 

    /* 데이터 업로드 */
    mqttIntervalPost();
    count=0;
    RH_sum=0;
    T_sum=0;
  }
  client.loop();
}

PubSubClient.h 수정

PubSubClient.h 파일을 찾아, #define MQTT_MAX_PACKET_SIZE 뒤의 숫자를 1024로, #define MQTT_KEEPALIVE 뒤의 숫자를 60으로 변경하세요.

비밀번호 생성 튜토리얼

비밀번호 생성 도구: http://iot-face.oss-cn-shanghai.aliyuncs.com/tools.htm

장치 트리플렛 정보가 다음과 같다고 가정합니다.

장치 트리플렛
ProductKey = a14Xib5kdYd
DeviceName = ESP8266
DeviceSecret = oLyaKqVxtRvjH284LdhqVgVUx1UPy6zq

MQTT 연결 시 사용할 매개변수 (CLIENT_ID로 코드에 설정 가능)
clientId = ESP8266
timestamp = 1234567890
signmethod = hmacsha1

이 정보를 바탕으로 password의 content를 생성합니다.

clientIdESP8266deviceNameESP8266productKeya15ptdU1zhPtimestamp1234567890

평문으로 content를 입력하고, 키로 DeviceSecret을 입력한 후, hmac-sha1을 클릭하면 비밀번호가 생성됩니다.

실행 결과

추천 읽기:

  • 고가성비 및 저렴한 VPS/클라우드 서버 추천: https://blog.zeruns.com/archives/383.html
  • 내부 네트워크 터널링 서버 구축 (웹 대시보드 포함): https://blog.zeruns.com/archives/397.html
  • Cloudreve를 사용한 개인 클라우드 스토리지 구축: https://blog.zeruns.com/archives/515.html
  • 개인 블로그 구축 방법: https://blog.zeruns.com/archives/218.html
  • 학생 할인 혜택 전체: https://blog.zeruns.com/archives/321.html
2개의 좋아요