本文代码
感谢主办方提供这次机会。
一、主要功能描述
1.测量四种环境参数:温度、湿度、光照亮度和空气污浊度;
2. 测得的环境参数可以在本地和云端同步显示;
3. 可以通过控制继电器的吸合/断开来本地或云端启动对应环境调节设备。自动模式下,环境参数超出阈值后继电器能够自动吸合,低于阈值时自动断开;
4. 可以本地或云端调整4个环境阈值参数,云端切换环境调节设备继电器自动模式或手动模式;
二、方案设计
1.硬件部分
**硬件的核心部分是本次大赛的CH32V307开发板。这块板子上包括了实现本地设备的部分必要硬件模块:LCD(ST7789)、ESP8266以及三个用户功能按键和若干个LED。
三个用户按键的组合实现本地对环境参数阈值的调节。每个按键按下时,有一个对应的LED亮起表示操作按键按下操作成功。
除开发板自带硬件模块外,额外需要HDC1080温湿度模块、MQ-125空气质量检测模块以及光照模块。
HDC1080是集成温度传感器的数字湿度传感器,它通过IIC与MCU通信,具有以下特点:
出色的测量精度——14位测量分辨率,相对湿度精度为±2%,温度精度为±0.2°C
超低的功耗——工作时平均电流在0.7-1.3uA
较高的电压兼容性——2.7V至5.5V供电,不需要额外设置电平转换控制芯片
应用广泛——应用在温度监测控制系统、医疗设备、大型家用电器和手测计量表等领域。
MQ-125空气质量检测模块和光照模块通过ADC引脚将检测信息输出至MCU。
2. 软件部分。
**软件部分根据功能逻辑设计3个任务。
1)任务一:按键任务
负责接收用户按键输入,根据用户输入情况及当前状态对有关数据作出改变,并更新显示、通知MQTT任务将有变化的数据上报到云端。
高优先级(1)——要求实时性
2)任务二:传感器任务
负责采集各传感器测量结果,如果结果有变动,则更新本地LCD显示,并通知MQTT任务
次高优先级(2)——保证IIC通信可靠性
3)任务三:MQTT任务
负责将本地传感器或用户操作的结果上报到云端
负责将用户云端操作的结果下发到设备端
低优先级(4)——要求可靠性
4)任务间同步与通信设计
按键任务和传感器任务作出数据改变的时间不确定,且两个任务与MQTT任务速度不匹配—使用计数信号量同步。
按键任务和传感器任务作出的数据改变需要传递给上报任务,并进行缓存,防止漏报——使用chr_fifo(字符型环形缓冲区)通信 。
向云端上报的数据共有13种,传感器测量数据4种、对应自动调节阈值4种、对应开关状态4种,自动控制模式1种。 按键任务和传感器任务在对这些数据每作出一次更新,对信号作一次post操作,并将数据种类标志符(0-13)压入消息队列(即chr_fifo字符型环形缓冲区)。MQTT任务中在等待到信号后,从消息队列中取出对应的标识符,根据标识符选择对应的参数值进行发布。
从云端下发的数据有9种,除不包含传感器测量的4种(0-3)数据外,与上报数据完全相同。MQTT任务接收到下发消息后,进行解析,如果是这9种数据中的一种,则对更新本地数据,本地设备作出反应。
5)硬件初始化问题
由于外设速度普遍慢于MCU速度,硬件初始化过程中,往往需要MCU等待硬件完成操作。而这个等待过程一旦CPU被别的任务抢占,则会造成硬件的初始化失败。当然可以通过中断机制写出更好的初始化驱动程序,但门槛高难度大。因此采用任务间同步机制在硬件初始化过程中强制其余任务等待来解决这一问题。
在笔者此次开发过程中,遇到的硬件初始化失败为LCD初始化失败,LCD无法正常工作。在主函数中初始化一个信号量sem_lcd_init,保证LCD初始化不被打断。LCD初始化在按键任务中完成,LCD初始化完成后, 按键任务会给sem_lcd_init连续post两个信号,指示另外2个任务开始执行。另外2个任务会在任务开始等待sem_lcd_init这个信号,保证在LCD初始化完成前不占用CPU来执行自身任务代码。
功能演示视频:视频太大,这里发布不上,可直接看微云
视频链接:https://share.weiyun.com/9dPyLfok
视频中LCD字迹显示模糊,补充几张图片
代码微云链接https://share.weiyun.com/1TSjx4hu