본문 바로가기
-----ETC-----/C++ 임베디드 시스템 프로그래밍 시리즈

[C++ 임베디드 시스템 프로그래밍 시리즈] Day 23: 프로젝트: 스마트 홈 시스템 구축 (2)

by cogito21_cpp 2024. 8. 1.
반응형

스마트 홈 시스템의 통합

스마트 홈 시스템 구축 프로젝트의 두 번째 단계에서는 다양한 센서와 액추에이터를 통합하고, 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)"에 대해 다룰 것입니다. 스마트 홈 시스템의 세 번째 단계로, 추가적인 기능을 구현하고, 시스템을 최적화하는 방법을 학습하겠습니다.

반응형