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 프로토콜로 브로커와 통신하기 위해 사용합니다.
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)
- 초음파 센서의 Trig와 Echo 핀을 각각 어디에 연결했는지 설정합니다.
const char* mqtt_server = "test.mosquitto.org"; // MQTT 브로커 서버 주소
const int mqttPort = 1883; // MQTT 기본 포트 (1883)
-
test.mosquitto.org
는 공개 MQTT 테스트 서버입니다. - 실제 환경에서는 내부 서버 IP나 클라우드 MQTT 서비스를 쓸 수도 있습니다.
WiFiClient espClient;
PubSubClient client(espClient);
-
espClient
: Wi-Fi를 통한 기본 TCP/IP 클라이언트 -
client
: 이 Wi-Fi 클라이언트를 기반으로 MQTT 클라이언트 객체를 생성합니다.
long lastMsgTime = 0;
- 마지막으로 메시지를 보낸 시간을 저장합니다.
- 1초 간격으로 초음파 데이터를 Publish하기 위해 사용합니다.
초기 설정입니다.
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); // 약간의 대기
}
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 주소를 출력합니다.
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 서버와 연결이 끊어졌을 때 자동으로 재연결합니다.
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합니다.
초음파 센서를 이용해 거리를 측정하는 함수입니다.
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)
- Wi-Fi 연결
- MQTT 브로커 연결
- 초음파 센서 거리 측정
- 거리 데이터를 MQTT 서버로 Publish
- 연결 끊기면 자동 재연결
- 1초마다 반복
부분 | 설명 |
---|---|
dtostrf() |
float 값을 문자(char 배열)로 변환해주는 함수 |
pulseIn() |
핀의 HIGH 또는 LOW 신호가 유지된 시간을 측정 |
client.loop() |
MQTT 서버와 통신을 유지하고 수신 메시지를 처리 |
random() |
고유한 MQTT 클라이언트 ID를 만들 때 사용 |
ESP32가 초음파 거리 센서를 통해 측정한 값을
MQTT 토픽(user1/esp32/ultra)에 1초마다 보내는 프로그램입니다.
이걸 활용하면:
- 다른 장치나 서버가 거리를 구독해서 모니터링할 수 있어!
- IoT 플랫폼 연동 (AWS IoT, ThingsBoard, Node-RED 등)도 가능해!