Arduino IDE를 사용하여 ESP8266NodeMCU를 개발하고 DHT11을 연결하여 온도 및 습도 감지를 실현하고 onenet 공식 웹사이트에 업로드

머리말:

        이 블로그는 arduino IDE를 사용하여 ESP8266NodeMCU를 개발하고 DHT11로 온도 및 습도 감지를 실현하고 onenet 공식 웹 사이트의 새 버전을 업로드합니다.조금 불편합니다.오픈 소스 정신으로 이 블로그는 이 분야에 대한 정보 부족.

초기 준비 작업:

하드웨어:

        1、ESP8266NodeMCU

         2. DHT11 센서

         3. USB to micoUSB 케이블, 여러 Dupont 케이블

새 버전의 Onenet에서 장치 만들기

        1. 먼저 onenet 계정을 등록해야 하며 여기에는 구체적인 단계를 작성하지 않겠습니다.

        2. 등록 후 화살표를 클릭하여 개발자 센터로 들어갑니다.

         3. 비용 센터를 계속 클릭합니다.

         4. 새로운 인터페이스가 나타납니다.

        5. 왼쪽 화살표가 가리키는 부분에 마우스를 올리면 아래와 같은 인터페이스가 펼쳐집니다. 

        6. 다중 프로토콜 액세스 선택

         7. 제품을 추가하려면 클릭하십시오.

         8. 화살표와 상자 프롬프트에 따라 필요한 정보를 작성합니다. 네트워킹 방법이 wifi이고 액세스 프로토콜이 MQTT(구 버전)임을 확인하는 한 간단하게 작성할 수 있습니다.

         9. 장치를 즉시 추가하려면 클릭하십시오.

        10. 장치 추가를 클릭합니다.

         11. 새로운 인터페이스가 나타납니다.

         12. 여기에 아무렇게나 쓸 수도 있는데 필요한 옵션을 쓴 후 추가를 클릭합니다.

         13. 추가가 완료되면 새 인터페이스를 볼 수 있습니다.이 인터페이스에서 처음에는 장치가 오프라인 상태이며 이는 정상적인 현상입니다.또한 장치 ID를 기록해야 하며 다음에 따라 후속 조치를 취해야 합니다. 장치 ID 자신의 코드를 수정하십시오.

         14. 전반적인 장비 상황을 보려면 이 세부 정보를 클릭합니다.

        15. 새 인터페이스에 들어간 후 Add APIkey를 클릭합니다.

         16. 이 APIKey는 직접 설정할 수 있습니다. 여기에 아무렇게나 작성하겠습니다. 이 공식 웹사이트에서 해당 APIKey 코드를 생성합니다. 16개가 충분하면 여기에 아무렇게나 작성합니다.

         17. 제출을 클릭하면 새로운 APIKey가 생성되는데 이 또한 기억해야 하고 이후의 코드 작성도 기억해야 합니다.

         19. 제품 개요를 클릭하여 제품 ID를 확인하고 이를 기록해 둡니다. 후속 코드 작성에도 사용할 것이기 때문입니다.

         지금까지 onenet 장치가 구성되었으며 다음 단계는 arduino IDE에 ESP8266 장치를 추가하는 것입니다.

ArduinoIDE 추가 ESP8266

        처음에 ESP8266을 편집하기 위해 arduino IDE를 사용하기로 선택한 경우 편집기에서 몇 가지 작업을 수행해야 합니다.

        1. 메뉴바에서 파일 -> 기본 설정을 열고 아래 URL을 지정된 위치에 복사합니다.

