feat:增加蓝牙配网功能

This commit is contained in:
yangzhijia
2026-08-12 09:20:54 +08:00
parent 2ce4ac0b9c
commit 93112dcdfd
11 changed files with 1163 additions and 561 deletions

View File

@@ -16,10 +16,15 @@
// 1. 硬件引脚定义 (ESP32-S3)
// ============================================================
// --- R60ABD1 毫米波雷达 ---
// --- 雷达型号选择 ---
#define RADAR_TYPE_ABD1 0 // R60ABD1: 心率/呼吸精准, 跌倒一般
#define RADAR_TYPE_AFD1 1 // R60AFD1: 跌倒/姿态精准, 无心率呼吸
#define RADAR_TYPE RADAR_TYPE_AFD1 // 演示用 AFD1 (跌倒精准)
// --- 毫米波雷达 ---
#define RADAR_UART_PORT Serial2
#define RADAR_RX_PIN 17
#define RADAR_TX_PIN 1 // UART 发送 (从18挪到1)
#define RADAR_TX_PIN 1
#define RADAR_BAUD_RATE 115200
// --- 雷达备用 GPIO ---
@@ -72,8 +77,8 @@
// ============================================================
#define WIFI_AP_SSID "HealthMonitor-Setup"
#define WIFI_AP_PASSWORD "12345678"
#define WIFI_CONFIG_TIMEOUT 300
#define WIFI_AP_PASSWORD "1234567890"
#define WIFI_CONFIG_TIMEOUT 0 // 0=不超时, 一直等待配置
#define WIFI_CONNECT_TIMEOUT 15
#define WIFI_RETRY_INTERVAL 10000
@@ -130,6 +135,7 @@
#define TEMP_LOW 5.0f
#define TEMP_HIGH 45.0f
#define HUMI_LOW 15.0f
#define PRESENCE_HYSTERESIS 8 // 有人无人防抖 (PCB信号抖动时过滤)
#define HUMI_HIGH 90.0f
#define WATER_DEBOUNCE_MS 50

View File

@@ -68,6 +68,7 @@ private:
void _extractPresence(const RadarFrame& frame);
void _extractBreathing(const RadarFrame& frame);
void _extractHeartRate(const RadarFrame& frame);
void _extractFall(const RadarFrame& frame); // AFD1 跌倒
void _extractSleep(const RadarFrame& frame);
void _extractWorkStatus(const RadarFrame& frame);
void _extractDetectRange(const RadarFrame& frame);
@@ -85,6 +86,13 @@ private:
RadarCallback _callback;
uint32_t _frameCount;
uint32_t _errorCount;
uint32_t _lastHeartBeat; // 上次心率数据时间
uint32_t _lastBreathBeat; // 上次呼吸数据时间
// 有人无人防抖 (PCB 信号不稳定时过滤跳变)
bool _stablePresence; // 防抖后的稳定有人/无人
uint8_t _presenceCnt; // 连续一致计数
bool _lastRawPresence; // 上一次原始值
};
#endif // RADAR_MANAGER_H

View File

@@ -33,9 +33,10 @@ enum RadarControl : uint8_t {
CTRL_WORK_STATUS = 0x05, // 工作状态
CTRL_DETECT_RANGE = 0x07, // 探测范围
CTRL_PRESENCE = 0x80, // 人体存在
CTRL_BREATHING = 0x81, // 呼吸检测
CTRL_SLEEP = 0x84, // 睡眠监测
CTRL_HEART_RATE = 0x85, // 心率监测
CTRL_BREATHING = 0x81, // 呼吸检测 (仅 ABD1)
CTRL_FALL = 0x83, // 跌倒检测 (仅 AFD1)
CTRL_SLEEP = 0x84, // 睡眠监测 (仅 ABD1)
CTRL_HEART_RATE = 0x85, // 心率监测 (仅 ABD1)
};
// ============================================================

View File

