MQTT 서버에 ESP32-DHT11 온도 및 습도 데이터 업로드

소개

ESP32


여기에 이미지 설명을 삽입하세요.

이미지를 클릭하시면 구매하실 수 있습니다

ESP32 시리즈 모듈은 Wi-Fi, 기존 Bluetooth 및 저전력 Bluetooth 기능을 통합하고 광범위한 용도를 가지고 있습니다. Wi-Fi는 광범위한 통신 연결을 지원하고 라우터를 통해 인터넷에 직접 연결을 지원하는 반면 Bluetooth는 사용자가 허용합니다. Bluetooth LE Beacon은 신호 감지를 용이하게 하며 IoT 프로젝트를 빠르게 구축할 수 있습니다.
이 실험에서는 Wi-Fi 네트워킹을 통해 센서 데이터를 MQTT 서버에 업로드하는 ESP32-WROOM-32 개발 보드를 사용했습니다.

DHT11


여기에 이미지 설명을 삽입하세요.

이미지를 클릭하시면 구매하실 수 있습니다

DHT11 디지털 온도 및 습도 센서는 교정된 디지털 신호 출력을 갖춘 온도 및 습도 복합 센서입니다. 센서는 저항성 습도 감지 요소와 NTC 온도 측정 요소를 사용하고 단선 직렬 인터페이스를 통해 마이크로 컨트롤러에 연결되어 다음과 같이 개발되었습니다. 안정성 달성 신뢰할 수 있는 온도 및 습도 측정

실험

MQTT는 사물 인터넷을 위한 가볍고 유연한 메시지 교환 및 데이터 전송 프로토콜입니다. 이 실험의 목적은 ESP32를 통해 DHT11을 구동하고 DHT11의 온도 및 습도 데이터를 MQTT 서버에 업로드하여 원격 모니터링을 달성하는 것입니다.

실험 지침

실험에는 MQTT 서버가 필요합니다. 직접 구축하거나 실험용으로만 구입하는 것은 낭비입니다. 온라인에서 무료 개방형 MQTT 서버를 찾을 수 있으므로 실험에 충분합니다. 이 실험에서는 EMQ X Cloud의 무료 MQTT 서버를 사용합니다. 따라서 컴퓨터에 MQTT X 소프트웨어를 설치하고 DHT11 및 ESP32 개발 보드를 준비해야 합니다.

배선

ESP32 DHT11
5V V
접지 G
GPIO5

MQTT 서버

연결을 설정하다

먼저 컴퓨터에 MQTT 서버를 연결합니다. 먼저 MQTT X 포털을 다운로드하여 설치 합니다. 설치 후 소프트웨어 메인 페이지에서 "+" 더하기 기호를 열고 클릭합니다.
여기에 이미지 설명을 삽입하세요.
여기에 이미지 설명을 삽입하세요.
위 그림에 따라 구성할 수 있습니다.

  1. 원하는 영어 이름을 입력할 수 있습니다.
  2. 클라이언트 ID는 기본적으로 무시됩니다.
  3. 서버 주소:broker.emqx.io
  4. 항구: 1883
  5. 사용자 이름: emqx
  6. 비밀번호: 공개
  7. 그림과 같이 다른 매개변수를 구성하고
    구성을 작성한 후 연결을 클릭하십시오.

구독 추가

여기에 이미지 설명을 삽입하세요.
여기에 이미지 설명을 삽입하세요.
TEST/DHT11 테마로 구독을 추가하고 내용을 입력한 후 확인을 클릭하세요.
여기에 이미지 설명을 삽입하세요.

인터페이스가 위와 같이 표시된 후 구독이 추가되었으며 위의 구독 주제를 직접 변경할 수 있습니다.
이 시점에서 MQTT X가 구성되고 "나중에 사용하기 위해 따로 보관"됩니다.

ESP32는 DHT11을 구동합니다.

이 글의 주된 목적은 DHT11 데이터를 MQTT 서버에 업로드하는 것이기 때문에 DHT11 드라이버에 대해서는 자세히 설명하지 않고 대신 "DHT Sensor Library For ESPx" 라이브러리를 직접 호출하여 단일 주문을 생성하여 학습하도록 하겠습니다. 이 도서관. 먼저 ESP32를 구현하여 DHT11을 구동하고 직렬 포트에서 온도와 습도를 인쇄합니다.
다음은 "DHT Sensor Library For ESPx" 라이브러리를 호출하여 작성한 드라이버 코드입니다.

#include <Arduino.h>
#include "DHTesp.h" 

/** Initialize DHT sensor 1 */
DHTesp dht;

int dhtPin = 5;

/** Data from sensor 1 */
TempAndHumidity dhtData;

