2025年3月23日 星期日

ESP32 智能家居控制系統:從零開始的完整指南

 

ESP32 智能家居控制系統:從零開始的完整指南

簡介

在這篇教學中,我將帶領您使用 ESP32 開發板,建立一個簡單的智能家居控制系統。本專案允許您透過 Wi-Fi 連接,使用手機或電腦來控制 LED 燈(或其他家電設備),並透過按鈕進行手動切換。這是一個適合初學者的專案,讓您可以學習如何使用 ESP32 控制網路設備。


1. 準備材料

在開始前,請準備以下元件:

  • ESP32 開發板
  • 4 個 LED(或繼電器模組,用於控制家電)
  • 4 個 220 歐姆電阻(保護 LED)
  • 4 個按鈕開關
  • 麵包板與杜邦線

如果要控制高壓設備,例如電燈或風扇,請使用 繼電器模組 來避免直接接觸高壓電源。


2. 電路連接

LED 與按鈕的連接

  1. LED 燈

    • LED 的 正極(長腳) 連接至 ESP32 的 GPIO(16、17、18、19)。
    • LED 的 負極(短腳) 透過 220 歐姆電阻 連接至 GND
  2. 按鈕開關

    • 一端連接至 GND
    • 另一端連接至 ESP32 的 GPIO(12、14、26、27)。

如果您改用 繼電器模組,請將繼電器的 信號輸入 連接至上述 LED 所使用的 GPIO。


3. 軟體設置

安裝 Arduino IDE 與函式庫

請確保您的 Arduino IDE 已支援 ESP32 開發環境,並安裝以下函式庫:

  • WiFi.h(ESP32 內建)
  • ESPAsyncWebServer(建立非同步網頁伺服器)
  • AsyncTCP(ESPAsyncWebServer 依賴函式庫)

您可以從 GitHub 下載 ESPAsyncWebServerAsyncTCP,並在 Arduino IDE 手動安裝 ZIP 函式庫


4. 程式碼實作

連接 Wi-Fi

#include <WiFi.h>
#include <ESPAsyncWebServer.h>

const char* ssid = "您的SSID";
const char* password = "您的密碼";
AsyncWebServer server(80);

定義 LED 與按鈕的 GPIO

const int ledPins[] = {16, 17, 18, 19};
const int buttonPins[] = {12, 14, 26, 27};
bool ledStates[] = {false, false, false, false};

設置 GPIO 與啟動伺服器

void setup() {
  Serial.begin(115200);

  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("正在連接 Wi-Fi...");
  }
  Serial.println("Wi-Fi 連接成功");
  Serial.println(WiFi.localIP());

  for (int i = 0; i < 4; i++) {
    pinMode(ledPins[i], OUTPUT);
    pinMode(buttonPins[i], INPUT_PULLUP);
  }

  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
    String html = "<html><body><h1>ESP32 智能家居</h1>";
    for (int i = 0; i < 4; i++) {
      html += "<p>LED " + String(i+1) + ": ";
      html += "<a href='/toggle?led=" + String(i) + "'>";
      html += (ledStates[i] ? "關閉" : "開啟") + String("</a></p>");
    }
    html += "<p><a href='/off'>關閉所有設備</a></p></body></html>";
    request->send(200, "text/html", html);
  });

  server.on("/toggle", HTTP_GET, [](AsyncWebServerRequest *request){
    if (request->hasParam("led")) {
      int led = request->getParam("led")->value().toInt();
      if (led >= 0 && led < 4) {
        ledStates[led] = !ledStates[led];
        digitalWrite(ledPins[led], ledStates[led] ? HIGH : LOW);
      }
    }
    request->redirect("/");
  });

  server.on("/off", HTTP_GET, [](AsyncWebServerRequest *request){
    for (int i = 0; i < 4; i++) {
      ledStates[i] = false;
      digitalWrite(ledPins[i], LOW);
    }
    request->redirect("/");
  });

  server.begin();
}

檢查按鈕輸入

void loop() {
  for (int i = 0; i < 4; i++) {
    if (digitalRead(buttonPins[i]) == LOW) {
      delay(50); // 消抖
      ledStates[i] = !ledStates[i];
      digitalWrite(ledPins[i], ledStates[i] ? HIGH : LOW);
      while (digitalRead(buttonPins[i]) == LOW); // 等待按鈕鬆開
    }
  }
}

5. 上傳與測試

  1. 連接 ESP32 至電腦,並在 Arduino IDE 中選擇 NodeMCU-32S
  2. 修改 ssidpassword 為您的 Wi-Fi 網路。
  3. 點擊 上傳 按鈕,將程式碼燒錄至 ESP32。
  4. 開啟 序列監視器(115200 波特率),找到 ESP32 IP 位址
  5. 在瀏覽器輸入 IP,您將看到控制介面。
  6. 點擊按鈕測試 LED 控制功能。
  7. 按下實體按鈕,檢查 LED 是否正確切換。

6. 結論

恭喜!您已成功建立一個 ESP32 智能家居控制系統,可透過 Wi-Fi 或實體按鈕 操控設備。此專案可進一步擴展,例如:

  • 使用繼電器模組 控制家電設備。
  • 加入溫溼度感測器 來自動調節環境。
  • 整合 MQTT,讓系統能透過雲端控制。

歡迎留言討論,讓我們一起打造更聰明的家!

沒有留言:

張貼留言

  探索 PEY 床:3D 列印新時代的革命性打印表面 什麼是 PEY 床? 在 3D 列印領域,打印床的選擇對於打印品質有著極大的影響。傳統上,許多使用者會選擇 PEI(聚醚酰亞胺,Polyetherimide)作為打印床,但現在,一種新的材料—— PEY (可能是一種改良...