文章目录
简介: 本文方案在保持原始功能的同时改善了净化强度工作方式,增加滤芯寿命计算功能。可以自动检测空气中有害物质的浓度,根据污染浓度实时自动调节净化强度,还能检测空气净化器滤芯使用情况,计算滤芯使用寿命,提醒更换滤芯等功能。
先附上源码:
[github]: “空气净化器demo”
一. 硬件方案
1. 硬件框图
2. 特性描述
- 主控模块主控模块采用涂鸦自研的WBRU模组,用于控制整机运行,包括按键检测,LED指示,负载控制,数据通讯等工作
- 采用四合一粉尘传感器实时测量输出温湿度、VOC 浓度、PM1.0/PM2.5 /PM10质量浓度
- 蜂鸣器采用压电式无源蜂鸣器,通过模组输出相应频率PWM信号驱动
- 微动开关可以防止误打开滤芯所在后盖
- 光敏传感器可以检测环境光线强度,自动调节显示亮度
- LED可直观显示定时、异常警报等信息
- NFC读卡器可以有效检测滤芯的匹配情况与使用寿命
3. 设计方案
3.1 主控单元
本方案选用一款低功耗WBRU模组作为主控板,并基于该模组进行SoC开发;实现电机控制和传感器数据采集。
3.2 电机控制
空气净化器的风机是由选用稻津的 MI-JK48HM710,控制信号主要由PWM、FG、BRK,控制信号与模组之间通讯需进行电平转换。
3.3 按键与感光传感器
系统有两个按键,主按键: 长按开关机,短按切换不同的工作模式(自动,睡眠,最爱);屏幕按键: 短按切换屏幕和指示灯的状态(PM2.5,PM10,TVOC,温度,湿度,关), 长按进入配网模式。系统中有一个光敏二极管,用于控制夜间光线较暗时显示的亮度。
3.4 显示电路
方案使用一个TM1650驱动IC来驱动一个3位8段数码管和5个模式指示灯。数码管用于显示空气指标,通过屏幕按键控制,分别为PM2.5数据,PM10数据,TVOC数据,温度,湿度。
3.5 NFC驱动
方案使用MFRC522,它是高度集成的非接触式读写卡芯片,可根据不同主机接口实现SPI、串行UART、I2C协议通讯。方案中使用SPI通讯来实现滤芯NFC检测功能(通过NFC判断滤芯工作时间,以及是否更换新滤芯)。
3.6 四合一传感器驱动
AM1002 是一款高性价比的多参数空气质量传感器集成模组,能够实时测量输出温湿度、VOC 浓度、PM1.0/PM2.5 /PM10 质量浓度。
3.7 电源
方案使用 LOWPOWER(微源半导体)的lp6498ab6f输出5V给一些传感器供电,ASM1117由5V转3.3V给模组供电,供电电流不低于150mA。lp6498ab6f的规格如下:最大输入电压4.530V;输出电压范围0.812V。开关频率600KHZ,最大持续电流可达1.2A。
3.8 其他驱动
此外,还有蜂鸣器,UV灯,以及机械微动开关用于仓门检测。
4. 原理图与PCB
二. 整机搭建
1. 实物展示图
三. 嵌入式功能实现
1. 功能需求
**产品功能简述:**有自动、手动、睡眠三种模式,可以通过按键和APP选择切换。其中自动模式会根据环境自动控制风扇转速、UV灯、屏幕灯光等;还可以通过NFC检测滤芯是否安装,并读取滤芯生产信息;同时能够智能计算滤芯寿命。
功能 | 说明 |
---|---|
设备功能 | 1. 主按键: 长按开关机,短按切换不同的工作模式(自动、手动、睡眠)。 2. 屏幕按键: 短按切换屏幕和指示灯的状态(PM2.5,PM10,TVOC,温度,湿度,关), 长按进入配网模式。 3. 显示屏:三位断码屏,显示空气指标,通过屏幕按键控制,分别为PM2.5数据、PM10数据、TVOC数据、温度、湿度。 4. 蜂鸣器:按键音及报警提醒。 5. 如果滤芯仓门是打开的,则设备断电不工作。 6. NFC芯片:每次开机,检测滤芯NFC是否存在,读取滤芯信息并上报。 |
APP功能 | 1. 总开关。 2. 童锁:APP上开启后,设备端按键无法使用。 3. 静音:APP上开启后,设备端按键静音。 4. 定时:APP上设置后,启动定时开关功能。 5. 智能杀菌:需要APP手动开启。 6. 空气指标显示:分别为PM2.5数据、PM10数据、TVOC数据、温度、湿度。 7. 滤芯寿命显示及重置,支持APP手动重置,也支持NFC识别后自动重置。 8. 工作模式:自动模式,手动模式,睡眠模式三种。 自动模式,运行自动模式功能。 手动模式,可以手动设置此模式下的风速档位。 睡眠模式,进入睡眠档位20%风速,屏幕LED灯关闭。 9. 风速档位:睡眠(20%),低(40%),中(70%),高(100%)。 |
智能功能 | 1. 自动模式—风扇自动调节功能。 2. 自动模式—环保功能:当室内空气质量优(0-35)且保持一段时间(2h)时,关闭风扇,以节省能源,如果PM2.5再次超过35,则启动风扇自动调节。 3. 自动模式—睡眠功能:当光线传感器检测到房间已经变暗,设备自动关闭灯光和屏幕。此时如果空气质量优保持一段时间时(30min),则风扇降为最低档位(20%风速)。 4. 智能杀菌功能:温度20°以上,湿度65%以上,且近4h无触发过杀菌(开启UV灯),则开启UV杀菌持续1h。 5. 滤芯NFC检测功能:检测滤芯是否存在,并读取滤芯类别和生产信息,可防盗版。 6. 滤芯寿命智能计算功能:智能计算滤芯的粉尘累计吸附量,得到滤芯剩余寿命,并根据粉尘吸附速度和设备使用频率估算滤芯剩余可用时间。 |
配网功能 | 通用Wi-Fi+BLE配网,长按配网按键重置配网。 |
2. 环境搭建
2.1 开发环境搭建
(1)开发环境搭建可以参考Wi-Fi 模组二次开发教程——1. SoC开发环境搭建。如果已经有虚拟机和乌班图的开发环境可直接跳至4.2 下载编译依赖工具处进行剩余环境搭建。
(2)产品创建可以参考Wi-Fi模组二次开发教程——2. 涂鸦IoT平台介绍。创建产品后,添加产品标准功能DP点和自定义功能DP点。空气净化器DP点如下表。
(3)参考Wi-Fi模组二次开发课程——3. 快速上手来完成代码修改编译、固件上传、获取token、烧录授权和设备配网。
2.2 功能DP点
DP ID | 功能点 | 标识符 | 数据传输类型 | 数据类型 | 功能点属性 |
---|---|---|---|---|---|
1 | 开关 | switch | 可下发可上报 | bool | 无 |
2 | PM2.5 | pm25 | 只上报 | value | 数值范围: 0-700,间距: 1, 倍数: 0,单位: ug/m3 |
3 | 模式 | mode | 可下发可上报 | enum | 枚举值: manual, auto, sleep |
4 | 风速 | fan_speed_enum | 可下发可上报 | enum | 枚举值: sleep, low, mid, high |
5 | 滤芯寿命 | filter_life | 只上报 | value | 数值范围: 0-100,间距: 1, 倍数: 0,单位: % |
7 | 童锁 | child_lock | 可下发可上报 | bool | 无 |
8 | 灯光 | light | 可下发可上报 | bool | 无 |
9 | UV杀菌 | uv | 可下发可上报 | bool | 无 |
11 | 滤芯复位 | filter_reset | 可下发可上报 | bool | 无 |
12 | 室内温度 | temp_indoor | 只上报 | value | 数值范围: -20-50,间距: 1, 倍数: 0,单位: ℃ |
13 | 室内湿度 | humidity | 只上报 | value | 数值范围: 0-100,间距: 1, 倍数: 0,单位: % |
14 | TVOC | tvoc | 只上报 | value | 数值范围: 0-999,间距: 1, 倍数: 0,单位: ug/m3 |
16 | 滤芯剩余天数 | filter_days | 只上报 | value | 数值范围: 0-1000,间距: 1, 倍数: 0,单位: day |
17 | 累计工作时间 | runtime_total | 只上报 | value | 数值范围: 0-5256000,间距: 1, 倍数: 0,单位: min |
18 | 倒计时 | countdown_set | 可下发可上报 | enum | 枚举值: cancel, 1h, 2h, 3h, 4h, 5h |
19 | 倒计时剩余时间 | countdown_left | 只上报 | value | 数值范围: 0-360,间距: 1, 倍数: 0,单位: min |
20 | 累计吸收颗粒 | pm_total | 只上报 | value | 数值范围: 0-10000000,间距: 1, 倍数: 0,单位: mg |
22 | 故障告警 | fault | 只上报 | fault | 故障值: e1, e2 |
23 | 温标切换 | temp_unit_convert | 可下发可上报 | enum | 枚举值: c, f |
101 | PM10 | pm10 | 只上报 | value | 数值范围: 0-999,间距: 1, 倍数: 0,单位: ug/m3 |
102 | 滤芯种类 | filter_type | 只上报 | enum | 枚举值: standard, Antibacterial, Aldehyde_removal, Professional |
103 | 静音 | sound_switch | 可下发可上报 | bool | 无 |
3. 总体设计
3.1 模块划分
对功能需求进行分析梳理后,可将空气净化器demo程序划分为以下八大模块:
No. | 模块 | 处理内容 |
---|---|---|
1 | 外设驱动组件 | 按键、电机、段码显示屏、NFC读卡器、空气质量传感器等驱动程序 |
2 | 设备基础服务 | 设备开关、状态处理、模式切换、本地定时等 |
3 | 显示处理服务 | 段码液晶屏显示空气指标数据、LED灯指示段码屏显示的空气指标内容 |
4 | 环境检测服务 | 检测空气质量环境、光线亮暗情况 |
5 | 数据计算处理 | 自动风扇转速算法滤芯寿命和粉尘吸附量的计算和存储、滤芯NFC数据解析 |
6 | 用户事件处理 | 按键事件检测和处理、仓门开关事件检测和处理 |
7 | 定时事件处理 | 各定时事件的判断和处理 |
8 | 联网相关处理 | 配网相关处理、数据上报与接收处理、云端时间获取 |
3.2 代码结构
tuya_air_cleaner_demo
├── platform /* 涂鸦通用 Tuya IoTOS SDK 的开发编译环境和工具链 */
├── sdk /* 存放涂鸦通用 Tuya IoTOS SDK 的头文件和库文件 */
└── app /* 存放涂鸦通用 Tuya IoTOS SDK 的 demo */
├── src /* 源文件目录 */
│ ├── common
│ │ ├── tuya_device.c /* 应用层入口 */
│ │ ├── tuya_dp_process.c /* DP上下发处理 */
│ │ ├── tuya_iot_funtion.c /* 连接IOT云 */
│ │ └── tuya_key_funtion.c /* 按键处理 */
│ ├── driver
│ │ ├── mfrc522
│ │ │ ├── tuya_mfrc522_app.c /* NFC芯片mfrc522中间层驱动 */
│ │ │ └── tuya_mfrc522.c /* NFC芯片mfrc522驱动 */
│ │ ├── tm1650
│ │ │ ├── soc_i2c.c /* 软件I2C模拟驱动 */
│ │ │ ├── tm1650_app.c /* 液晶显示屏芯片tm1650中间层驱动 */
│ │ │ └── tm1650.c /* 液晶显示屏芯片tm1650驱动 */
│ │ ├── tuya_buz_driver.c /* 蜂鸣器驱动 */
│ │ ├── tuya_hardware_driver.c /* 硬件GPIO驱动 */
│ │ ├── tuya_lcd_display.c /* 液晶屏应用层驱动 */
│ │ └── tuya_motor_driver.c /* 风扇电机驱动 */
│ └── function
│ ├── tuya_air_quality_funtion.c /* 空气质量获取和显示功能 */
│ ├── tuya_automatic_mode_funtion.c /* 自动模式相关功能 */
│ ├── tuya_countdown_funtion.c /* 倒计时功能 */
│ ├── tuya_filter_funtion.c /* 滤芯寿命相关功能 */
│ ├── tuya_mode_funtion.c /* 模式切换相关功能 */
│ ├── tuya_nfc_funtion.c /* 滤芯NFC检测相关功能 */
│ └── tuya_timer_funtion.c /* Timer相关功能 */
└── include
├── common
│ ├── tuya_device.h
│ ├── tuya_dp_process.h
│ ├── tuya_iot_funtion.h
│ └── tuya_key_funtion.h
├── driver
│ ├── mfrc522
│ │ ├── tuya_mfrc522_app.h
│ │ └── tuya_mfrc522.h
│ ├── tm1650
│ │ ├── soc_i2c.h
│ │ ├── tm1650_app.h
│ │ └── tm1650.h
│ ├── tuya_buz_driver.h
│ ├── tuya_hardware_driver.h
│ ├── tuya_lcd_display.h
│ └── tuya_motor_driver.h
└── function
├── tuya_air_quality_funtion.h
├── tuya_automatic_mode_funtion.h
├── tuya_countdown_funtion.h
├── tuya_filter_funtion.h
├── tuya_mode_funtion.h
├── tuya_nfc_funtion.h
└── tuya_timer_funtion.h
3.3 应用框架
下图所示为基于 Tuya Wi-Fi SDK 的应用框架:
-
Platform:所使用的芯片平台,芯片 + 协议栈由芯片公司维护。
-
Port:Tuya Wi-Fi SDK 所需要的抽象接口,需要用户根据具体的芯片平台移植实现。
-
Tuya Wi-Fi SDK : 封装了涂鸦 Wi-Fi 通信协议,提供构建涂鸦 Wi-Fi 应用所需的服务接口。
-
Application:基于Tuya Wi-Fi SDK 构建的应用。
-
Tuya SDK API:API用于设备实现Wi-Fi相关的管理、通信等,API的调用将采用基于消息的异步机制,API的执行结果将会以 Message 或者 Call back 的方式通知给设备的 Application。
-
SDK Config:Tuya Wi-Fi SDK 可裁剪可配置,通过配置文件中的宏定义可将 Tuya Wi-Fi SDK 设置成不同模式,例如配置成适用于多协议设备的通用配网模式、单模配网模式、是否使用 OS 等。
-
Main Process:为 Tuya SDK API 的主引擎,Application 需要一直调用,如果 Platform 架构是带OS的,Tuya Wi-Fi SDK 会基于 Port 层提供的OS相关接口自动创建一个任务用于执行Main Process,如果是非OS平台,需要设备 Application 循环调用。
-
Message or Call back:SDK 通过 Message 或者设备 Application注册的 Call back 函数向设备 Application 发送数据(状态、数据等)。
3.4 驱动软件模块
3.5 方案流程图
(1)模式选择功能流程图:
(2)按键功能流程图
(3)滤芯检测流程图
4. 功能实现
4.1 外设驱动
4.1.1 段码液晶屏
段码液晶屏由 3 * 8 断码屏和 5 个指示灯构成,分别对应PM2.5,PM10,TVOC,温度,湿度。
其中外挂驱动芯片 TM1650,I2C 通信,本文demo中使用 2 * GPIO 模拟 I2C 。
段码液晶屏部分代码:
/**
* @brief: tuya_lcd_show_num
* @desc: show num on lcd
* @param[in] number:-99<number<999
* @return OPERATE_RET OPRT_OK is sucess, other is fail
*/
OPERATE_RET tuya_lcd_show_num(IN INT_T number)
{
OPERATE_RET op_ret = OPRT_OK;
MINUS_FLAG_E minus_flag = MINUS_NULL;
UCHAR_T i = 0;
UCHAR_T bit[3];
if (number > MAX_NUM) {
number = MAX_NUM;
}
if (number < MIN_NUM) {
number = MIN_NUM;
}
if (number < 0) {
if (number > -10) {
//-10<number<0
minus_flag = MINUS_TEN;
} else {
//-100<number<-10
minus_flag = MINUS_HUNDRED;
}
number = number * (-1);
}
bit[0] = number / 100 % 10; //hundred
bit[1] = number / 10 % 10; //ten
bit[2] = number %