Browse Source

上传文件至 ''

yangfei 1 year ago
parent
commit
4a6f764fab
4 changed files with 158 additions and 0 deletions
  1. 31 0
      WatchdogHandler.cpp
  2. 18 0
      WatchdogHandler.h
  3. 90 0
      WiFiConfig.cpp
  4. 19 0
      WiFiConfig.h

+ 31 - 0
WatchdogHandler.cpp

@@ -0,0 +1,31 @@
+#include "WatchdogHandler.h"
+
+// 初始化看门狗定时器
+void setupWatchdog() {
+  // 解锁写保护
+  *(volatile uint32_t*)(LP_WDT_RWDT_WPROTECT_REG) = WDT_WKEY;
+
+  // 配置看门狗超时时间为 60 秒
+  // 假设时钟频率为 32.768 kHz(低速时钟),超时时间 = (LP_WDT_RWDT_CONFIG0_REG 的值) / 32768
+  uint32_t timeout_ticks = 60 * 32768; // 60 秒
+  *(volatile uint32_t*)(LP_WDT_RWDT_CONFIG0_REG) = timeout_ticks;
+
+  // 重新使能写保护
+  *(volatile uint32_t*)(LP_WDT_RWDT_WPROTECT_REG) = 0x0;
+
+  Serial.println("看门狗定时器初始化完成,超时时间为 60 秒。");
+}
+
+// 喂狗操作
+void feedWatchdog() {
+  // 解锁写保护
+  *(volatile uint32_t*)(LP_WDT_RWDT_WPROTECT_REG) = WDT_WKEY;
+
+  // 写入任意值喂狗
+  *(volatile uint32_t*)(LP_WDT_RWDT_FEED_REG) = 0x1;
+
+  // 重新使能写保护
+  *(volatile uint32_t*)(LP_WDT_RWDT_WPROTECT_REG) = 0x0;
+
+  //Serial.println("喂狗操作完成...");
+}

+ 18 - 0
WatchdogHandler.h

@@ -0,0 +1,18 @@
+#ifndef WATCHDOG_HANDLER_H
+#define WATCHDOG_HANDLER_H
+
+#include <Arduino.h>
+
+// 寄存器地址定义(根据 ESP32-C6 技术参考手册)
+#define LP_WDT_RWDT_CONFIG0_REG  0x600B4800  // RWDT 配置寄存器 0
+#define LP_WDT_RWDT_FEED_REG     0x600B4814  // RWDT 喂狗寄存器
+#define LP_WDT_RWDT_WPROTECT_REG 0x600B4818  // RWDT 写保护寄存器
+
+// 看门狗写保护密钥
+#define WDT_WKEY 0x50D83AA1
+
+// 函数声明
+void setupWatchdog();  // 初始化看门狗
+void feedWatchdog();   // 喂狗操作
+
+#endif

+ 90 - 0
WiFiConfig.cpp

@@ -0,0 +1,90 @@
+#include "WiFiConfig.h"
+#include <Arduino.h>
+
+// 持久化存储
+Preferences preferences;
+
+// 持久化存储的参数
+String deviceID;
+String serverAddress;
+uint16_t serverPort;
+
+// 加载服务器参数
+void loadServerParams() {
+  preferences.begin("settings", true);
+  serverAddress = preferences.getString("serverAddress", "192.168.3.31");
+  serverPort = preferences.getUInt("serverPort", 1883);
+  preferences.end();
+  Serial.println("[信息] 加载服务器参数:");
+  Serial.println("服务器地址: " + serverAddress);
+  Serial.println("服务器端口: " + String(serverPort));
+}
+
+// 保存参数回调
+void saveParamsCallback() {
+  Serial.println("[信息] 正在保存自定义参数...");
+  preferences.begin("settings", false);
+  preferences.putString("serverAddress", serverAddress);
+  preferences.putUInt("serverPort", serverPort);
+  preferences.end();
+  Serial.println("[信息] 参数保存成功。");  
+}
+
+// WiFi 配网功能
+void setupWiFiConfig() {
+  WiFiManager wifiManager;
+setConstantOn(true);  // LED 常亮
+  WiFiManagerParameter customServer("server", "服务器地址", serverAddress.c_str(), 40);
+  WiFiManagerParameter customPort("port", "服务器端口", String(serverPort).c_str(), 6);
+  wifiManager.addParameter(&customServer);
+  wifiManager.addParameter(&customPort);
+
+  wifiManager.setSaveParamsCallback([]() {
+    serverAddress = WiFiManagerParameter("server", "服务器地址", serverAddress.c_str(), 40).getValue();
+    serverPort = String(WiFiManagerParameter("port", "服务器端口", String(serverPort).c_str(), 6).getValue()).toInt();
+  });
+
+  wifiManager.setConfigPortalTimeout(50);  // 配置模式超时时间为 60 秒
+
+  if (!wifiManager.startConfigPortal("人体存在感应器_Config")) {
+    Serial.println("[错误] 配置模式超时或未完成配置!");
+    feedWatchdog();
+    // 关闭 LED
+setConstantOn(false); 
+  } else {
+    serverAddress = customServer.getValue();
+    serverPort = String(customPort.getValue()).toInt();
+    saveParamsCallback();
+    loadServerParams();  // 重新加载保存的服务器配置
+    // 关闭 LED
+setConstantOn(false); 
+  }
+}
+
+// 尝试连接 WiFi
+bool connectWiFiWithTimeout(uint32_t timeoutMs) {
+  Serial.println("[信息] 正在尝试连接 Wi-Fi...");
+  WiFi.begin();
+  uint32_t startAttemptTime = millis();
+      feedWatchdog();
+
+  while (WiFi.status() != WL_CONNECTED && (millis() - startAttemptTime) < timeoutMs) {
+    delay(500);
+    addBlinkTask(2);
+    Serial.print(".");
+  }
+
+  if (WiFi.status() == WL_CONNECTED) {
+    Serial.println("\n[信息] Wi-Fi 连接成功!");
+    deviceID = WiFi.macAddress();
+    Serial.println("设备 ID (MAC 地址): " + deviceID);
+    Serial.println("IP 地址: " + WiFi.localIP().toString());
+    return true;
+  } else {
+    Serial.print("\n[错误] Wi-Fi 连接超时,超时时间: ");
+    Serial.print(timeoutMs);
+    Serial.println(" 毫秒");
+    setupWiFiConfig();
+    return false;
+  }
+}

+ 19 - 0
WiFiConfig.h

@@ -0,0 +1,19 @@
+#ifndef WIFICONFIG_H
+#define WIFICONFIG_H
+
+#include <WiFiManager.h>
+#include <Preferences.h>
+extern String deviceID;
+extern String serverAddress;  // 声明外部变量
+extern uint16_t serverPort;
+
+// WiFi 配置和服务器参数设置
+void loadServerParams();
+void setupWiFiConfig();
+bool connectWiFiWithTimeout(uint32_t timeoutMs);
+// 声明 feedWatchdog 函数
+void feedWatchdog();
+void setConstantOn(bool constantOn);  // 设置 LED 常亮或关闭
+void addBlinkTask(int blinkCount);  // 添加闪烁任务,接受一个 int 参数
+
+#endif