|
|
@@ -13,7 +13,8 @@
|
|
|
// 功能:
|
|
|
// - 开机始终启动 BLE,支持灯效控制 + WiFi/MQTT 配置
|
|
|
// - MQTT 模式下同时连接 WiFi/MQTT
|
|
|
-// - 运行时长按 BOOT 按钮 3 秒 → 切换 BLE/MQTT 模式并重启
|
|
|
+// - 运行长按 BOOT 按钮 3 秒 → 切换 BLE/MQTT 模式并重启
|
|
|
+// - 连续短按 BOOT 按钮 3 下 → 恢复出厂设置并重启
|
|
|
//
|
|
|
// BLE 配置:
|
|
|
// Service: b8b7e001-7a6b-4f4f-9a8b-11c0ffee0001
|
|
|
@@ -34,8 +35,7 @@
|
|
|
// "mqtt_topic_config": "agent/status/config",
|
|
|
// "pin_red": 4,
|
|
|
// "pin_green": 3,
|
|
|
-// "pin_yellow": 2,
|
|
|
-// "factory_reset": true // 恢复出厂设置,清除所有配置并重启
|
|
|
+// "pin_yellow": 2
|
|
|
// }
|
|
|
//
|
|
|
// 接线方式(默认引脚,可通过配置修改):
|
|
|
@@ -75,6 +75,8 @@ const int GREEN_MAX = 220;
|
|
|
const unsigned long NORMAL_MODE_TIMEOUT_MS = 5UL * 60UL * 1000UL;
|
|
|
const unsigned long TRAFFIC_MODE_TIMEOUT_MS = 10UL * 60UL * 1000UL;
|
|
|
const unsigned long LONG_PRESS_MS = 3000;
|
|
|
+const unsigned long TRIPLE_PRESS_WINDOW_MS = 1500;
|
|
|
+const int TRIPLE_PRESS_COUNT = 3;
|
|
|
|
|
|
// =====================================================
|
|
|
// 全局状态
|
|
|
@@ -159,13 +161,6 @@ void saveConfigFromJson(const String& json) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- if (doc.containsKey("factory_reset") && doc["factory_reset"].as<bool>()) {
|
|
|
- Serial.println("Factory reset! Clearing all config...");
|
|
|
- preferences.clear();
|
|
|
- delay(500);
|
|
|
- ESP.restart();
|
|
|
- }
|
|
|
-
|
|
|
if (doc.containsKey("wifi_ssid"))
|
|
|
preferences.putString("wifi_ssid", doc["wifi_ssid"].as<String>());
|
|
|
if (doc.containsKey("wifi_pass"))
|
|
|
@@ -444,13 +439,31 @@ void breathingGreen(int times) {
|
|
|
unsigned long bootPressStart = 0;
|
|
|
bool bootWasPressed = false;
|
|
|
bool switchTriggered = false;
|
|
|
+unsigned long lastPressEnd = 0;
|
|
|
+int pressCount = 0;
|
|
|
+
|
|
|
+void factoryReset() {
|
|
|
+ Serial.println("Factory reset! Clearing all config...");
|
|
|
+ allOff();
|
|
|
+ for (int i = 0; i < 5; i++) {
|
|
|
+ setOnly(255, 0, 0); delay(200);
|
|
|
+ allOff(); delay(200);
|
|
|
+ }
|
|
|
+ preferences.clear();
|
|
|
+ Serial.println("NVS cleared. Restarting...");
|
|
|
+ delay(500);
|
|
|
+ ESP.restart();
|
|
|
+}
|
|
|
|
|
|
void checkBootButton() {
|
|
|
bool pressed = (digitalRead(BUTTON_PIN) == LOW);
|
|
|
+
|
|
|
if (pressed && !bootWasPressed) {
|
|
|
bootPressStart = millis();
|
|
|
bootWasPressed = true;
|
|
|
+ switchTriggered = false;
|
|
|
}
|
|
|
+
|
|
|
if (pressed && bootWasPressed && !switchTriggered) {
|
|
|
if (millis() - bootPressStart >= LONG_PRESS_MS) {
|
|
|
switchTriggered = true;
|
|
|
@@ -466,9 +479,22 @@ void checkBootButton() {
|
|
|
ESP.restart();
|
|
|
}
|
|
|
}
|
|
|
- if (!pressed) {
|
|
|
+
|
|
|
+ if (!pressed && bootWasPressed) {
|
|
|
bootWasPressed = false;
|
|
|
- switchTriggered = false;
|
|
|
+ unsigned long pressDuration = millis() - bootPressStart;
|
|
|
+ if (pressDuration < LONG_PRESS_MS) {
|
|
|
+ if (millis() - lastPressEnd > TRIPLE_PRESS_WINDOW_MS) {
|
|
|
+ pressCount = 0;
|
|
|
+ }
|
|
|
+ pressCount++;
|
|
|
+ lastPressEnd = millis();
|
|
|
+ Serial.printf("Short press %d/%d\n", pressCount, TRIPLE_PRESS_COUNT);
|
|
|
+ if (pressCount >= TRIPLE_PRESS_COUNT) {
|
|
|
+ pressCount = 0;
|
|
|
+ factoryReset();
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|