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

@@ -64,9 +64,9 @@ AlarmManager::~AlarmManager() {}
// ============================================================
bool AlarmManager::begin() {
ledcSetup(BUZZER_PWM_CHANNEL, BUZZER_PWM_FREQ, BUZZER_PWM_RESOLUTION);
ledcAttachPin(BUZZER_PIN, BUZZER_PWM_CHANNEL);
ledcWrite(BUZZER_PWM_CHANNEL, 0);
// 有源蜂鸣器: 用 digitalWrite, 不用 PWM
pinMode(BUZZER_PIN, OUTPUT);
digitalWrite(BUZZER_PIN, LOW);
pinMode(LED_ALARM_PIN, OUTPUT);
digitalWrite(LED_ALARM_PIN, LOW);
@@ -148,29 +148,29 @@ static void _calcBuzzerParams(AlarmManager::AlarmType t,
uint8_t& beeps, uint32_t& onMs,
uint32_t& offMs, uint32_t& pauseMs) {
switch (t) {
// 人身安全 — 连速急哔 (最刺耳)
// 人身安全 — 连速急哔
case AlarmManager::ALARM_FALL:
beeps = 0; onMs = 60; offMs = 60; pauseMs = 0; // 跌倒: 连速
beeps = 0; onMs = 200; offMs = 200; pauseMs = 0; // 跌倒: 急促哔
break;
case AlarmManager::ALARM_HEART_ABNORMAL:
case AlarmManager::ALARM_BREATH_ABNORMAL:
beeps = 5; onMs = 80; offMs = 80; pauseMs = 400; // 心率/呼吸: 5连
beeps = 5; onMs = 200; offMs = 150; pauseMs = 500; // 心率/呼吸: 5连哔
break;
// 环境安全 — 次急
// 环境安全
case AlarmManager::ALARM_WATER_LEAK:
beeps = 3; onMs = 120; offMs = 100; pauseMs = 500; // 水浸: 3连哔
beeps = 3; onMs = 250; offMs = 200; pauseMs = 600; // 水浸: 3连哔
break;
// 环境舒适 — 温和
// 环境舒适
case AlarmManager::ALARM_TEMP_ABNORMAL:
case AlarmManager::ALARM_HUMI_ABNORMAL:
beeps = 2; onMs = 200; offMs = 400; pauseMs = 1200; // 温湿度: 2声长停
beeps = 2; onMs = 300; offMs = 500; pauseMs = 1500; // 温湿度: 2声长停
break;
// 设备状态 — 仅提示
// 设备状态
case AlarmManager::ALARM_SENSOR_FAULT:
beeps = 1; onMs = 300; offMs = 3000; pauseMs = 0; // 传感器: 单声提醒
beeps = 1; onMs = 500; offMs = 3000; pauseMs = 0; // 传感器: 单声提醒
break;
default:
beeps = 0; onMs = 500; offMs = 500; pauseMs = 0; // 持续
beeps = 0; onMs = 500; offMs = 500; pauseMs = 0; // 持续
break;
}
}
@@ -277,8 +277,13 @@ void AlarmManager::executeRestore(const AlarmCommand& cmd) {
Serial.printf("[告警] ☁️ 恢复: %s\n", cmd.alarmType);
AlarmType localType = ALARM_SERVER;
if (strcmp(cmd.alarmType, "fall") == 0) localType = ALARM_FALL;
else if (strcmp(cmd.alarmType, "water_leak") == 0) localType = ALARM_WATER_LEAK;
if (strcmp(cmd.alarmType, "fall") == 0) localType = ALARM_FALL;
else if (strcmp(cmd.alarmType, "water_leak") == 0) localType = ALARM_WATER_LEAK;
else if (strcmp(cmd.alarmType, "heart_abnormal") == 0) localType = ALARM_HEART_ABNORMAL;
else if (strcmp(cmd.alarmType, "breath_abnormal") == 0) localType = ALARM_BREATH_ABNORMAL;
else if (strcmp(cmd.alarmType, "temp_abnormal") == 0) localType = ALARM_TEMP_ABNORMAL;
else if (strcmp(cmd.alarmType, "humi_abnormal") == 0) localType = ALARM_HUMI_ABNORMAL;
else if (strcmp(cmd.alarmType, "sensor_fault") == 0) localType = ALARM_SENSOR_FAULT;
clearLocal(localType);
@@ -308,7 +313,7 @@ void AlarmManager::_setBuzzer(bool on) {
if (on) {
_buzzerOffTime = 0;
} else {
ledcWrite(BUZZER_PWM_CHANNEL, 0);
digitalWrite(BUZZER_PIN, LOW);
_buzzerOffTime = 0;
}
}
@@ -328,16 +333,20 @@ void AlarmManager::_updateBuzzer() {
// 定时关闭
if (_buzzerOffTime > 0 && millis() >= _buzzerOffTime) {
_buzzerOn = false;
ledcWrite(BUZZER_PWM_CHANNEL, 0);
digitalWrite(BUZZER_PIN, LOW);
Serial.println(F("[告警] ⏰ 蜂鸣器定时关闭"));
return;
}
uint32_t now = millis();
// 云端定时: 持续响
// 云端定时: 哔哔声 (500ms响/500ms停), 不是长鸣
if (_buzzerOffTime > 0) {
ledcWrite(BUZZER_PWM_CHANNEL, 128);
if (now - _buzzerToggleTime >= 500) {
_buzzerToggleTime = now;
_buzzerBeepState = !_buzzerBeepState;
digitalWrite(BUZZER_PIN, _buzzerBeepState ? HIGH : LOW);
}
return;
}
@@ -347,7 +356,7 @@ void AlarmManager::_updateBuzzer() {
if (now - _buzzerToggleTime >= (_buzzerBeepState ? _beepOnMs : _beepOffMs)) {
_buzzerToggleTime = now;
_buzzerBeepState = !_buzzerBeepState;
ledcWrite(BUZZER_PWM_CHANNEL, _buzzerBeepState ? 128 : 0);
digitalWrite(BUZZER_PIN, _buzzerBeepState ? HIGH : LOW);
}
} else {
// 多声一组: N声哔 + 长停顿
@@ -358,7 +367,7 @@ void AlarmManager::_updateBuzzer() {
_buzzerToggleTime = now;
if (_beepCount >= _beepsPerCycle) _beepCount = 0;
_buzzerBeepState = true;
ledcWrite(BUZZER_PWM_CHANNEL, 128);
digitalWrite(BUZZER_PIN, HIGH);
_beepCount++;
}
} else {
@@ -366,7 +375,7 @@ void AlarmManager::_updateBuzzer() {
if (now - _buzzerToggleTime >= _beepOnMs) {
_buzzerToggleTime = now;
_buzzerBeepState = false;
ledcWrite(BUZZER_PWM_CHANNEL, 0);
digitalWrite(BUZZER_PIN, LOW);
}
}
}