#include <WiFi.h>
#include <WiFiClient.h>
#include <WebServer.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "WiFiManager.h"
#include "AsyncTCP.h"
#include "ESPAsyncWebServer.h"
#include "RTClib.h"
RTC_DS3231 rtc; // 宣告 RTC 物件
AsyncWebServer server(80);
const int ledPin = 2; // 定義 LED 所連接的 GPIO 引腳
LiquidCrystal_I2C lcd(0x27, 16, 2); // I2C LCD 的地址和尺寸
void setup() {
pinMode(ledPin, OUTPUT);
Wire.begin();
lcd.init(); // 初始化 LCD
lcd.backlight(); // 開啟背光
// 初始化 WiFiManager,用於設定 Wi-Fi
WiFiManager wifiManager;
wifiManager.autoConnect("ESP32AP", "password");
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
request->send(200, "text/html", "<h1>ESP32 LED Control</h1><a href=\"/on\">開啟 LED</a><br><a href=\"/off\">關閉 LED</a>");
});
server.on("/on", HTTP_GET, [](AsyncWebServerRequest *request){
digitalWrite(ledPin, HIGH);
request->send(200, "text/plain", "LED 開啟");
});
server.on("/off", HTTP_GET, [](AsyncWebServerRequest *request){
digitalWrite(ledPin, LOW);
request->send(200, "text/plain", "LED 關閉");
});
server.begin();
}
void loop() {
// 獲取當前時間
DateTime now = rtc.now();
// 更新 LCD 顯示當前時間和 LED 狀態
lcd.setCursor(0, 0);
lcd.print("Time: ");
lcd.print(now.hour());
lcd.print(":");
if (now.minute() < 10) {
lcd.print("0");
}
lcd.print(now.minute());
lcd.setCursor(0, 1);
lcd.print("LED: ");
if (digitalRead(ledPin) == HIGH) {
lcd.print("ON ");
} else {
lcd.print("OFF");
}
// 如果當前時間在特定時間範圍內,開啟 LED
if ((now.hour() == 10 && now.minute() == 0) || (now.hour() == 15 && now.minute() == 30)) {
digitalWrite(ledPin, HIGH);
} else {
digitalWrite(ledPin, LOW);
}
delay(1000); // 避免過度使用 CPU 資源
}