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

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

by cogito21_cpp 2024. 8. 1.
반응형

스마트 홈 시스템의 완성

스마트 홈 시스템 구축 프로젝트의 세 번째 단계에서는 추가적인 기능을 구현하고 시스템을 최적화하여 완성합니다. 이를 통해 보다 안정적이고 기능적인 스마트 홈 시스템을 구축합니다.

1. 추가적인 기능 구현

스마트 홈 시스템에 몇 가지 추가적인 기능을 구현해 보겠습니다. 예를 들어, 온도 임계값을 설정하여 특정 온도 이상일 때 자동으로 액추에이터를 작동시키는 기능을 추가할 수 있습니다.

 

예제: 자동 제어 기능 추가

다음 예제는 온도 임계값을 설정하여 특정 온도 이상일 때 자동으로 팬을 작동시키는 기능을 구현합니다.

#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 fanPin = 13; // 팬 제어 핀 (GPIO 13)

// 임계값 설정
float temperatureThreshold = 30.0;

ESP8266WebServer server(80); // 웹 서버 포트 설정

void setup() {
    Serial.begin(115200);
    setupWiFi();
    dht.begin();
    pinMode(fanPin, OUTPUT);

    // 웹 서버 핸들러 설정
    server.on("/", handleRoot);
    server.on("/setThreshold", handleSetThreshold);
    server.begin(); // 웹 서버 시작
    Serial.println("HTTP server started");
}

void loop() {
    server.handleClient(); // 클라이언트 요청 처리

    // 온도 읽기 및 팬 제어
    float temperature = dht.readTemperature();
    if (!isnan(temperature) && temperature > temperatureThreshold) {
        digitalWrite(fanPin, HIGH); // 팬 켜기
    } else {
        digitalWrite(fanPin, LOW); // 팬 끄기
    }
}

void handleRoot() {
    float temperature = dht.readTemperature();
    if (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>Temperature: " + String(temperature) + " *C</p>";
    html += "<p>Current Threshold: " + String(temperatureThreshold) + " *C</p>";
    html += "<form action=\"/setThreshold\" method=\"POST\">";
    html += "Set Temperature Threshold: <input type=\"text\" name=\"threshold\">";
    html += "<input type=\"submit\" value=\"Set\">";
    html += "</form>";
    html += "</body></html>";

    server.send(200, "text/html", html);
}

void handleSetThreshold() {
    if (server.hasArg("threshold")) {
        temperatureThreshold = server.arg("threshold").toFloat();
        server.sendHeader("Location", "/");
        server.send(303);
    } else {
        server.send(400, "text/plain", "Bad Request");
    }
}

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 주소 출력
}

 

위 코드에서는 웹 페이지에서 사용자가 온도 임계값을 설정할 수 있도록 하고, 설정된 임계값 이상일 때 팬을 자동으로 켜는 기능을 추가합니다.

 

2. 시스템 최적화

스마트 홈 시스템의 성능을 최적화하고 안정성을 높이기 위해 몇 가지 최적화 기법을 적용할 수 있습니다. 예를 들어, 주기적인 센서 데이터 수집과 웹 서버 요청 처리를 효율적으로 처리하는 방법을 고려해보겠습니다.

 

타이머를 사용한 주기적인 데이터 수집

다음 예제는 타이머를 사용하여 주기적으로 센서 데이터를 수집하고, 효율적으로 웹 서버 요청을 처리하는 방법을 보여줍니다.

#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 fanPin = 13; // 팬 제어 핀 (GPIO 13)

// 임계값 설정
float temperatureThreshold = 30.0;
float currentTemperature = 0.0;

ESP8266WebServer server(80); // 웹 서버 포트 설정

void setup() {
    Serial.begin(115200);
    setupWiFi();
    dht.begin();
    pinMode(fanPin, OUTPUT);

    // 웹 서버 핸들러 설정
    server.on("/", handleRoot);
    server.on("/setThreshold", handleSetThreshold);
    server.begin(); // 웹 서버 시작
    Serial.println("HTTP server started");

    // 타이머 설정 (1초마다 센서 데이터 수집)
    os_timer_setfn(&myTimer, timerCallback, NULL);
    os_timer_arm(&myTimer, 1000, true);
}

void loop() {
    server.handleClient(); // 클라이언트 요청 처리
}

// 타이머 콜백 함수
void timerCallback(void *pArg) {
    currentTemperature = dht.readTemperature();
    if (!isnan(currentTemperature) && currentTemperature > temperatureThreshold) {
        digitalWrite(fanPin, HIGH); // 팬 켜기
    } else {
        digitalWrite(fanPin, LOW); // 팬 끄기
    }
}

void handleRoot() {
    String html = "<html><body>";
    html += "<h1>Smart Home System</h1>";
    html += "<p>Temperature: " + String(currentTemperature) + " *C</p>";
    html += "<p>Current Threshold: " + String(temperatureThreshold) + " *C</p>";
    html += "<form action=\"/setThreshold\" method=\"POST\">";
    html += "Set Temperature Threshold: <input type=\"text\" name=\"threshold\">";
    html += "<input type=\"submit\" value=\"Set\">";
    html += "</form>";
    html += "</body></html>";

    server.send(200, "text/html", html);
}

void handleSetThreshold() {
    if (server.hasArg("threshold")) {
        temperatureThreshold = server.arg("threshold").toFloat();
        server.sendHeader("Location", "/");
        server.send(303);
    } else {
        server.send(400, "text/plain", "Bad Request");
    }
}

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 주소 출력
}

 

위 코드에서는 타이머를 사용하여 주기적으로 센서 데이터를 수집하고, 웹 서버 요청을 효율적으로 처리합니다.

 

마무리

오늘은 스마트 홈 시스템 구축 프로젝트의 세 번째 단계로, 추가적인 기능을 구현하고 시스템을 최적화하여 스마트 홈 시스템을 완성했습니다. 다음 단계에서는 프로젝트를 종합적으로 테스트하고, 최종적으로 배포하는 방법을 학습하겠습니다.

질문이나 추가적인 피드백이 있으면 언제든지 댓글로 남겨 주세요.

Day 25 예고

다음 날은 "실시간 운영 체제 (RTOS) 개요"에 대해 다룰 것입니다. RTOS의 기본 개념과 사용 방법을 학습하고, 이를 통해 멀티태스킹 시스템을 구현하는 방법을 살펴보겠습니다.

반응형