void setup() {
    
    
	Serial.begin(115200);
  
	// Initialize temperature sensor 1
	dht.setup(dhtPin, DHTesp::DHT11);

}

void loop() {
    
    
  dhtData = dht.getTempAndHumidity();  // Read values from sensor 1
	Serial.println("Temp: " + String(dhtData.temperature,2) + "'C Humidity: " + String(dhtData.humidity,1) + "%");
  delay(1000);

} 

출력 결과
여기에 이미지 설명을 삽입하세요.

ESP32는 MQTT 서버에 데이터를 보냅니다.

이 실험에서는 ESP32와 MQTT 서버 간의 통신에 "PubSubClient"와 "WiFi" 두 라이브러리가 사용됩니다.
코드에 정의된 wifi 및 MQTT 매개변수의 경우 코드 이식을 위해서는 자체 WIFI 매개변수 및 MQTT 매개변수를 수정해야 합니다.

const char *ssid="xxxxxxxx";	//WIFI名称
const char *password="xxxxxxxx";	//WIFI密码

const char *mqtt_broker = "xxxxxxxx";     //MQTT地址
const char *topic = "xxxxxxxx";               //MQTT主题
const char *mqtt_username = "xxxxxxxx";             //MQTT用户名
const char *mqtt_password = "xxxxxxxx";           //MQTT用户密码
const int mqtt_port = xxxxxxxx;                     //MQTT端口

위에 정의된 Wi-Fi 이름과 비밀번호를 사용하여 다음 WIFI 초기화 문을 사용하여 ESP32를 WIFI에 연결합니다.

 WiFi.begin(ssid,password);

"PubSubClient" 라이브러리의 setServer 및 connect 함수는 MQTT 서버 주소, 포트 번호 및 사용자 계정을 입력하여 MQTT 서버에 연결합니다.

client.setServer(mqtt_broker,mqtt_port);  //MQTT地址,端口号
client.connect(client_id.c_str(),mqtt_username,mqtt_password);

주제 구독

client.subscribe(topic);  //订阅topic这个主题

그런 다음 게시 기능을 통해 MQTT 서버가 응답한 주제에 데이터를 보냅니다.

client.publish(topic,"I AM ESP32"); 

MQTT 서버의 "TEST/DHT11" 주제로

연결이 성공하고 "I AM ESP32"가 MQTT 서버의 "TEST/DHT11" 주제에 업로드됩니다.

#include <WiFi.h>
#include <PubSubClient.h>

//WIFI 参数配置
const char *ssid="JS-TEST";
const char *password="YXDZ@2022";

//MQTT 参数配置
const char *mqtt_broker = "broker.emqx.io";     //MQTT地址
const char *topic = "TEST/DHT11";               //MQTT主题
const char *mqtt_username = "emqx";             //MQTT用户名
const char *mqtt_password = "public";           //MQTT用户密码
const int mqtt_port = 1883;                     //MQTT端口

WiFiClient espClient; //创建WIFI对象
PubSubClient client(espClient);


void setup() {
    
    
  // put your setup code here, to run once:
  //初始化串口
  Serial.begin(115200);
  //初始化wifi,连接wifi
  WiFi.begin(ssid,password);
  //检测是否连上wifi,如果没连上一直循环,连上了往下运行
  while(WiFi.status()!=WL_CONNECTED)
  {
    
    
    delay(500);
    Serial.println("Connecting to WIFI ...");
    }
    Serial.println("Connecting to WIFI network");
    //连接到MQTT服务器
    client.setServer(mqtt_broker,mqtt_port);  //MQTT地址,端口号
    //进入循环开始连接MQTT服务器,连上了就退出循环,没连上就一直循环连接
    while(!client.connected())//判断是否连上MQTT服务器
    {
    
    
      //client_id赋值加上设备mac
      String client_id = "esp32-client-";
      client_id +=String(WiFi.macAddress());
      Serial.printf("the client %s connects to public mqtt broker\n",client_id.c_str());
      if(client.connect(client_id.c_str(),mqtt_username,mqtt_password))  //连接MQTT服务器
      {
    
    
        Serial.println("Public emqx mqtt broker connected");    //连接成功,打印信息
        }
        else
        {
    
    
          Serial.print("failed with state");//连接失败
          Serial.print(client.state()); //重新连接
          delay(2000);
          }
      }

  client.publish(topic,"I AM ESP32"); //发送信息到MQTT服务器
  client.subscribe(topic);  //订阅topic这个主题
}


void loop() {
    
    
  // put your main code here, to run repeatedly:
  client.loop();
}

