#ifndef __SENSOR_H #define __SENSOR_H #include "main.h" #include /* 采集终端传感器模块:USART2(PA2/PA3) 9600 485 总线,Modbus RTU 主机。 * 支持 9 种传感器(协议取自《485伴侣/多级菜单》Modbus.c,标识符对齐《采集终端/V3.0》): * 0x01 水体PH-EC -> PH, EC * 0x02 大气压温湿度 -> BS_T, BS_RH, BS_DO(气压kPa) * 0x03 水体溶解氧DO59 -> DS_T(水温), DO * 0x06 大气百叶箱 -> BY_TP, BY_RH, BY_HV, BY_CO2 * 0x07 叶面温湿度 -> YSMD_TP, YSMD_RH * 0x08 土壤温湿度 -> SOIL_TP, SOIL_RH * 0x09 土壤氮磷钾 -> SOIL_NV, SOIL_PV, SOIL_KV * 0x0A 土壤PH -> SOIL_PH * 0x0B 土壤电导率 -> SOIL_RV * 一条总线可挂多个传感器(各自从机地址需按上表配置好,互不冲突)。 * 每 10s 本地查询刷新(OLED 实时显示);上传在"OTA 已确认"后 +5s/+30s/+60s 各一次, * 之后每 5 分钟一次,在线传感器的参数各自组一条 iot.prop.post 上报。 */ /* 常规上传周期(联网后 +5s/+30s/+60s 暖机三次,之后按此周期) */ #define SENSOR_CYCLE_MS (5u * 60u * 1000u) /* 传感器在线位掩码(bit0=PH-EC ... bit8=土壤EC,顺序同 sensor.c 表) */ extern uint16_t g_sensor_online; /* 数值存储(单位见各字段注释) */ typedef struct { float ph, ec; /* 水体PH-EC: PH值, 电导率uS/cm */ float air_t, air_rh, air_press; /* 大气压温湿度: ℃, %RH, kPa */ float water_t, do_mgl, do_sat; /* 溶解氧: 水温℃, DO mg/L, 饱和度% */ float by_t, by_rh; /* 百叶箱: ℃, %RH */ uint16_t by_hv, by_co2; /* 百叶箱: 光照Lux, CO2 ppm */ float leaf_t, leaf_rh; /* 叶面温湿度: ℃, %RH */ float soil_t, soil_rh; /* 土壤温湿度: ℃, %RH */ float soil_n, soil_p, soil_k; /* 氮磷钾: mg/kg */ float soil_ph; /* 土壤PH */ float soil_ec; /* 土壤电导率 uS/cm */ } sensor_data_t; extern sensor_data_t g_sensor; void sensor_init(void); void sensor_process(void); /* app_task 循环调用:10s 本地读取 + 上传调度 */ void sensor_notify_ota_confirmed(void); /* "OTA 已确认"时调用,锚定上传计划 */ /* OLED 摘要:翻页输出在线传感器的显示内容(每 5s 翻一页,一页一路传感器, * 最多两行)。返回 1=有内容(l1/l2 已填,用不到的行填空串),0=无在线传感器 */ int sensor_oled_summary(char *l1, char *l2, int cap); #endif /* __SENSOR_H */