鸿蒙WiFi IoT卡发套件中包含了可燃气体MQ-2及温湿度传感器AHT20,本文将介绍基于鸿蒙系统去驱动这两种传感器并读取数据。
1 可燃气体传感器MQ-2
1.1 MQ-2简介
MQ-2气体传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡(SnO2)。当传感器所处环境中存在可燃气体时,传感器的电导率随空气中可燃气体浓度的增加而增大。其技术参数如下表所示。
下面第一幅图是MQ-2的测试电路,所用负载(RL)为4.7KΩ。第二幅图是传感器在不同浓度甲烷中所对应的VRL值。图中所有测试都是在标准试验条件下完成的。
使用简单的电路即可将电导率的变化转换为与该气体浓度相对应的输出信号,输出信号为模拟信号,需要使用ADC将其转换为数字信号。开发板电路如下所示,所用负载为1KΩ。
2 温湿度传感器AHT20
2.1 AHT20简介
AHT20是国内奥松设计的MEMS温湿度传感器,ADC位数为20Bit,具有体积小、精度高、成本低等优点。相对湿度精度RH=±2%,温度精度T=±0.3°C。相对湿度测量范围RH=0~100%,温度测量范围T=-40~85°C,AHT20其他性能参数见下表。
2.2 AHT20通讯
AHT20采用标准的I2C协议进行通讯。AHT20上电后传感器最多需要20ms时间(此时SCL为高电平)以达到空闲状态即做好准备接收由主机(MCU)发送的命令。
1)发送命令
启动传输后,随后传输的I2C首字节包括7位的I2C设备地址0x38和一个SDA方向位x(读R:‘1’,写W:‘0’)。在第8个SCL时钟下降沿之后,通过拉低SDA引脚(ACK位),指示传感器数据接收正常。在发出初始化命令之后(‘1011’1110')代表初始化,‘1010’1100’代表温湿度测量),MCU必须等到测量完成。基本命令如下表所示。
下表为从机返回的状态位说明。
2)AHT20读取流程
a.上电后等待40ms,读取温湿度值之前,首先要看状态字的校准使能位Bit[3]是否为1(通过发送0x71可以获取一个字节的状态字),如果不为1,要发送0xBE命令(初始化),此命令参数有两个字节,第一个字节为0x08,第二个字节为0x00。
b.直接发送0xAC命令(触发测量),此命令参数有两个字节,第一个字节为0x33,第二个字节为0x00。I2C读取流程如下图所示。
说明:在第一步的校准状态检验只需要上电时检查,在正常过程无需操作。
c.等待75ms待测量完成,忙状态Bit[7]为0,然后可以读取六个字节(发0X71即可以读取)。
d.计算温湿度值。
相对湿度RH结果以%RH表示:
温度T以温度℃表示:
注:传感器在采集时需要时间,主机发出测量指令(0xAC)后,延时75毫秒以上再读取转换后的数据并判断返回的状态位是否正常。若状态比特位[Bit7]为0代表数据可正常读取,为1时传感器为忙状态,主机需要等待数据处理完成。
3)软复位
软复位命令用于在无需关闭和再次打开电源的情况下,重新启动传感器系统。在接收到这个命令之后,传感器系统开始重新初始化,并恢复默认设置状态,软复位所需时间不超过20毫秒。
3 代码实现
1)首先在applications/sample/wifi-iot/app下建立sensor文件夹,然后在applications/sample/wifi-iot/app/sensor下建立CGsensor .c(可燃气体传感器MQ-2驱动)、THsensor.h(温湿度传感器AHT20驱动)、sensor.h(头文件)、BUILD.gn(编译脚本)四个文件。
2)AHT20采用I2C驱动,所以在编写驱动代码前要使能I2C。找到vender/hisi/hi3861/hi3861/app/wifiiot_app/init/app_io_init.c文件,修改I2C引脚定义,板卡上 引脚是GPIO13(I2C0_SDA)和GPIO14(I2C0_SCL),所以将I2C引脚修改如下。
然后再找到vendor/hisi/hi3861/hi3861/build/config/usr_config.mk文件,添加"CONFIG_I2C_SUPPORT=y",使能I2C功能,类似宏使能。至此3861可以使用I2C功能了。
3)对于MQ-2,需要将引脚复用为ADC,然后用hi_adc_read()函数即可读取数据。- hi_io_set_func(HI_IO_NAME_GPIO_11, HI_IO_FUNC_GPIO_11_GPIO); /* ADC5 */
- hi_gpio_set_dir(HI_GPIO_IDX_11, HI_GPIO_DIR_IN);
复制代码 4)对于AHT20,首先要编写I2C读写函数,其他功能函数有
hi_u32 AHT20_Calibrate(void) ------ 获取AHT20 状态字
hi_u32 AHT20_CalibrateCommand(void) ------ AHT20 初始化校准
hi_u32 AHT20_ResetCommand(void) ------ AHT20 软起动
hi_u32 AHT20_StartMeasure(void) ------ AHT20 触发测量
hi_u32 AHT20_GetMeasureResult(float* temp, float* humi) ------ 接收测量值并整理
说明:3)和 4)中的代码见附件。
5)applications/sample/wifi-iot/app/sensor/BUILD.gn代码如下。
- static_library("sensor") {
- sources = [
- "THsensor.c",
- "CGsensor.c",
- ]
- include_dirs = [
- "//utils/native/lite/include",
- "//kernel/liteos_m/components/cmsis/2.0",
- "//base/iot_hardware/interfaces/kits/wifiiot_lite",
- ]
- }
复制代码 6)applications/sample/wifi-iot/app/BUILD.gn稍作修改即可,如下所示。- import("//build/lite/config/component/lite_component.gni")
- lite_component("app") {
- features = [
- "sensor:sensor",
- ]
- }
复制代码 7)输出数据