http://arduino.esp8266.com/stable/package_esp8266com_index.json

      

         2. 그런 다음 도구를 열고 개발 보드의 위치에 마우스를 올리면 개발 보드 관리가 나타납니다. 나타나지 않으면 Arduino 버전이 다른 것입니다. 이것에는 문제가 없습니다. 그림에 표시

         3. 개발 보드 관리를 클릭하면 다음과 같은 인터페이스가 나타납니다.화살표가 가리키는 영역에서 ESP8266을 검색한 다음 다운로드할 적합한 버전을 찾습니다.

         4. 다운로드를 시작합니다.

         5. 이 프로세스는 오류가 발생하기 쉬우므로 실수해도 상관 없습니다. 오류가 보고되면 여러 번 다운로드하십시오. 네트워크가 원활한지 확인하십시오. 그렇지 않으면 다운로드에 실패합니다.

        6. 다운로드가 완료되면 개발 보드 위치에서 다운로드한 개발 보드를 찾기 위해 IDE를 다시 시작해야 합니다. 여기에서 마우스로 가리키고 있는 개발 보드를 선택해야 합니다. ESP8266NodeMCU에 해당하는 개발 보드 NodeMCU 1.0 이므로 여기서 잘못된 것을 선택하면 안 됩니다. 그렇지 않으면 실수하기 쉽습니다.

 CP2102 드라이버 설치

       처음에 ESP8266NodeMCU를 컴퓨터에 연결하면 직렬 포트를 인식할 방법이 없습니다. 즉, 굽기 코드를 처음에 구울 수 없습니다. ESP8266NodeMCU를 연결하면 컴퓨터의 장치 관리자에 다음 인터페이스가 나타납니다.

        이전에 CP2102 드라이버를 설치했습니다. 처음에는 잘못 읽었고 ESP8266NodeMCU 온보드가 CH340 드라이버인 줄 알았습니다. 자세히 살펴보니 그렇지 않습니다. CP2102 드라이버도 설치해야 합니다. 여기서도 찾았습니다. . 적합한 드라이버, Baidu 네트워크 디스크에 넣었습니다. CP2102 드라이버    추출 코드는 brqt입니다.

        다운로드 후 컴퓨터 유형에 따라 해당 드라이버를 선택합니다. 64비트의 경우 X64를 선택하고 32비트의 경우 X86을 선택합니다.

         실행하려면 두 번 클릭하십시오. 다음을 클릭하면 간단하게 설치할 수 있습니다.

         설치 후 직렬 포트가 인식되는 것을 확인할 수 있습니다.

       지금까지 준비 작업이 완료되었습니다.

하드웨어 핀 연결

        

DHT11 핀 ESP8266NODEMCU 핀
GND GND
VCC 3v3
데이터 D6

코드 부분:

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
#include <Ticker.h>
#include <dht11.h>

#define WIFI_DEBUG 0          //1:使用一键配网,其它值则使用默认无线账号密码
#define DHT11PIN 12           //设置DHT引脚为Pin 12
#define ONENET_DISCONNECTED 1 //已经断开
#define ONENET_CONNECTED 2    //已经连接上
#define ONENET_RECONNECT 3    //重连成功
#define VER  "ESP8266_MQTT_V1.0"  //版本号

const char* ssid = "********";//你的wifi账号
const char* password = "********";//wifi密码


/*OneNet*/
PubSubClient mqttClient;
const char* mqttServer = "183.230.40.39";//mqtt服务器
const uint16_t mqttPort = 6002;       //端口号
#define onenet_productId   "******" //产品ID
#define onenet_deviceId    "**********" //设备ID
#define onenet_apiKey      "******************" //API_KEY

int state;
Ticker delayTimer;
WiFiClient espClient;
dht11 DHT11;

/* 延时N秒 */
void delayNs(uint8_t m){
  for(uint8_t index = 0;index<m;index ++){
    delay(1000);
    ESP.wdtFeed();
  }
}


/* 延时重启 */
void delayRestart(float t) {
  Serial.print("Restart after ");
  Serial.print(t);
  Serial.println("s");
  delayTimer.attach(t, []() {
    Serial.println("\r\nRestart now!");
    ESP.restart();
  });
}

