210

ESP32와 DHT22 센서를 이용해 라즈베리 파이 MQTT 브로커로 온도와 습도 데이터를 전송하는 예제입니다. ESP32는 Wi-Fi에 연결된 후 MQTT를 통해 라즈베리 파이와 통신하며, DHT22 센서로부터 온습도 데이터를 읽어 MQTT 브로커로 전송합니다.
주요 라이브러리
- DHT.h: DHT22 온습도 센서를 제어하기 위한 라이브러리.
- WiFiS3.h: ESP32의 Wi-Fi 기능을 사용하기 위한 라이브러리.
- PubSubClient.h: MQTT 통신을 위한 라이브러리로, MQTT 브로커와 연결해 메시지를 주고받을 수 있게 합니다.
코드 설명
센서 및 Wi-Fi 설정
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
DHTPIN
: DHT 센서가 연결된 핀 번호(2번 핀).DHTTYPE
: 사용된 DHT 센서의 유형(DHT22).DHT dht(DHTPIN, DHTTYPE);
: 지정된 핀과 유형으로 DHT 센서 객체를 생성합니다.
Wi-Fi 및 MQTT 설정
char ssid[] = "WiFi SSID";
char password[] = "WiFi password";
const char* mqtt_server = "Raspberry Pi IP";
WiFiClient espClient;
PubSubClient client(espClient);
ssid
및password
: 연결할 Wi-Fi 네트워크의 SSID와 비밀번호.mqtt_server
: 라즈베리 파이의 IP 주소로, MQTT 브로커가 설치된 라즈베리 파이 IP 주소를 입력합니다.WiFiClient espClient
: Wi-Fi 클라이언트 객체 생성.PubSubClient client(espClient);
: MQTT 클라이언트를 Wi-Fi 클라이언트와 연결하여 생성.
setup()
함수
void setup() {
Serial.begin(9600);
dht.begin();
setup_wifi();
client.setServer(mqtt_server, 1883);
}
Serial.begin(9600);
: 시리얼 통신을 시작합니다.dht.begin();
: DHT 센서를 초기화합니다.setup_wifi();
: Wi-Fi에 연결합니다.client.setServer(mqtt_server, 1883);
: MQTT 브로커의 IP 주소와 포트를 설정합니다. MQTT 기본 포트는1883
입니다.
Wi-Fi 연결 함수
void setup_wifi() {
delay(10);
Serial.println("Connecting to WiFi...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.println("Try Connecting!");
}
Serial.println("WiFi connected");
}
WiFi.begin(ssid, password);
: Wi-Fi에 연결을 시도합니다.- 연결이 성공할 때까지
WiFi.status()
를 확인하여 상태가WL_CONNECTED
가 될 때까지 대기합니다. - 연결되면
"WiFi connected"
메시지를 Serial Monitor에 출력합니다.
MQTT 재연결 함수
void reconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
if (client.connect("ArduinoClient")) {
Serial.println("connected");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
delay(5000);
}
}
}
client.connected()
: MQTT 브로커와의 연결 상태를 확인합니다.- 연결이 끊어져 있으면
client.connect("ArduinoClient")
를 통해 재연결을 시도합니다. - 연결 성공 시
"connected"
메시지를 출력하고, 실패 시 오류 코드와 함께 재연결을 5초 후에 다시 시도합니다.
loop()
함수
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
char tempString[32];
char humString[32];
snprintf(tempString, sizeof(tempString), "온도: %.2f", t);
snprintf(humString, sizeof(humString), "습도: %.2f", h);
client.publish("home/temperature", tempString);
client.publish("home/humidity", humString);
delay(1000);
}
-
- MQTT 연결 확인:
if (!client.connected())
: MQTT 연결 상태를 확인하고, 끊어져 있으면reconnect()
함수를 호출해 재연결합니다.client.loop()
: MQTT 통신을 유지하고 관리하는 함수입니다.
- 온습도 측정:
dht.readHumidity()
,dht.readTemperature()
: DHT 센서에서 습도와 온도 값을 읽어옵니다.- 값이 유효하지 않으면
isnan()
함수를 사용해 읽기에 실패했음을 출력하고 함수 실행을 종료합니다.
- 메시지 포맷:
snprintf(tempString, sizeof(tempString), "온도: %.2f", t);
: 온도를 문자열로 변환하여tempString
에 저장합니다.snprintf(humString, sizeof(humString), "습도: %.2f", h);
: 습도를 문자열로 변환하여humString
에 저장합니다.
- 메시지 전송:
client.publish("home/temperature", tempString);
:home/temperature
주제로 온도 데이터를 전송합니다.client.publish("home/humidity", humString);
:home/humidity
주제로 습도 데이터를 전송합니다.
- 딜레이:
delay(1000);
: 1초 동안 대기한 후 데이터를 다시 읽어 MQTT 브로커로 전송합니다.
- MQTT 연결 확인:
동작 원리
- Wi-Fi 연결:
setup_wifi()
함수를 통해 지정된 SSID와 비밀번호로 Wi-Fi에 연결합니다. - MQTT 연결:
client.setServer(mqtt_server, 1883);
를 통해 설정된 라즈베리 파이의 MQTT 브로커와 연결하고, 연결이 끊어질 경우reconnect()
함수가 자동으로 재연결을 시도합니다. - 온습도 데이터 수집: DHT22 센서를 통해 주기적으로 온도와 습도를 읽어옵니다.
- MQTT 메시지 전송: 수집된 온도와 습도 데이터를 문자열로 변환하여 각각
home/temperature
와home/humidity
주제로 MQTT 브로커에 전송합니다. - 결과 출력: Serial Monitor에서 연결 상태와 오류 메시지, 전송된 온습도 데이터를 확인할 수 있습니다.
#include <DHT.h> // DHT.h
#include <WiFiS3.h> // WiFiS3.h
#include <PubSubClient.h> //PubSubClient.h
// DHT Sensor Setup
#define DHTPIN 2 // Pin connected to DHT sensor
#define DHTTYPE DHT22 // DHT11 or DHT22 sensor
DHT dht(DHTPIN, DHTTYPE); // Create a DHT object
// WiFi and MQTT Setup
char ssid[] = "WiFi SSID"; // Replace with your WiFi SSID
char password[] = "WiFi password"; // Replace with your WiFi password
const char* mqtt_server = "Raspberry Pi IP"; // Replace with Raspberry Pi IP
WiFiClient espClient;
PubSubClient client(espClient);
void setup() {
Serial.begin(9600);
dht.begin(); // Initialize the DHT sensor
setup_wifi();
client.setServer(mqtt_server, 1883); // Connect to MQTT broker
}
void setup_wifi() {
delay(10);
Serial.println("Connecting to WiFi...");
WiFi.begin(ssid, password); // No error, ssid is now char[]
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.println("Try Connecting!");
}
Serial.println("WiFi connected");
}
void reconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
if (client.connect("ArduinoClient")) {
Serial.println("connected");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
delay(5000);
}
}
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
float h = dht.readHumidity(); // Read humidity from DHT sensor
float t = dht.readTemperature(); // Read temperature from DHT sensor
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
char tempString[32];
char humString[32];
// Format the messages with descriptive text
snprintf(tempString, sizeof(tempString), "온도: %.2f", t);
snprintf(humString, sizeof(humString), "습도: %.2f", h);
// Publish the formatted messages
client.publish("home/temperature", tempString);
client.publish("home/humidity", humString);
delay(1000);
}

이 코드가 정상적으로 동작하면 라즈베리 파이의 MQTT 브로커에서 home/temperature
와 home/humidity
주제로 발행된 온습도 데이터를 구독할 수 있습니다.
라즈베리파이 관련 링크: https://dubukimch.com/라즈베리-파이-mqtt-연결-방법/