MQTT 수신 상황 여기에 이미지 설명을 삽입하세요.
"TEST/DHT11" 주제는 "I AM ESP32"를 수신했으며 직렬 포트는 "Public emqx mqtt Broker Connected"를 반환하여 MQTT 서버에 대한 연결이 성공했음을 나타냅니다.
다음으로 DHT11의 온도 및 습도 데이터를 "TEST/DHT11" 주제에 업로드합니다.

온도 및 습도 데이터 업로드

위 내용은 DHT11을 구동하기 위한 EPS32용 프로그램을 완성하고, MQTT 서버로 데이터를 전송하기 위한 ESP32용 프로그램도 완성한 것입니다.DHT11 데이터를 MQTT 서버에 업로드하는 것은 두 프로그램을 통합하는 것과 같습니다.
무료로 개발된 MQTT 서버이므로 데이터 업로드 빈도에 주의가 필요하며, 서버에 데이터를 자주 업로드하는 경우 비활성화될 수 있습니다. 그래서 데이터는 10초마다 여기에 업로드됩니다.
통합코드

#include <Arduino.h>
#include "DHTesp.h"
#include <WiFi.h>
#include <PubSubClient.h>

DHTesp dht11;
int dhtPin = 5;
TempAndHumidity sensorData;

//WIFI 参数配置
const char *ssid="JS-TEST";
const char *password="YXDZ@2022";

//MQTT 参数配置
const char *mqtt_broker = "broker.emqx.io";     //MQTT地址
const char *topic = "TEST/DHT11";               //MQTT主题
const char *mqtt_username = "emqx";             //MQTT用户名
const char *mqtt_password = "public";           //MQTT用户密码
const int mqtt_port = 1883;                     //MQTT端口


WiFiClient espClient; //创建WIFI对象
PubSubClient client(espClient);



void setup() {
    
    
  // put your setup code here, to run once:
  //初始化串口
  Serial.begin(115200);
  //初始化DHT11
  dht11.setup(dhtPin, DHTesp::DHT11);
  //初始化wifi,连接wifi
  WiFi.begin(ssid,password);
  //检测是否连上wifi,如果没连上一直循环,连上了往下运行
  while(WiFi.status()!=WL_CONNECTED)
  {
    
    
    delay(500);
    Serial.println("Connecting to WIFI ...");
    }
    Serial.println("Connecting to WIFI network");
    //连接到MQTT服务器
    client.setServer(mqtt_broker,mqtt_port);  //MQTT地址,端口号
    client.setCallback(callback);   //连接回传信息
    //进入循环开始连接MQTT服务器,连上了就退出循环,没连上就一直循环连接
    while(!client.connected())//判断是否连上MQTT服务器
    {
    
    
      //client_id赋值加上设备mac
      String client_id = "esp32-client-";
      client_id +=String(WiFi.macAddress());
      Serial.printf("the client %s connects to public mqtt broker\n",client_id.c_str());
      if(client.connect(client_id.c_str(),mqtt_username,mqtt_password))  //连接MQTT服务器
      {
    
    
        Serial.println("Public emqx mqtt broker connected");    //连接成功,打印信息
        }
        else
        {
    
    
          Serial.print("failed with state");//连接失败
          Serial.print(client.state()); //重新连接
          delay(2000);
          }
      }

  client.publish(topic,"ESP32_HDT11"); //发送信息到MQTT服务器
  client.subscribe(topic);  //订阅topic这个主题
}


void callback(char *topic, byte *payload, unsigned int length)
{
    
    
  Serial.print("Message arrived in topic:");
  Serial.println(topic);  //打印主题名称
  Serial.print("message:");zhuyi
  //打印MQTT返回的信息
  for(int i=0;i<length;i++)
  {
    
    
    Serial.print((char)payload[i]);
    }
  Serial.println();
  Serial.println("--------------------");
  
  
  }


void loop() {
    
    
  // put your main code here, to run repeatedly:
 // client.loop();
 
  sensorData = dht11.getTempAndHumidity();
  Serial.println("Temp: " + String(sensorData.temperature,2) + "'C Humidity: " + String(sensorData.humidity,1) + "%");
  client.publish(topic,(("Temp: " + String(sensorData.temperature,2) + "'C Humidity: " + String(sensorData.humidity,1) + "%").c_str())); //发送信息到MQTT服务器
  delay(10000);

}

실험 결과

여기에 이미지 설명을 삽입하세요.
위 그림에서 Arduino IDE의 직렬 포트가 열린 후 데이터가 "TEST/DHT11" 주제로 동기적으로 전송되는 것을 볼 수 있습니다. 실험이 완료되었습니다.

추천

출처blog.csdn.net/qq_42250136/article/details/134381293