/* 自动连接 */
bool autoConfig()
{
  WiFi.begin();
  for (int i = 0; i < 20; i++)
  {
    if (WiFi.status() == WL_CONNECTED)
    {
      Serial.println("AutoConfig Success");
      Serial.printf("SSID:%s\r\n", WiFi.SSID().c_str());
      Serial.printf("PSW:%s\r\n", WiFi.psk().c_str());
      WiFi.printDiag(Serial);
      return true;
    }
    else
    {
      Serial.print("AutoConfig Waiting......");
      Serial.println(WiFi.status());
      delay(1000);
    }
  }
  Serial.println("AutoConfig Faild!" );
  return false;
}

/* 一键配网 */
void smartConfig()
{
  WiFi.mode(WIFI_STA);
  Serial.println("\r\nWait for Smartconfig");
  WiFi.beginSmartConfig();
  while (1)
  {
    Serial.print(".");
    digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
    if (WiFi.smartConfigDone())
    {
      Serial.println("SmartConfig Success");
      Serial.printf("SSID:%s\r\n", WiFi.SSID().c_str());
      Serial.printf("PSW:%s\r\n", WiFi.psk().c_str());
      WiFi.setAutoConnect(true);  // 设置自动连接
      break;
    }
    delay(1000); // 这个地方一定要加延时,否则极易崩溃重启
  }
}

/* 连接OneNet */
int connectToOneNetMqtt(){
    int cnt = 0;
    while(!mqttClient.connected()){
       ESP.wdtFeed();
       cnt++;
       Serial.println("Connect to OneNet MQTT...");
       
       if (mqttClient.connect(onenet_deviceId,onenet_productId,onenet_apiKey)) {
             Serial.println("connect success!");
             return ONENET_RECONNECT;
        } else {
             Serial.print("connect fail!");
             Serial.println(" try again in 5 seconds");
             delayNs(5);
        }
        if(cnt >=10){
          //只做10次连接到OneNet,连接不上重启8266
          cnt = 0;
          delayRestart(1);
        }
    }
    return ONENET_CONNECTED;
}

/* 云端下发 */
void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();

  if ((char)payload[0] == '1') {
    digitalWrite(LED_BUILTIN, LOW);
  } else {
    digitalWrite(LED_BUILTIN, HIGH);
  }
}

/* 发布温度信息 */
void Temp_pubMQTTmsg(uint32_t data){
   long lastMsg = 0;

   char msg[50];
   char tmp[28];
   char d[3];
   snprintf(tmp,sizeof(tmp),"{\"Temp\":%d}",data);
   uint16_t streamLen= strlen(tmp);

   d[0]='\x03';
   d[1] = (streamLen >> 8);
   d[2] = (streamLen & 0xFF);
   snprintf(msg,sizeof(msg),"%c%c%c%s",d[0],d[1],d[2],tmp);
   mqttClient.publish("$dp", (uint8_t*)msg,streamLen+3,false);
}
/* 发布湿度信息 */
void Humi_pubMQTTmsg(uint32_t data){
   long lastMsg = 0;

   char msg[50];
   char tmp[28];
   char d[3];
   snprintf(tmp,sizeof(tmp),"{\"Humi\":%d}",data);
   uint16_t streamLen= strlen(tmp);

   d[0]='\x03';
   d[1] = (streamLen >> 8);
   d[2] = (streamLen & 0xFF);
   snprintf(msg,sizeof(msg),"%c%c%c%s",d[0],d[1],d[2],tmp);
   mqttClient.publish("$dp", (uint8_t*)msg,streamLen+3,false);
}

