| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- #include "WiFiConfig.h"
- #include "MQTTHandler.h"
- #include "LEDHandler.h" // 引入 LEDHandler
- #include "WatchdogHandler.h" // 引入 WatchdogHandler
- #include "OTAUpdater.h" // 引入 OTAUpdater
- #define BUTTON_PIN 4 // 重置引脚4 //高低电平3 //代开发信号5
- #define WIFI_CONNECT_TIMEOUT 30000
- #define BUTTON_HOLD_TIME 1000
- #define DEBOUNCE_DELAY 50
- // LED 连接的 GPIO
- #define LED_PIN 5 // GPIO 5
- // 数据量统计
- unsigned long lastCheckTime = 0; // 上次检查时间
- // 当前固件版本
- const String currentFirmwareVersion = "1.0.4"; // 设备当前的固件版本
- //const String currentFirmwareVersion = "1.0.4 - " __DATE__ " " __TIME__; // 自动生成版本号
- long unsigned int lastDebounceTimeNew = 0;
- int lastButtonStateNew = HIGH;
- bool resetModeActivated = false;
- int lastGPIO18State = LOW; // 保存上一次 GPIO18 的电平状态
- // 创建 OTAUpdater 实例,使用全局变量 serverAddress 和 otaPort
- OTAUpdater otaUpdater(otaPort, currentFirmwareVersion);
- void setup() {
- Serial.begin(115200);
- delay(1000); // 等待串口初始化完成
- pinMode(BUTTON_PIN, INPUT_PULLUP);
- pinMode(GPIO3_PIN, INPUT); // 设置 GPIO18 为输入模式
- pinMode(LED_PIN, OUTPUT); // 设置 LED 引脚为输出模式
- // 初始化 LED
- setupLED(); // 确保调用 setupLED() 来初始化 LED
- // 设置 LED 亮度为 20%
- setFixedBrightness(5); // 20% 亮度
- // 初始化看门狗
- setupWatchdog();
- // 加载服务器参数
- loadServerParams();
- // 循环连接 WiFi 和进入配置模式
- while (true) {
- // 尝试连接 WiFi,超时时间为 30 秒
- if (connectWiFiWithTimeout(30000)) {
- break; // 连接成功,退出循环
- } else {
- Serial.println("[信息] Wi-Fi 连接失败,进入配置模式...");
- setupWiFiConfig(); // 进入配置模式,超时时间为 60 秒
- }
- }
- // 检查固件更新
- otaUpdater.checkForUpdates();
- // 初始化 MQTT 客户端
- mqttSetup();
- // 尝试连接到 MQTT 服务器
- if (!connectMQTT()) {
- Serial.println("[错误] MQTT 连接失败");
- }
- Serial.println("[信息] 已永久存储 targetDeviceID: " + targetDeviceID);
- }
- void loop() {
- static unsigned long lastCheckTime = 0; // 记录上次检查时间
- unsigned long currentTime = millis();
- // 按钮去抖逻辑
- int buttonState = digitalRead(BUTTON_PIN);
- if (buttonState != lastButtonStateNew) {
- lastDebounceTimeNew = currentTime;
- }
- if ((currentTime - lastDebounceTimeNew) > DEBOUNCE_DELAY) {
- if (buttonState == LOW && !resetModeActivated) {
- uint32_t pressStartTime = millis();
- while (digitalRead(BUTTON_PIN) == LOW) {
- if (millis() - pressStartTime >= BUTTON_HOLD_TIME) {
- Serial.println("[信息] 按钮长按,进入配置模式...");
- setupWiFiConfig();
- resetModeActivated = true;
- break;
- }
- }
- }
- }
- lastButtonStateNew = buttonState;
- if (resetModeActivated) {
- resetModeActivated = false;
- return;
- }
- // 每 5 秒执行一次的任务(非阻塞)
- if (currentTime - lastCheckTime >= 5000) {
- lastCheckTime = currentTime; // 更新上次检查时间
- // 处理 GPIO18 状态
- handleGpio18State(); // 调用 handleGpio18State 函数
- handleRelayControl(); // 开关继电器
- // MQTT 客户端循环
- if (!client.connected()) {
- if (!connectMQTT()) {
- Serial.println("[错误] MQTT 连接失败");
- setupWiFiConfig(); // 进入配置模式,超时时间为 60 秒
- }
- } else {
- mqttLoop(); // 继续 MQTT 循环
- }
- // 喂狗操作
- feedWatchdog();
- addBlinkTask(1);
- }
- // 每隔一段时间检查一次更新
- static unsigned long lastCheck = 0;
- if (millis() - lastCheck > 300000) { // 每5分钟检查一次
- lastCheck = millis();
- otaUpdater.checkForUpdates();
- }
- // LED 闪烁逻辑
- blinkLED(); // 确保 blinkLED() 被调用
- }
|