前言
最近对室内空气质量传感器进行了重新设计,主要原因是前代产品中使用的颗粒物传感器寿命未能达到预期。
此前采用的PMS1003传感器在实际使用1至2年后,读取的颗粒物浓度数据在0-1 µg/m³,明显出现了故障。根据产品数据手册及使用经验,该传感器的平均无故障运行时间(MTBF)应超过3年。
然而,本次使用过程中并未达到这一预期寿命。因此,我们对其进行了深入分析,以查明具体原因。

图1 PMS1003传感器
分析
考虑到该传感器的失效模式,总结可能造成传感器寿命不达预期的可能性为以下几点:
- 购买渠道不正规,传感器本体存放不当或库存时间过长。
- 使用环境不当,温湿度超适用范围。
- 传感器本体个体差异。
写到这我心里也有答案了,很明显是从二手电子元器件商家(比如老王、老五)购买的我的锅(─.─|||
图2 PMS1003传感器购买
虽然没有使用痕迹,但是传感器可能是存放很久的库存品。不过购买时这个价格确实很难拒绝,全新PMS5003购买价格大概需要70元。
由于很难拒绝的价格我囤积了一些这个传感器,所以这一代也得使用这款传感器
为此,需要使用传感器的休眠引脚,减少传感器的运行时间,以达到增加寿命的目的。
引脚介绍

图3 PMS1003传感器引脚图
根据数据手册的引脚定义,PIN3-SET引脚置于高电平时为运行状态,而置于低电平则为低功耗状态,传感器休眠,我们需要在程序中实现这一操作。
程序编写
这样的休眠操作在C语言环境下实现是非常简单的
可惜本次使用的是ESPHOME平台的YAML形式编写,存在较大的限制
为了实现这样的操作,首先需要将SET引脚所连接到的GPIO设定为Switch组件,示例如下:
switch:
- platform: gpio # GPIO模式
name: "Measuring" # 自定义名称
id: measuring # 自定义id
pin:
number: GPIO14 # 连接的GPIO
restore_mode: ALWAYS_OFF # 开机默认保持OFF状态
on_turn_on: # ON状态时执行的操作
- binary_sensor.template.publish: # 更新binary_sensor状态
id: warmed_up
state: ON
on_turn_off: # OFF状态时执行的操作
- binary_sensor.template.publish: # 更新binary_sensor状态
id: warmed_up
state: OFF组件在GPIO的ON与OFF状态时同步更新binary_sensor状态,以提供给后面的逻辑判断使用。
接下来是binary_sensor的编写
binary_sensor:
- platform: template
name: "Warmed Up" # 自定义名称
id: warmed_up # 自定义id
filters:
- delayed_on: 30s # 变为"on"后,需持续 30 秒才真正生效
on_press: # 当传感器被触发时执行以下操作
- delay: 10s # 触发后延迟 10 秒再执行下一个动作
- switch.turn_off: measuring # 关闭 switch 组件 "measuring"
有了SET引脚的GPIO_SWITCH和辅助的binary_sensor后,只需要编写传感器本体的代码即可
- platform: pmsx003
uart_id: uart_2 # 使用 uart_2 作为串口
type: PMSX003 # 传感器型号为 PMSX003
pm_1_0:
name: "pm1.0" # PM1.0 颗粒物浓度
id: pms_10
accuracy_decimals: 1 # 保留 1 位小数
filters:
- lambda: |- # 仅在传感器预热完成后才返回数据
if (id(warmed_up).state) {
return x;
} else {
return {};
}
- sliding_window_moving_average: # 10 组数据求滑动平均值
window_size: 10
send_every: 1
send_first_at: 1
- debounce: 3s # 3 秒防抖*此处以采样参数PM10为例,其余两个采样值设定逻辑一致
传感器数据采集前进行预热才能够保证数据读取的稳定性,否则数据波动将非常大
图4 未正确设置传感器预热与滤波器

图5 正确设置传感器预热与滤波器
*其中21:00左右的较大波动为油烟等情况导致,非传感器问题
可见正确预热和使用合适的滤波器后,传感器读数稳定性有很大提升。
以上则为全部内容,欢迎交流指教。
评论0
暂时没有评论