From 6e2ce733a646de391c85b1aa8ec3418a46778041 Mon Sep 17 00:00:00 2001 From: Wuchuyuan <1917507415@qq.com> Date: Mon, 31 Aug 2026 18:35:01 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BC=A0=E6=84=9F=E5=99=A8?= =?UTF-8?q?=E8=84=B1=E8=90=BD=E6=97=A0=E6=B3=95=E4=B8=8A=E6=8A=A5=E6=95=85?= =?UTF-8?q?=E9=9A=9C=EF=BC=9A=20=E5=8F=91=E9=80=81=E6=8C=87=E4=BB=A4=20nac?= =?UTF-8?q?k=20=E8=AE=A1=E5=85=A5=E8=BF=9E=E7=BB=AD=E5=A4=B1=E8=B4=A5?= =?UTF-8?q?=EF=BC=8CDP22=20=E6=95=85=E9=9A=9C=E7=A0=81=E6=94=B9=E4=B8=BA?= =?UTF-8?q?=201=20=E6=8B=94=E6=8E=89=20AHT20=20=E6=97=B6=20measure=5Fstart?= =?UTF-8?q?=20=E8=BF=94=E5=9B=9E=20addr=20nack=EF=BC=8C=E5=8E=9F=E5=85=88?= =?UTF-8?q?=E7=9B=B4=E6=8E=A5=E8=B7=B3=E8=BF=87=E6=9C=AC=E6=AC=A1=E9=87=87?= =?UTF-8?q?=E6=A0=B7=E3=80=81fail=5Fcnt=20=E4=B8=8D=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=EF=BC=8C=20=E5=AF=BC=E8=87=B4=E6=B0=B8=E8=BF=9C=E5=88=A4?= =?UTF-8?q?=E4=B8=8D=E5=87=BA=E6=95=85=E9=9A=9C=E3=80=82=E5=8F=91=E9=80=81?= =?UTF-8?q?=E6=8C=87=E4=BB=A4=E5=A4=B1=E8=B4=A5=E4=B8=8E=E8=AF=BB=E6=95=B0?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5=E7=BB=9F=E4=B8=80=E8=AE=B0=E5=A4=B1=E8=B4=A5?= =?UTF-8?q?=EF=BC=8C=E8=BF=9E=E7=BB=AD=203=20=E6=AC=A1=E5=90=8E=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=20--=E3=80=82=20fault=5Fcode=EF=BC=9A=E4=BC=A0?= =?UTF-8?q?=E6=84=9F=E5=99=A8=E6=95=85=E9=9A=9C=E6=8A=A5=201=EF=BC=8C2=20?= =?UTF-8?q?=E9=A2=84=E7=95=99=EF=BC=9B=E6=B8=A9=E6=B9=BF=E5=BA=A6=E6=AF=94?= =?UTF-8?q?=E8=BE=83=E5=BC=82=E5=B8=B8=E5=8F=AA=E9=97=AA=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E3=80=81=E4=B8=8D=E4=B8=8A=E6=8A=A5=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Doc/温湿度风扇_固件需求规格书.md | 7 ++++--- apps/usr_app/app_disp.h | 2 +- apps/usr_app/app_function.c | 11 ++--------- apps/usr_app/app_th.c | 27 ++++++++++++++++++++------- apps/usr_app/app_th.h | 10 +++++----- 5 files changed, 32 insertions(+), 25 deletions(-) diff --git a/Doc/温湿度风扇_固件需求规格书.md b/Doc/温湿度风扇_固件需求规格书.md index 6cabb8a..3c9bb0c 100644 --- a/Doc/温湿度风扇_固件需求规格书.md +++ b/Doc/温湿度风扇_固件需求规格书.md @@ -276,7 +276,7 @@ LED **不** 表示风扇档位,**不** 表示温湿度告警(告警走数码 |---|---|---| | 温度 2 位 | 整数 ℃ | 0~99 显示绝对值;<0 显示 `-9`~`-1`(负号用 G 段或自定义,P0 扫段后定);<−9 钳位 `-9`;>99 钳位 `99` | | 湿度 2 位 | 整数 % | 0~99,>99 钳位 `99` | -| 读失败 | 双管 `--` | 连续失败 **3** 次后;`fault_code=2` | +| 读失败 | 双管 `--` | 连续失败 **3** 次后;`fault_code=1` | APP DP3 仍是 0.1℃ 精度 float;显示不跟小数。 @@ -285,7 +285,8 @@ APP DP3 仍是 0.1℃ 精度 float;显示不跟小数。 - 任一 **已使能** 且 `cond_en=1` 的条件组,其温度比较 **当前已成立**(**不等待** Byte4 时长)→ 温度管 **500ms 亮 / 500ms 灭**。 - 湿度同理。两路可同时闪。 - 比较不再成立 → 该侧停闪,常亮显示数值。 -- 同步:`fault_code=1`(温湿度异常)。传感器故障优先于 1:失败达 3 次则 `fault_code=2` 且 `--`。 +- 温湿度比较异常只驱动对应管子闪烁,**不上报** `fault_code`。 +- 传感器连续失败 3 次:显示 `--`,同步 `fault_code=1`。`fault_code=2` 预留。 - `alarm_code` 预留,不上报具体码(保持 0)。 - `BOARD_DISP_ENABLE=0` 时不闪、不驱动管子,fault 仍可上报。 @@ -503,7 +504,7 @@ usr_rtc_get_time() 失败 → 全部定时不执行(等同 time_en=0) | 13 time_en | 见第 11 章 | | 14~20 time_config | 8 字节 + 存 VM | | 21/23 en | 原样存,P0 不做位级过滤 | -| 22 fault_code | 0 无 / 1 温湿度比较异常 / 2 传感器故障 | +| 22 fault_code | 0 无 / 1 传感器故障 / 2 预留 | | 24 alarm_code | 保持 0 | | 25 factory_reset | 第 14 章 | | 26~28 | 存 RAM/VM 可不实现动作 | diff --git a/apps/usr_app/app_disp.h b/apps/usr_app/app_disp.h index 355ace0..f6f7e47 100644 --- a/apps/usr_app/app_disp.h +++ b/apps/usr_app/app_disp.h @@ -56,7 +56,7 @@ void app_disp_set_temp_alarm(uint8_t en); void app_disp_set_humi_alarm(uint8_t en); /** - * @brief 温度或湿度管是否处于告警闪烁(供 fault_code=1) + * @brief 温度或湿度管是否处于告警闪烁 * @return 1=任一侧告警,0=无 */ uint8_t app_disp_is_alarm(void); diff --git a/apps/usr_app/app_function.c b/apps/usr_app/app_function.c index abd2062..dd0c964 100644 --- a/apps/usr_app/app_function.c +++ b/apps/usr_app/app_function.c @@ -21,7 +21,6 @@ #include "app_cond.h" #include "app_timer_task.h" #include "app_th.h" -#include "app_disp.h" #include "app_led.h" #include "app_main.h" #include "usr_le_api.h" @@ -83,14 +82,8 @@ void app_function_poll(void) { gDevData.fan_gear = app_fan_get_gear(); /* DP2 必须等于当前真实档位 */ gDevData.mode = app_mode_get_active(); - /* 规格书 8.2/15:传感器故障优先 2;否则温湿度比较成立报 1 */ - if (app_th_is_fault()) { - gDevData.fault_code = 2; - } else if (app_disp_is_alarm()) { - gDevData.fault_code = 1; - } else { - gDevData.fault_code = 0; - } + /* DP22:传感器连续失败报 1;2 预留,温湿度比较异常只走显示闪烁不上报 */ + gDevData.fault_code = app_th_is_fault() ? 1 : 0; } /** diff --git a/apps/usr_app/app_th.c b/apps/usr_app/app_th.c index 878740b..026200c 100644 --- a/apps/usr_app/app_th.c +++ b/apps/usr_app/app_th.c @@ -2,8 +2,8 @@ * @file app_th.c * @brief CBR3 温湿度采集实现 * @author cyWu <1917507415@qq.com> - * @date 2026.08.29 - * @version V1.0.0,首次发布 + * @date 2026.08.31 + * @version V1.1.0,发令阶段 nack 也计入连续失败;fault_code 由上层映射为 1 ******************************************************************************/ #include "app_th.h" @@ -40,6 +40,19 @@ typedef struct { static AppThCtx_t s_th; +/** + * @brief 记一次采样失败(发令 nack / 读数失败共用) + * @return 无 + */ +static void th_on_fail(void) +{ + if (s_th.fail_cnt < 0xFF) { + s_th.fail_cnt++; + } + s_th.last_ok = 0; + log_error("th sample fail %d\n", s_th.fail_cnt); +} + /** * @brief 初始化温湿度模块 * @return 无 @@ -85,8 +98,10 @@ void app_th_poll(uint16_t dt) if (bsp_aht20_measure_start() == 0) { s_th.state = TH_ST_WAIT_DATA; s_th.wait_t0 = timer_get_ms(); + } else { + /* 发令阶段 addr nack(未插/脱落)也算一次采样失败,不能直接跳过 */ + th_on_fail(); } - /* measure_start 非 0=通讯失败,跳过本次采样 */ } } else if (s_th.state == TH_ST_WAIT_DATA) { clr_wdt(); @@ -106,9 +121,7 @@ void app_th_poll(uint16_t dt) log_info("th %d.%dC %d%%\n", (int)(t / 10), (int)((t < 0) ? (-t % 10) : (t % 10)), h); } else { - s_th.fail_cnt++; - s_th.last_ok = 0; - log_error("th sample fail %d\n", s_th.fail_cnt); + th_on_fail(); } } } @@ -152,7 +165,7 @@ uint8_t app_th_get_fail_cnt(void) /** * @brief 传感器故障(连续失败 ≥ BOARD_TH_FAIL_MAX) - * @return 1=故障(显示 --、fault_code=2),0=正常 + * @return 1=故障(显示 --、fault_code=1),0=正常 */ uint8_t app_th_is_fault(void) { diff --git a/apps/usr_app/app_th.h b/apps/usr_app/app_th.h index 1f55a8c..38bf730 100644 --- a/apps/usr_app/app_th.h +++ b/apps/usr_app/app_th.h @@ -2,12 +2,12 @@ * @file app_th.h * @brief CBR3 温湿度采集:2s 周期、失败计数、最近有效值 * @author cyWu <1917507415@qq.com> - * @date 2026.08.29 - * @version V1.0.0,首次发布 + * @date 2026.08.31 + * @version V1.1.0,发令阶段 nack 也计入连续失败 * * @note 规格书 8.4:条件"持续时长"只在本次采样成功且比较成立时累加; - * 采样失败不累加、不清零;连续 3 次失败显示 "--" 且 fault_code=2。 - * P0 不做条件比较,只做采样与失败计数。 + * 采样失败不累加、不清零;连续 3 次失败显示 "--",DP22 fault_code=1。 + * fault_code=2 预留,本模块只给出 is_fault,由 app_function 映射。 ******************************************************************************/ #ifndef __APP_TH_H__ @@ -54,7 +54,7 @@ uint8_t app_th_get_fail_cnt(void); /** * @brief 传感器故障(连续失败 ≥ BOARD_TH_FAIL_MAX) - * @return 1=故障(显示 --、fault_code=2),0=正常 + * @return 1=故障(显示 --、fault_code=1),0=正常 */ uint8_t app_th_is_fault(void);