Home Arduino [아두이노] MQTT 통신 방법

[아두이노] MQTT 통신 방법

by DUBUKIMCH

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);

  • ssidpassword: 연결할 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 브로커로 전송합니다.

동작 원리

  1. Wi-Fi 연결: setup_wifi() 함수를 통해 지정된 SSID와 비밀번호로 Wi-Fi에 연결합니다.
  2. MQTT 연결: client.setServer(mqtt_server, 1883);를 통해 설정된 라즈베리 파이의 MQTT 브로커와 연결하고, 연결이 끊어질 경우 reconnect() 함수가 자동으로 재연결을 시도합니다.
  3. 온습도 데이터 수집: DHT22 센서를 통해 주기적으로 온도와 습도를 읽어옵니다.
  4. MQTT 메시지 전송: 수집된 온도와 습도 데이터를 문자열로 변환하여 각각 home/temperaturehome/humidity 주제로 MQTT 브로커에 전송합니다.
  5. 결과 출력: 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/temperaturehome/humidity 주제로 발행된 온습도 데이터를 구독할 수 있습니다.

라즈베리파이 관련 링크: https://dubukimch.com/라즈베리-파이-mqtt-연결-방법/

You may also like

Leave a Comment

error: Content is protected !!