@@ -1,10 +1,10 @@
/**
* @file wifi_manager.h
* @brief WiFi 配网管理器
* @brief WiFi 配网管理器 (AP + WebServer)
*
* 功能:
* - 自动连接已保存的 WiFi
* - 配网失败/首次启动 → AP 模式 + 强制门户页面
* - 配网失败/首次启动 → AP 模式 + Captive Portal
* - 自定义参数: MQTT 服务器/端口/用户/密码、设备名称、环境备注
* - 长按按钮重置配置
* - LED 状态指示
@@ -15,7 +15,9 @@
#define WIFI_MANAGER_H
#include <Arduino.h>
#include <WiFiManager.h>
#include <WiFi.h>
#include <WebServer.h>
#include <DNSServer.h>
#include <LittleFS.h>
#include <ArduinoJson.h>
#include "config.h"
@@ -27,7 +29,9 @@ struct DeviceConfig {
char mqtt_user[20];
char mqtt_pass[20];
char device_id[20];
char env_note[20]; // 环境备注 (如: "主卧", "客厅", "老人房")
char env_note[20]; // 环境备注
char wifi_ssid[33]; // WiFi SSID (持久化)
char wifi_pass[65]; // WiFi 密码 (持久化)
};
class WiFiMgmt {
@@ -38,100 +42,55 @@ public:
// 单例指针 (用于静态回调)
static WiFiMgmt* _instance;
/**
* @brief 初始化 WiFi 管理器
* @return true=成功
*/
bool begin();
/**
* @brief 主循环, 处理配网流程和按钮检测
* @return true=WiFi 已连接
*/
bool loop();
/**
* @brief WiFi 是否已连接
*/
bool isConnected() const;
/**
* @brief 获取设备配置
*/
bool justProvisioned(); // 刚配网成功 (读取后自动清除)
DeviceConfig getConfig() const;
/**
* @brief 获取设备 ID (用于 MQTT client_id)
*/
const char* getDeviceId() const;
/**
* @brief 获取环境备注
*/
const char* getEnvNote() const;
/**
* @brief 强制进入配网模式
*/
void startConfigPortal();
/**
* @brief 清除所有配置并重启
*/
void resetSettings();
private:
/**
* @brief 尝试连接 WiFi
*/
bool _connectWiFi();
/**
* @brief 设置 LED 模式 (线程安全, 无阻塞)
* @param mode 0=灭 1=慢闪(断连1s) 2=快闪(配网300ms) 3=常亮(已连接)
*/
void _setLEDMode(uint8_t mode);
/**
* @brief LED 闪烁独立任务 (FreeRTOS, 不受主循环阻塞影响)
*/
static void _ledTaskFunc(void* param);
/**
* @brief 检测按钮长按
*/
bool _checkButtonLongPress();
/**
* @brief 加载/保存配置到 LittleFS
*/
bool _connectWiFi(); // 仅尝试已保存凭据
bool _tryConnect(const char* ssid, const char* pass); // 尝试连接指定 WiFi
bool _loadConfig();
bool _saveConfig();
void _setLEDMode(uint8_t mode);
static void _ledTaskFunc(void* param);
bool _checkButtonLongPress();
/**
* @brief 保存 WiFi 参数回调 (WiFiManager 的回调)
*/
static void _saveParamsCallback();
static void _apCallback(WiFiManager* wm);
// Web 服务器
void _startPortal();
void _stopPortal();
void _handleRoot();
void _handleSave();
void _handleReset();
void _updateWifiScan(); // WiFi 扫描缓存
String _htmlPage(); // 返回配网 HTML 页面
WiFiManager _wm;
DeviceConfig _config;
bool _connected;
uint32_t _lastCheckTime;
uint32_t _buttonPressTime;
bool _buttonPressed;
WebServer* _server;
DNSServer* _dns;
DeviceConfig _config;
bool _connected;
bool _portalActive;
bool _portalStopFlag; // 延迟关闭标记
uint32_t _portalStartTime;
String _pendingSSID;
String _pendingPass;
bool _provisionSuccess; // 刚配网成功标记
uint32_t _lastCheckTime;
uint32_t _buttonPressTime;
bool _buttonPressed;
// LED 独立任务 (不被 startConfigPortal 阻塞影响)
// WiFi 扫描缓存 (避免每次打开页面都扫描3-8秒)
String _wifiScanCache;
uint32_t _lastScanTime;
// LED 独立任务
TaskHandle_t _ledTaskHandle;
volatile uint8_t _ledMode; // 0=灭 1=慢闪 2=快闪 3=常亮
// WiFiManager 自定义参数
WiFiManagerParameter* _param_mqtt_server;
WiFiManagerParameter* _param_mqtt_port;
WiFiManagerParameter* _param_mqtt_user;
WiFiManagerParameter* _param_mqtt_pass;
WiFiManagerParameter* _param_device_id;
WiFiManagerParameter* _param_env_note;
};
#endif // WIFI_MANAGER_H