1@page humiture 温湿度计 2# 实验介绍 3本章主要介绍温湿度计的实现,本产品板载了温湿度传感器SI7006。该传感器不但能测量温度,还能测量相对湿度。本章我们将向大家介绍如何使用haas1000来读取SI7006数字温湿度传感器,从而得到环境温度和相对湿度等信息,并把从温湿度值显示在OLED模块上。 4开始学习之前我们先看一下显示效果,如下图所示: 5 6 7 8<div align=center> 9 <img src="https://img.alicdn.com/imgextra/i4/O1CN01qZ6L7Z1SxrAPcv9WY_!!6000000002314-2-tps-1200-800.png" style="zoom:50%;" /> 10</div> 11 12# 涉及知识点 13 14- I2C通信原理 15- SI7006光照与接近传感器原理 16- OLED绘图 17 18 19# 开发环境准备 20## 硬件 21 开发用电脑一台 22 HAAS EDU K1 开发板一块 23 USB2TypeC 数据线一根 24 25## 软件 26### AliOS Things开发环境搭建 27 开发环境的搭建请参考 @ref HaaS_EDU_K1_Quick_Start (搭建开发环境章节),其中详细的介绍了AliOS Things 3.3的IDE集成开发环境的搭建流程。 28 29### HaaS EDU K1 DEMO 代码下载 30 HaaS EDU K1 DEMO 的代码下载请参考 @ref HaaS_EDU_K1_Quick_Start (创建工程章节),其中, 31 选择解决方案: 基于教育开发板的示例 32 选择开发板: haaseduk1 board configure 33 34### 代码编译、烧录 35 参考 @ref HaaS_EDU_K1_Quick_Start (3.1 编译工程章节),点击 ✅ 即可完成编译固件。 36 参考 @ref HaaS_EDU_K1_Quick_Start (3.2 烧录镜像章节),点击 "⚡️" 即可完成烧录固件。 37 38 39 40### I2C通信原理 41IIC总线是一种最早由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。它是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。在CPU与被控IC之间、IC与IC之间进行双向传送,高速IIC总线一般可达400kbps以上。 42I2C总线在传送数据过程中共有三种类型信号, 它们分别是:开始信号、结束信号和应答信号。 43开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。 44结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。 45应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为受控单元出现故障。 46波形如下图: 47 48<div align=center> 49 <img src="https://img.alicdn.com/imgextra/i3/O1CN01RChTnX1b9mP4F1JX1_!!6000000003423-2-tps-1007-313.png" style="zoom:50%;" /> 50</div> 51 52### SI7006传感器简介 53 SI7006 是Silicon Lab公司推出的一款相对湿度及温度传感器,其结合了工厂校准湿度和温度传感器元件、模拟-数字转换器,信号处理和一个I2C主机接口。使用业界标准低K电介质聚合物提供了出色的精度和长期稳定性,同时具有低漂移和低滞后。同时其创新的CMOS设计还使其具备很低的功耗。 54特征: 55 56- 相对湿度传感器: 57- ±5%RH(最大)@ 0-80%RH的 58- 温度传感器: 59- ±1.0℃的精确度(最大)@ -10至+ 85°C 60- 0至100%RH的工作范围内 61- 可达-40至+125°C的工作范围 62- 工作电压范围宽(1.9〜3.6V) 63- 低功耗:2.2μW平均功率为3.3V和每秒1个样本 64- I2C主机接口 65- 片上集成加热器 66- 采用3mm x 3mm QFN封装 67- 卓越的长期稳定性 68- 支持工厂校准 69- 在回流和运行寿命的保护 70- 防止污染的灰尘,污垢,日用化工和其它液体 71 72 73应用: 74 75- 资产和货物跟踪 76- 汽车气候控制和去雾 77- 婴儿监视器 78- 持续气道正压通气(CPAP)机 79- 洪水和水检测 80- 煤气,火灾和烟雾探测器 81- 手机/智能手机 82- 工业HVAC / R 83- 笔记本电脑/平板电脑 84- 激光打印机 85- 微环境/数据中心 86- PLC和IO模块 87- 远程遥测装置 88- 平板电脑 89- 测试和测量 90- 恒温/恒湿 91- 通风和空调系统 92- 气象站 93- 风力发电逆变器 94- 挡风玻璃和后视镜系统 95- 无线基站 96- 无线传感器网络 97### OLED绘图 98参考上一章节。 99# 软硬件环境准备 100## 硬件 1011、开发用电脑一台 1022、HaaS EDU K1开发板一个 (开发板内置SI7006传感器) 1033、USB Type-C 数据线一根 104 105# 硬件设计 106在本实验中,SI7006贴片在主板上,中间I2C与MCU通信,原理图如下所示: 107 108<div align=center> 109 <img src="https://img.alicdn.com/imgextra/i1/O1CN01uk6ZEJ27v0xC0hp7D_!!6000000007858-2-tps-810-512.png" style="zoom:50%;" /> 110</div> 111 112EDU SI7006部分原理图 113### 软件设计 114#### 应用代码部分 115文件路径如下: 116solutions/eduk1_demo/k1_apps/humiture/humiture.c 117solutions/eduk1_demo/k1_apps/humiture/humiture.h 118```basic 119 si7006_getTempHumidity(&hump, &temp); 120 sprintf(temp_str, "T:%5.1fC", temp); 121 sprintf(hump_str, "H:%5.1f%%", hump); 122 123 OLED_Icon_Draw(14, 4, &icon_thermometer_24_24, 0); 124 OLED_Icon_Draw(14, 36, &icon_hygrometer_24_24, 0); 125 126 OLED_Icon_Draw(2, 24, &icon_skip_left, 0); 127 OLED_Icon_Draw(122, 24, &icon_skip_right, 0); 128 129 OLED_Show_String(42, 8, temp_str, 16, 1); 130 OLED_Show_String(42, 40, hump_str, 16, 1); 131 132 OLED_Refresh_GRAM(); 133 aos_msleep(500); 134``` 135#### 驱动部分 136文件路径如下: 137components/peripherals/sensor/drv/drv_temp_humi_si_si7006.c 138驱动代码整体主要分为三部分: 139 140- 获取产品ID 141- 获取温度值 142- 获取湿度值 143```basic 144void si7006_getID(uint8_t *id_buf) 145{ 146 uint8_t reg[4] = {Si7006_READ_ID_LOW_0,Si7006_READ_ID_LOW_1,Si7006_READ_ID_HIGH_0,Si7006_READ_ID_HIGH_1}; 147 148 hal_i2c_master_send(&i2c_dev, i2c_dev.config.dev_addr, reg, 2, 1000); 149 aos_msleep(30); 150 hal_i2c_master_recv(&i2c_dev, i2c_dev.config.dev_addr, id_buf, 4, 1000); 151 152 hal_i2c_master_send(&i2c_dev, i2c_dev.config.dev_addr, ®[2], 2, 1000); 153 aos_msleep(30); 154 hal_i2c_master_recv(&i2c_dev, i2c_dev.config.dev_addr, &id_buf[4], 4, 1000); 155 156 return; 157} 158 159bool si7006_getTemperature(float *temperature) 160{ 161 uint8_t reg = Si7006_MEAS_TEMP_NO_MASTER_MODE; 162 uint8_t read_data[2] = {0}; 163 unsigned int value; 164 165 hal_i2c_master_send(&i2c_dev, i2c_dev.config.dev_addr, ®, 1, 1000); 166 aos_msleep(30); 167 hal_i2c_master_recv(&i2c_dev, i2c_dev.config.dev_addr, read_data, 2, 1000); 168 value = (read_data[0] << 8) | read_data[1]; 169 LOGI("APP", "%0x -- %0x -->0x%x\n", read_data[0],read_data[1],value); 170 // A temperature measurement will always return XXXXXX00 in the LSB field. 171 if (value & 0xFFFC) 172 { 173 *temperature = (175.72f * (float)value) / 65536.0f - 46.85f; 174 LOGI("APP", "temperature: %2f \n", *temperature); 175 } 176 else 177 { 178 LOGI("APP", "Error on temp\n"); 179 return 1; 180 } 181 return 0; 182} 183 184/* 185i2c – the i2c device 186dev_addr – device address 187mem_addr – mem address 188mem_addr_size – mem address 189data – i2c master send data 190size – i2c master send data size 191*/ 192bool si7006_getHumidity(float *humidity) 193{ 194 uint8_t reg = Si7006_MEAS_REL_HUMIDITY_NO_MASTER_MODE; 195 uint8_t read_data[3] = {0}; 196 unsigned int value; 197 198 hal_i2c_master_send(&i2c_dev, i2c_dev.config.dev_addr, ®, 1, 1000); 199 200 aos_msleep(30); 201 202 hal_i2c_master_recv(&i2c_dev, i2c_dev.config.dev_addr, read_data, 2, 1000); 203 value = (read_data[0] << 8) | read_data[1]; 204 LOGI("APP", "%0x -- %0x -->0x%x\n", read_data[0],read_data[1],value); 205 if (value & 0xFFFE) 206 { 207 *humidity = ((125.0f * (float)value ) / 65535.0f) - 6.0f; 208 LOGI("APP", "humidity: %f \n", *humidity); 209 } 210 else 211 { 212 LOGI("APP", "Error on humidity\n"); 213 return 1; 214 } 215 return 0; 216} 217 218//get temp and humidity 219void si7006_getTempHumidity(float *humidity, float *temperature) 220{ 221 si7006_getTemperature(temperature); 222 si7006_getHumidity(humidity); 223} 224``` 225 226 227