固件 0.1.19~0.1.21-c5:配网热点(SoftAP + 网页)、风扇 40 ℃ 以下断电
- 0.1.19 配网热点:没配 WiFi / 连续 60 s 连不上时自己开 SoftAP,192.168.4.1 网页里加删 WiFi、改 MQTT; 配置拼成 wifi / mqtt 命令走唯一的命令处理器(新链路号 3 CMD_LINK_AP),MQTT 仍不收配置命令 - 0.1.20 热点口令固定 88888888 - 0.1.21 风扇:板温 >=40 ℃ 上电、<38 ℃ 断电,40~65 ℃ 线性调速;fan 命令加可选 sec(下限到点自动交回) - mqtt 命令加 keep_pass;net 回应加 ap;status 的 fan 加 left - 新增 test_prov(13 例),test_t_thermal +3;29 ctest 全绿 Co-Authored-By: Claude Opus 5.5 <[email protected]>
这个提交包含在:
+28
-4
@@ -62,6 +62,9 @@
|
||||
⚠️ 与之配套的是**占空比下限** `T_THERMAL_DUTY_MIN`:占空比真掉到 0,
|
||||
导通时间永远攒不满,这条判据就变成了「永远不判」。所以闭环的下限不是 0;
|
||||
真要停风扇只能撤 `FAN_EN`(§22.6:0 % PWM 时四线风扇仍转 3300 RPM)。
|
||||
0.1.21 起凉的时候就是这么停的(`T_THERMAL_FAN_OFF_MC`):断电期间**不判停转**、窗口清零、
|
||||
转速报 0;`stalled` 保持断电前的结论(一只没插的风扇不会因为每次启停各记一条事件)。
|
||||
重新上电后照样先过启动宽限。
|
||||
|
||||
---- 事件:入队,不落盘 --------------------------------------------------
|
||||
`evlog_put()` 是几条指令的入队,任何任务都能调;`evlog_flush()` 是唯一碰 flash
|
||||
@@ -103,8 +106,18 @@ extern "C" {
|
||||
而新位置的温升曲线只有上板才有。这里给的是**形状**(分段线性 + 迟滞),
|
||||
数值先按常识填、单列在这里,上板实测之后只改这四行。 */
|
||||
|
||||
/* 低于它就按下限转(安静优先)。 */
|
||||
/* 曲线起点:这个温度按下限转,往上线性加到满速。 */
|
||||
#define T_THERMAL_TEMP_LO_MC 40000 /* 40.000 °C —— 待实测 */
|
||||
|
||||
/* **40 °C 以下风扇断电**(0.1.21,2026-10-06 用户定):撤 `FAN_EN`,不是把占空比压到 0 ——
|
||||
四线风扇 0 % PWM 仍转 3300 RPM(§22.6),要它停只能断 12V。
|
||||
到 `FAN_ON_MC` 开、掉到 `FAN_OFF_MC` 以下才关:两个数之间维持原状。
|
||||
⚠️ 这 2 °C 的迟滞不能省:板温就在 40 °C 上下晃(板 B 空闲实测 38~41 °C),
|
||||
没有它风扇每隔几秒启停一次,每次起转都是一声响,还各带 5 s 的停转判据盲区。
|
||||
**不受它管的三种情况,风扇一律开着**:两路温度都读不到(§10.10)、上位机给了下限(`fan` 命令)、
|
||||
以及启动后读到第一个温度之前的那一秒。 */
|
||||
#define T_THERMAL_FAN_ON_MC T_THERMAL_TEMP_LO_MC
|
||||
#define T_THERMAL_FAN_OFF_MC 38000
|
||||
/* 高于它满速。 */
|
||||
#define T_THERMAL_TEMP_HI_MC 65000 /* 65.000 °C —— 待实测 */
|
||||
/* 过温降载门限(FR-13「超阈值先降流再关路」)。本模块只**报**,不动电源 ——
|
||||
@@ -204,10 +217,11 @@ typedef struct {
|
||||
int32_t temp_max_mc; /* 两路里**高的那一个**:一点凉不代表另一点不烫 */
|
||||
bool temp_valid; /* 至少有一路读到了 */
|
||||
|
||||
uint16_t duty; /* **风扇侧**占空比,千分比。对外一律用这个口径 */
|
||||
uint16_t duty; /* **风扇侧**占空比,千分比。对外一律用这个口径;风扇断电时是 0 */
|
||||
uint16_t gpio_duty; /* 真写进 hal_pwm 的值(Q6 反相 ⇒ 1000 − duty) */
|
||||
|
||||
bool fan_en; /* `FAN_EN` 的命令值 */
|
||||
bool fan_en; /* `FAN_EN` 的命令值(凉了会撤,见 `T_THERMAL_FAN_OFF_MC`) */
|
||||
uint32_t fan_starts; /* 上过几次电(含启动那一次):启停太勤 = 迟滞不够 */
|
||||
uint32_t en_ms; /* 拉高的时刻,启动宽限从这里算 */
|
||||
|
||||
bool derate; /* 正在过温降载 */
|
||||
@@ -239,9 +253,19 @@ uint16_t t_thermal_duty_for(int32_t milli_c, bool valid);
|
||||
/* 上位机手动给的占空比**下限**(风扇侧千分比,A12 的 `fan` 命令)。0 = 全自动。
|
||||
⚠️ 只抬不压:实际占空比 = max(温度曲线, 下限)。「手动把风扇调小」这件事
|
||||
不提供 —— 那等于允许远程关掉散热,而温度读不到时满速(§10.10)的兜底也会被它盖掉。
|
||||
下一圈 `t_thermal_step()` 生效;不随 `t_thermal_init()` 清零(重启自然清零)。 */
|
||||
下限 > 0 时风扇一定开着(哪怕板温低于 40 °C):板上的 NTC 看不见手机 SoC 有多热,
|
||||
上位机(AppTask 按手机自报的温度)要风的时候就得有风。
|
||||
下一圈 `t_thermal_step()` 生效;不随 `t_thermal_init()` 清零(重启自然清零)。
|
||||
|
||||
`ttl_ms`(0.1.21):下限保持多久,0 = 一直保持。到期自动回 0(全自动)——
|
||||
给「程序定时续期」的上位机用:它挂了 / 断网了,风扇不会永远停在它最后要的那个转速上。
|
||||
`t_thermal_floor_left_ms()`:还剩多久,没设时限或已经没有下限时是 0。 */
|
||||
void t_thermal_set_floor(uint16_t permille);
|
||||
void t_thermal_set_floor_for(uint16_t permille, uint32_t ttl_ms);
|
||||
uint16_t t_thermal_floor(void);
|
||||
uint32_t t_thermal_floor_left_ms(void);
|
||||
|
||||
#define T_THERMAL_FLOOR_TTL_MAX_S 86400 /* `fan` 命令的 `sec` 上限:一天 */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
在新工单中引用
屏蔽一个用户