/* 初始化系统 */
void initSystem(){
    int cnt = 0;
    Serial.begin (115200);
    Serial.println("\r\n\r\nStart ESP8266 MQTT");
    Serial.print("Firmware Version:");
    Serial.println(VER);
    Serial.print("SDK Version:");
    pinMode(LED_BUILTIN, OUTPUT);
    digitalWrite(LED_BUILTIN, HIGH);
    Serial.println(ESP.getSdkVersion());
 
    ESP.wdtEnable(5000);
   
    if(WIFI_DEBUG==1)//开启一键配网模式
    {
       if (!autoConfig())
      {
        Serial.println("Start smartConfig");
        smartConfig();
      }
    }
    else
    {
        WiFi.begin(ssid, password);
        while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        cnt++;
        Serial.print(".");
        if(cnt>=40){
          cnt = 0;
          //重启系统
          delayRestart(1);
        }
        }
    }
    Serial.print("WIFI Connect \r\n");
}

/* 初始化ONENET通信 */
void initOneNetMqtt(){
    mqttClient.setServer(mqttServer,mqttPort);
    mqttClient.setClient(espClient);
    mqttClient.setCallback(callback);
}

/* 初始化 */
void setup() {
  initSystem();
  initOneNetMqtt();
}

/* 主函数 */
void loop() {
  ESP.wdtFeed();
  DHT11.read(DHT11PIN);
  state = connectToOneNetMqtt();
  Serial.println(WiFi.status());
  if(state == ONENET_RECONNECT){
     mqttClient.loop();
  }
  else if(state == ONENET_CONNECTED){
     printf("temp:%d \r\n",DHT11.temperature);
     printf("humi:%d \r\n",DHT11.humidity);
     Temp_pubMQTTmsg(DHT11.temperature);
     Humi_pubMQTTmsg(DHT11.humidity);
     mqttClient.loop();
  }
  delay(2000);
}

         여기서 수정해야 할 것은 제품 ID, 기기 ID, APIkey, 내가 기록하라고 알려준 휴대 전화 핫스팟 및 비밀번호입니다.

        물론 컴파일을 한다면 개발 보드를 ESP8266NodeMCU로 먼저 선택해야 합니다. 그래도 신고

        그리고 이러한 라이브러리는 공식 웹 사이트에서 찾을 수 있으며 이러한 라이브러리가 없는 경우 수행할 작업도 정리하겠습니다.

해당 라이브러리가 없는 경우 수행할 작업

        1. 아래 URL을 브라우저에 복사

https://www.arduino.cc/reference/en/libraries/

        2. 다음 인터페이스를 입력하십시오

         3. 화살표가 가리키는 누락된 라이브러리를 검색합니다.

         4. 여기서는 PubSubClient.h를 예로 들어 검색 후 첫 번째 항목을 클릭합니다.

         5. 다음 인터페이스로 이동합니다. 여기에서 최신 버전을 선택하면 클릭 후 자동으로 다운로드됩니다.

         6. Arduino IDE에 들어가서 프로젝트 -> 라이브러리 로드 -> .zip 라이브러리 추가를 클릭합니다. 방금 다운로드한 파일 경로를 선택하고 파일을 지정하여 직접 설치하면 IDE 명령 창에서 설치 성공 프롬프트를 볼 수 있습니다.

         7. 다른 라이브러리도 마찬가지입니다.

컴파일하기:

        컴파일하고 나면 에러가 아니라 이렇게 됩니다.

        굽기 전에 장치 관리자에서 방금 본 직렬 포트를 선택한 다음 도구 -> 포트 -> CP2102에 해당하는 직렬 포트를 선택한 다음 굽기를 시작할 수 있습니다.

        굽기 작업이 수행되면 아래 그림과 같은 효과가 나타나며 OK임을 나타냅니다.

         이때 시리얼 포트 보기 부분이 코드에 추가되어 시리얼 포트 모니터에서 현재 온도와 습도를 볼 수 있습니다. 직렬 모니터를 열어 효과를 볼 수 있습니다.

         onenet 공식 웹 사이트에 들어가 효과를 볼 수도 있습니다.

 

추천

출처blog.csdn.net/weixin_51651698/article/details/131262456