9주차_참고 : 실습2 코드설명 - dhryu60/SmartDevice_2025-1 GitHub Wiki


📜 전체 코드 상세 설명


🔹 라이브러리 포함

#include <WiFi.h>          // Wi-Fi 연결용 라이브러리
#include <PubSubClient.h>  // MQTT 통신용 라이브러리
  • WiFi.h: ESP32를 Wi-Fi 네트워크에 연결하기 위해 필요합니다.
  • PubSubClient.h: MQTT 프로토콜로 브로커와 통신하기 위해 사용합니다.

🔹 Wi-Fi 및 MQTT 서버 정보 설정

const char* ssid = "Your_SSID";          // 연결할 Wi-Fi SSID (이름)
const char* password = "Your_Password";  // Wi-Fi 비밀번호
  • 여러분이 연결할 무선 인터넷 정보를 여기에 입력해야 합니다.
const int trigPin = 12;  // 초음파 센서 트리거 핀 (ESP32의 D12)
const int echoPin = 14;  // 초음파 센서 에코 핀 (ESP32의 D14)
  • 초음파 센서의 TrigEcho 핀을 각각 어디에 연결했는지 설정합니다.
const char* mqtt_server = "test.mosquitto.org"; // MQTT 브로커 서버 주소
const int mqttPort = 1883; // MQTT 기본 포트 (1883)
  • test.mosquitto.org는 공개 MQTT 테스트 서버입니다.
  • 실제 환경에서는 내부 서버 IP클라우드 MQTT 서비스를 쓸 수도 있습니다.

🔹 Wi-Fi 및 MQTT 클라이언트 객체 생성

WiFiClient espClient;
PubSubClient client(espClient);
  • espClient: Wi-Fi를 통한 기본 TCP/IP 클라이언트
  • client: 이 Wi-Fi 클라이언트를 기반으로 MQTT 클라이언트 객체를 생성합니다.

🔹 시간 관리 변수

long lastMsgTime = 0;
  • 마지막으로 메시지를 보낸 시간을 저장합니다.
  • 1초 간격으로 초음파 데이터를 Publish하기 위해 사용합니다.

🛠 setup() 함수

초기 설정입니다.

void setup() {
  Serial.begin(115200);         // 시리얼 통신 시작
  setup_wifi();                 // Wi-Fi 연결 시도
  client.setServer(mqtt_server, mqttPort); // MQTT 브로커 정보 설정

  pinMode(echoPin, INPUT);       // 에코 핀 입력 설정
  pinMode(trigPin, OUTPUT);      // 트리거 핀 출력 설정
  digitalWrite(trigPin, LOW);    // 트리거 핀 초기화 (LOW)
  delayMicroseconds(2);          // 약간의 대기
}

🌐 setup_wifi() 함수

Wi-Fi 연결을 담당합니다.

void setup_wifi() {
  delay(10);
  Serial.println();
  Serial.print("연결 중인 Wi-Fi: ");
  Serial.println(ssid);

  WiFi.begin(ssid, password); // Wi-Fi 연결 시작

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);               // 0.5초마다 상태 확인
    Serial.print(".");         // 연결 진행 표시
  }

  Serial.println("");
  Serial.println("Wi-Fi 연결됨");
  Serial.print("IP 주소: ");
  Serial.println(WiFi.localIP()); // 할당된 IP 주소 출력
}
  • Wi-Fi에 연결될 때까지 기다리고, 연결되면 IP 주소를 출력합니다.

🔌 reconnect() 함수

MQTT 브로커와 재연결을 시도하는 함수입니다.

void reconnect() {
  while (!client.connected()) {        // MQTT 연결이 안 되어 있으면
    Serial.print("MQTT 연결 시도 중...");
    String clientId = "ESP32Client-";   // 클라이언트 ID를 랜덤 생성
    clientId += String(random(0xffff), HEX);

    if (client.connect(clientId.c_str())) {  // 연결 시도
      Serial.println("연결됨");
    } else {
      Serial.print("실패, rc=");
      Serial.print(client.state());     // 실패 상태 코드 출력
      Serial.println(" 5초 후 다시 시도");
      delay(5000);                      // 5초 후 재시도
    }
  }
}
  • MQTT 서버와 연결이 끊어졌을 때 자동으로 재연결합니다.

🔄 loop() 함수

ESP32가 계속 반복 실행하는 메인 코드입니다.

void loop() {
  if (!client.connected()) {  // MQTT 연결이 끊어졌으면
    reconnect();              // 재연결
  }
  client.loop();              // 클라이언트 통신 유지 (수신 등 처리)

  long now = millis();        // 현재 시간(밀리초) 읽기
  if (now - lastMsgTime > 1000) {  // 1초 경과했으면
    lastMsgTime = now;
    
    float sensorValue = readUltrasonicSensor();  // 초음파 센서 읽기
    char sensorString[8];                        // 문자열 버퍼
    dtostrf(sensorValue, 1, 2, sensorString);     // float 값을 문자열로 변환 (소수점 2자리)
    
    client.publish("user1/esp32/ultra", sensorString); // "user1/esp32/ultra" 토픽으로 Publish
  }
}
  • 1초 간격으로 초음파 거리를 측정해서 MQTT 브로커로 Publish합니다.

📏 readUltrasonicSensor() 함수

초음파 센서를 이용해 거리를 측정하는 함수입니다.

float readUltrasonicSensor() {
  digitalWrite(trigPin, HIGH);  // 트리거 핀 HIGH
  delayMicroseconds(10);        // 10μs 동안 유지
  digitalWrite(trigPin, LOW);   // 트리거 핀 LOW로 끄기

  pinMode(echoPin, INPUT);      // 에코 핀 입력모드
  float duration = pulseIn(echoPin, HIGH);  // echo 핀 HIGH 지속시간 측정

  float distance = duration * 0.0343 / 2.0;  // 거리(cm) 계산
  return distance;
}
  • 0.0343 cm/μs: 초음파 속도(공기 중) 기준
  • 시간 × 속도 / 2 = 거리(cm)

📈 전체 흐름 요약

  1. Wi-Fi 연결
  2. MQTT 브로커 연결
  3. 초음파 센서 거리 측정
  4. 거리 데이터를 MQTT 서버로 Publish
  5. 연결 끊기면 자동 재연결
  6. 1초마다 반복

✨ 추가 Tip

부분 설명
dtostrf() float 값을 문자(char 배열)로 변환해주는 함수
pulseIn() 핀의 HIGH 또는 LOW 신호가 유지된 시간을 측정
client.loop() MQTT 서버와 통신을 유지하고 수신 메시지를 처리
random() 고유한 MQTT 클라이언트 ID를 만들 때 사용

🚀 요약

ESP32가 초음파 거리 센서를 통해 측정한 값을
MQTT 토픽(user1/esp32/ultra)에 1초마다 보내는 프로그램입니다.

이걸 활용하면:

  • 다른 장치나 서버가 거리를 구독해서 모니터링할 수 있어!
  • IoT 플랫폼 연동 (AWS IoT, ThingsBoard, Node-RED 등)도 가능해!

⚠️ **GitHub.com Fallback** ⚠️