esp32_c6.ino 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. #include "WiFiConfig.h"
  2. #include "MQTTHandler.h"
  3. #include "LEDHandler.h" // 引入 LEDHandler
  4. #include "WatchdogHandler.h" // 引入 WatchdogHandler
  5. #define BUTTON_PIN 4 // 重置引脚4 //高低电平3 //代开发信号5
  6. #define WIFI_CONNECT_TIMEOUT 30000
  7. #define BUTTON_HOLD_TIME 1000
  8. #define DEBOUNCE_DELAY 50
  9. // LED 连接的 GPIO
  10. #define LED_PIN 5 // GPIO 5
  11. // 数据量统计
  12. unsigned long lastCheckTime = 0; // 上次检查时间
  13. long unsigned int lastDebounceTimeNew = 0;
  14. int lastButtonStateNew = HIGH;
  15. bool resetModeActivated = false;
  16. int lastGPIO18State = LOW; // 保存上一次 GPIO18 的电平状态
  17. void setup() {
  18. Serial.begin(115200);
  19. delay(1000); // 等待串口初始化完成
  20. pinMode(BUTTON_PIN, INPUT_PULLUP);
  21. pinMode(GPIO3_PIN, INPUT); // 设置 GPIO18 为输入模式
  22. pinMode(LED_PIN, OUTPUT); // 设置 LED 引脚为输出模式
  23. // 初始化 LED
  24. setupLED(); // 确保调用 setupLED() 来初始化 LED
  25. // 设置 LED 亮度为 20%
  26. setFixedBrightness(5); // 20% 亮度
  27. // 初始化看门狗
  28. setupWatchdog();
  29. // 加载服务器参数
  30. loadServerParams();
  31. // 循环连接 WiFi 和进入配置模式
  32. while (true) {
  33. // 尝试连接 WiFi,超时时间为 30 秒
  34. if (connectWiFiWithTimeout(30000)) {
  35. break; // 连接成功,退出循环
  36. } else {
  37. Serial.println("[信息] Wi-Fi 连接失败,进入配置模式...");
  38. setupWiFiConfig(); // 进入配置模式,超时时间为 60 秒
  39. }
  40. }
  41. // 初始化 MQTT 客户端
  42. mqttSetup();
  43. // 尝试连接到 MQTT 服务器
  44. if (!connectMQTT()) {
  45. Serial.println("[错误] MQTT 连接失败");
  46. }
  47. Serial.println("[信息] 已永久存储 targetDeviceID: " + targetDeviceID);
  48. }
  49. void loop() {
  50. static unsigned long lastCheckTime = 0; // 记录上次检查时间
  51. unsigned long currentTime = millis();
  52. // 按钮去抖逻辑
  53. int buttonState = digitalRead(BUTTON_PIN);
  54. if (buttonState != lastButtonStateNew) {
  55. lastDebounceTimeNew = currentTime;
  56. }
  57. if ((currentTime - lastDebounceTimeNew) > DEBOUNCE_DELAY) {
  58. if (buttonState == LOW && !resetModeActivated) {
  59. uint32_t pressStartTime = millis();
  60. while (digitalRead(BUTTON_PIN) == LOW) {
  61. if (millis() - pressStartTime >= BUTTON_HOLD_TIME) {
  62. Serial.println("[信息] 按钮长按,进入配置模式...");
  63. setupWiFiConfig();
  64. resetModeActivated = true;
  65. break;
  66. }
  67. }
  68. }
  69. }
  70. lastButtonStateNew = buttonState;
  71. if (resetModeActivated) {
  72. resetModeActivated = false;
  73. return;
  74. }
  75. // 每 5 秒执行一次的任务(非阻塞)
  76. if (currentTime - lastCheckTime >= 5000) {
  77. lastCheckTime = currentTime; // 更新上次检查时间
  78. // 处理 GPIO18 状态
  79. handleGpio18State(); // 调用 handleGpio18State 函数
  80. handleRelayControl(); // 开关继电器
  81. // MQTT 客户端循环
  82. if (!client.connected()) {
  83. if (!connectMQTT()) {
  84. Serial.println("[错误] MQTT 连接失败");
  85. setupWiFiConfig(); // 进入配置模式,超时时间为 60 秒
  86. }
  87. } else {
  88. mqttLoop(); // 继续 MQTT 循环
  89. }
  90. // 喂狗操作
  91. feedWatchdog();
  92. addBlinkTask(1);
  93. //Serial.println("[信息] 主循环运行中……");
  94. //Serial.println("[信息] 已永久存储 targetDeviceID: " + targetDeviceID);
  95. }
  96. // LED 闪烁逻辑
  97. blinkLED(); // 确保 blinkLED() 被调用
  98. }