#include <WiFi.h>
#include <PubSubClient.h>
// --------------------請修改以下參數--------------------
// WiFi 帳號密碼
char SSID[] = "YourSSID"; // WiFi 帳號
char PASSWORD[] = "YourPassword"; // WiFi 密碼
// PIR 感測器接腳
int PIR_PIN = 32; // PIR 感測器接腳
int lastPirState = LOW; // 上一個 PIR 狀態
unsigned long lastPublishTime = 0; // 上次推播時間
int publishInterval = 5000; // 限制推播頻率(5秒)
// MQTT 設定
char* MQTTServer = "mqttgo.io";
char* MQTTUser = "";
char* MQTTPassword = "";
int MQTTPort = 1883;
// 推播主題
char* MQTTPubTopic = "yourTopic/class000/pir"; // 推播PIR訊息
// -----------------------------------------------------
WiFiClient WifiClient;
PubSubClient MQTTClient(WifiClient);
// WiFi 連線
void WiFiConnect(){
Serial.print("Connecting Wifi: ");
Serial.println(SSID);
WiFi.begin("Wokwi-GUEST", "", 6); // Wokwi 模擬器
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.println("\nWiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
// MQTT 連線
void MQTTConnect(){
MQTTClient.setServer(MQTTServer, MQTTPort);
while (!MQTTClient.connected()) {
String clientId = "esp32-" + String(random(1000000, 9999999));
if (MQTTClient.connect(clientId.c_str(), MQTTUser, MQTTPassword)) {
Serial.println("MQTT 已連線");
} else {
Serial.print("MQTT 連線失敗, 狀態碼=");
Serial.println(MQTTClient.state());
delay(5000);
}
}
}
void setup() {
Serial.begin(115200);
pinMode(PIR_PIN, INPUT);
WiFiConnect();
MQTTConnect();
}
void loop() {
// 檢查連線狀態
if (WiFi.status() != WL_CONNECTED) WiFiConnect();
if (!MQTTClient.connected()) MQTTConnect();
MQTTClient.loop();
int pirState = digitalRead(PIR_PIN);
// 只有當狀態改變,且經過一段時間後才推播
if (pirState != lastPirState && millis() - lastPublishTime > publishInterval) {
lastPublishTime = millis();
if (pirState == HIGH) {
Serial.println("有人靠近");
MQTTClient.publish(MQTTPubTopic, "detected");
} else {
Serial.println("無人");
MQTTClient.publish(MQTTPubTopic, "none");
}
lastPirState = pirState;
}
delay(50);
}