스마트 홈 시스템의 통합
스마트 홈 시스템 구축 프로젝트의 두 번째 단계에서는 다양한 센서와 액추에이터를 통합하고, Wi-Fi를 통해 데이터를 송수신하는 방법을 학습합니다. 이를 통해 스마트 홈 시스템의 실제 동작을 구현합니다.
1. 시스템 통합
센서와 액추에이터를 통합하여 데이터를 수집하고 제어하는 코드를 작성합니다. 이 코드는 센서 데이터를 읽고, 특정 조건에 따라 액추에이터를 제어합니다.
예제: 센서 데이터 수집 및 액추에이터 제어
다음 예제는 온도, 습도, 조도 데이터를 수집하고, 특정 조건에 따라 LED와 릴레이를 제어하는 방법을 보여줍니다.
#include <ESP8266WiFi.h>
#include <DHT.h>
// Wi-Fi 설정
const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";
// DHT 설정
#define DHTPIN 2 // DHT22 데이터 핀 (GPIO 2)
#define DHTTYPE DHT22 // DHT22 센서 타입
DHT dht(DHTPIN, DHTTYPE);
// 핀 설정
const int ledPin = 12; // LED 핀 (GPIO 12)
const int relayPin = 13; // 릴레이 핀 (GPIO 13)
void setup() {
Serial.begin(115200);
setupWiFi();
dht.begin();
pinMode(ledPin, OUTPUT);
pinMode(relayPin, OUTPUT);
}
void loop() {
// 센서 데이터 읽기
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
int ldrValue = analogRead(A0);
if (isnan(humidity) || isnan(temperature)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
Serial.print("Humidity: ");
Serial.print(humidity);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.println(" *C");
Serial.print("LDR Value: ");
Serial.println(ldrValue);
// 조건에 따른 액추에이터 제어
if (temperature > 30) {
digitalWrite(ledPin, HIGH); // LED 켜기
} else {
digitalWrite(ledPin, LOW); // LED 끄기
}
if (ldrValue < 300) {
digitalWrite(relayPin, HIGH); // 릴레이 켜기
} else {
digitalWrite(relayPin, LOW); // 릴레이 끄기
}
delay(2000); // 2초 대기
}
void setupWiFi() {
delay(10);
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP()); // IP 주소 출력
}
위 코드에서는 Wi-Fi 네트워크에 연결한 후, DHT22 온습도 센서와 LDR 조도 센서로부터 데이터를 읽고, 조건에 따라 LED와 릴레이를 제어합니다.
2. 데이터 송수신
Wi-Fi를 통해 데이터를 송수신하기 위해 웹 서버를 구현합니다. 이를 통해 센서 데이터를 실시간으로 모니터링하고, 원격으로 액추에이터를 제어할 수 있습니다.
예제: 웹 서버를 사용한 데이터 송수신
다음 예제는 ESP8266을 사용하여 웹 서버를 구현하고, 센서 데이터를 웹 페이지에 표시하는 방법을 보여줍니다.
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <DHT.h>
// Wi-Fi 설정
const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";
// DHT 설정
#define DHTPIN 2 // DHT22 데이터 핀 (GPIO 2)
#define DHTTYPE DHT22 // DHT22 센서 타입
DHT dht(DHTPIN, DHTTYPE);
// 핀 설정
const int ledPin = 12; // LED 핀 (GPIO 12)
const int relayPin = 13; // 릴레이 핀 (GPIO 13)
ESP8266WebServer server(80); // 웹 서버 포트 설정
void setup() {
Serial.begin(115200);
setupWiFi();
dht.begin();
pinMode(ledPin, OUTPUT);
pinMode(relayPin, OUTPUT);
// 웹 서버 핸들러 설정
server.on("/", handleRoot);
server.on("/toggleLED", handleToggleLED);
server.on("/toggleRelay", handleToggleRelay);
server.begin(); // 웹 서버 시작
Serial.println("HTTP server started");
}
void loop() {
server.handleClient(); // 클라이언트 요청 처리
}
void handleRoot() {
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
int ldrValue = analogRead(A0);
if (isnan(humidity) || isnan(temperature)) {
server.send(500, "text/plain", "Failed to read from DHT sensor!");
return;
}
String html = "<html><body>";
html += "<h1>Smart Home System</h1>";
html += "<p>Humidity: " + String(humidity) + " %</p>";
html += "<p>Temperature: " + String(temperature) + " *C</p>";
html += "<p>LDR Value: " + String(ldrValue) + "</p>";
html += "<p><a href=\"/toggleLED\">Toggle LED</a></p>";
html += "<p><a href=\"/toggleRelay\">Toggle Relay</a></p>";
html += "</body></html>";
server.send(200, "text/html", html);
}
void handleToggleLED() {
static bool ledState = false;
ledState = !ledState;
digitalWrite(ledPin, ledState ? HIGH : LOW);
server.sendHeader("Location", "/");
server.send(303);
}
void handleToggleRelay() {
static bool relayState = false;
relayState = !relayState;
digitalWrite(relayPin, relayState ? HIGH : LOW);
server.sendHeader("Location", "/");
server.send(303);
}
void setupWiFi() {
delay(10);
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP()); // IP 주소 출력
}
위 코드에서는 ESP8266을 사용하여 웹 서버를 구현하고, 센서 데이터를 웹 페이지에 표시합니다. 또한, 웹 페이지에서 LED와 릴레이를 원격으로 제어할 수 있습니다.
마무리
오늘은 스마트 홈 시스템 구축 프로젝트의 두 번째 단계로, 다양한 센서와 액추에이터를 통합하여 제어하고, 데이터를 Wi-Fi를 통해 송수신하는 방법을 학습했습니다. 다음 단계에서는 프로젝트를 완성하기 위해 추가적인 기능을 구현하겠습니다.
질문이나 추가적인 피드백이 있으면 언제든지 댓글로 남겨 주세요.
Day 24 예고
다음 날은 "프로젝트: 스마트 홈 시스템 구축 (3)"에 대해 다룰 것입니다. 스마트 홈 시스템의 세 번째 단계로, 추가적인 기능을 구현하고, 시스템을 최적화하는 방법을 학습하겠습니다.
'-----ETC----- > C++ 임베디드 시스템 프로그래밍 시리즈' 카테고리의 다른 글
[C++ 임베디드 시스템 프로그래밍 시리즈] Day 25: 실시간 운영 체제 (RTOS) 개요 (0) | 2024.08.01 |
---|---|
[C++ 임베디드 시스템 프로그래밍 시리즈] Day 26: FreeRTOS를 이용한 멀티태스킹 (0) | 2024.08.01 |
[C++ 임베디드 시스템 프로그래밍 시리즈] Day 24: 프로젝트: 스마트 홈 시스템 구축 (3) (0) | 2024.08.01 |
[C++ 임베디드 시스템 프로그래밍] Day 21: MQTT 프로토콜 (0) | 2024.08.01 |
[C++ 임베디드 시스템 프로그래밍] Day 22: 프로젝트: 스마트 홈 시스템 구축 (1) (0) | 2024.08.01 |