esp32_c6.ino 3.9 KB

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