#include <WiFi.h>
#include <HTTPClient.h>
#define BUZZER_PIN 12
#define PIR_PIN 5
const char* ssid = "Wokwi-GUEST";//Wi-Fi 名稱
const char* password = "";//Wi-Fi 密碼
const char* LINE_NOTIFY_TOKEN = "icGNilpvvau1yIoZLMzzboYuRE9m8yi8S1chT3r4beV";
//發行權杖
//LINE Notify API
void setup() {
pinMode(BUZZER_PIN, OUTPUT); // 設定蜂鳴器引腳為輸出模式
pinMode(PIR_PIN, INPUT); // 設定PIR感應器引腳為輸入模式
Serial.begin(115200); // 初始化串口通信,波特率為115200
Serial.println("~~~ ESP32 PIR 和 Buzzer 示例 ~~~"); // 列印提示信息
WiFi.begin(ssid, password); // 嘗試連接WiFi網絡
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("連接到 WiFi 中..."); // 如果未成功連接,列印連接提示信息
}
Serial.println("已連接到 WiFi"); // 成功連接後,列印提示信息
}
void loop() {
int motionDetected = digitalRead(PIR_PIN); // 讀取PIR感應器的狀態(高電平或低電平)
if (motionDetected == HIGH) { // 如果檢測到運動
Serial.println("!!!警告有東西經過!!!"); // 列印警告信息到串口
sendLineNotification("!有人經過!"); // 發送Line通知
buzzerOnOff(); // 控制蜂鳴器響
}
}
void buzzerOnOff() {
for (int i = 0; i < 14; i++) { // 循環執行14次,每次產生一個音
if (i % 2 == 0) {
tone(BUZZER_PIN, 300); // 偶數次循環產生低音
} else {
tone(BUZZER_PIN, 1800); // 奇數次循環產生高音
}
delay(500); // 持續響鈴0.5秒
noTone(BUZZER_PIN); // 停止聲音
delay(10); // 靜音0.01秒,以便有明顯的間隔
}
}
void sendLineNotification(String message) {
HTTPClient http;
String url = "https://notify-api.line.me/api/notify"; // Line通知的API地址
String payload = "message=" + message; // 構建POST請求的消息體
http.begin(url); // 開始HTTP請求
http.addHeader("Content-Type", "application/x-www-form-urlencoded"); // 添加請求頭,指定消息體格式
http.addHeader("Authorization", "Bearer " + String(LINE_NOTIFY_TOKEN)); // 添加請求頭,提供Line Notify的授權Token
int httpCode = http.POST(payload); // 發送POST請求並獲取HTTP響應碼
if (httpCode > 0) {
Serial.printf("[HTTP] POST... code: %d\n", httpCode); // 列印HTTP響應碼
String response = http.getString(); // 獲取HTTP響應體
Serial.println(response); // 列印HTTP響應體
} else {
Serial.printf("[HTTP] POST... 失敗,錯誤: %s\n", http.errorToString(httpCode).c_str()); // 列印HTTP請求失敗信息
}
http.end(); // 結束HTTP請求
}