实验介绍
本章主要介绍温湿度计的实现,本产品板载了温湿度传感器SI7006。该传感器不但能测量温度,还能测量相对湿度。本章我们将向大家介绍如何使用haas1000来读取SI7006数字温湿度传感器,从而得到环境温度和相对湿度等信息,并把从温湿度值显示在OLED模块上。
开始学习之前我们先看一下显示效果,如下图所示:
涉及知识点
I2C通信原理SI7006光照与接近传感器原理OLED绘图**开发环境准备
硬件**
1,开发用电脑一台 2,HAAS EDU K1 开发板一块 3,USB2TypeC 数据线一根
软件
AliOS Things开发环境搭建
1,开发环境的搭建请参考 @ref HaaS_EDU_K1_Quick_Start (搭建开发环境章节),其中详细的介绍了AliOS Things 3.3的IDE集成开发环境的搭建流程。
HaaS EDU K1 DEMO 代码下载
1,HaaS EDU K1 DEMO 的代码下载请参考 @ref HaaS_EDU_K1_Quick_Start (创建工程章节),其中, 2,选择解决方案: 基于教育开发板的示例 3,选择开发板: haaseduk1 board configure
代码编译、烧录
1,参考 @ref HaaS_EDU_K1_Quick_Start (3.1 编译工程章节),点击 ? 即可完成编译固件。 2,参考 @ref HaaS_EDU_K1_Quick_Start (3.2 烧录镜像章节),点击 "??" 即可完成烧录固件。
I2C通信原理
IIC总线是一种最早由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。它是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。在CPU与被控IC之间、IC与IC之间进行双向传送,高速IIC总线一般可达400kbps以上。
I2C总线在传送数据过程中共有三种类型信号, 它们分别是:开始信号、结束信号和应答信号。
开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。
结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。
应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为受控单元出现故障。
波形如下图:
SI7006传感器简介
SI7006 是Silicon Lab公司推出的一款相对湿度及温度传感器,其结合了工厂校准湿度和温度传感器元件、模拟-数字转换器,信号处理和一个I2C主机接口。使用业界标准低K电介质聚合物提供了出色的精度和长期稳定性,同时具有低漂移和低滞后。同时其创新的CMOS设计还使其具备很低的功耗。
特征:
应用:
资产和货物跟踪汽车气候控制和去雾婴儿监视器持续气道正压通气(CPAP)机洪水和水检测煤气,火灾和烟雾探测器手机/智能手机工业HVAC / R笔记本电脑/平板电脑激光打印机微环境/数据中心PLC和IO模块远程遥测装置平板电脑测试和测量恒温/恒湿通风和空调系统气象站风力发电逆变器挡风玻璃和后视镜系统无线基站无线传感器网络OLED绘图
参考上一章节
**软硬件环境准备
硬件**
1、开发用电脑一台 2、HaaS EDU K1开发板一个 (开发板内置SI7006传感器) 3、USB Type-C 数据线一根
硬件设计
在本实验中,SI7006贴片在主板上,中间I2C与MCU通信,原理图如下所示:
EDU SI7006部分原理图
软件设计
应用代码部分
文件路径如下:
solutions/eduk1_demo/k1_apps/humiture/humiture.c
solutions/eduk1_demo/k1_apps/humiture/humiture.h
si7006_getTempHumidity( hump, temp); sprintf(temp_str, "T:%5.1fC", temp); sprintf(hump_str, "H:%5.1f%%", hump); OLED_Icon_Draw(14, 4, icon_thermometer_24_24, 0); OLED_Icon_Draw(14, 36, icon_hygrometer_24_24, 0); OLED_Icon_Draw(2, 24, icon_skip_left, 0); OLED_Icon_Draw(122, 24, icon_skip_right, 0); OLED_Show_String(42, 8, temp_str, 16, 1); OLED_Show_String(42, 40, hump_str, 16, 1); OLED_Refresh_GRAM(); aos_msleep(500);
驱动部分
文件路径如下:
components/peripherals/sensor/drv/drv_temp_humi_si_si7006.c
驱动代码整体主要分为三部分:
void si7006_getID(uint8_t *id_buf)
{
uint8_t reg[4] = {Si7006_READ_ID_LOW_0,Si7006_READ_ID_LOW_1,Si7006_READ_ID_HIGH_0,Si7006_READ_ID_HIGH_1}; hal_i2c_master_send( i2c_dev, i2c_dev.config.dev_addr, reg, 2, 1000); aos_msleep(30); hal_i2c_master_recv( i2c_dev, i2c_dev.config.dev_addr, id_buf, 4, 1000); hal_i2c_master_send( i2c_dev, i2c_dev.config.dev_addr, reg[2], 2, 1000); aos_msleep(30); hal_i2c_master_recv( i2c_dev, i2c_dev.config.dev_addr, id_buf[4], 4, 1000); return;
}
bool si7006_getTemperature(float *temperature)
{
uint8_t reg = Si7006_MEAS_TEMP_NO_MASTER_MODE; uint8_t read_data[2] = {0}; unsigned int value; hal_i2c_master_send( i2c_dev, i2c_dev.config.dev_addr, reg, 1, 1000); aos_msleep(30); hal_i2c_master_recv( i2c_dev, i2c_dev.config.dev_addr, read_data, 2, 1000); value = (read_data[0] 8) | read_data[1]; LOGI("APP", "%0x -- %0x -- 0x%x\n", read_data[0],read_data[1],value); // A temperature measurement will always return XXXXXX00 in the LSB field. if (value 0xFFFC) *temperature = (175.72f * (float)value) / 65536.0f - 46.85f; LOGI("APP", "temperature: %2f \n", *temperature); LOGI("APP", "Error on temp\n"); return 1; return 0;
}
/*
i2c – the i2c device
dev_addr – device address
mem_addr – mem address
mem_addr_size – mem address
data – i2c master send data
size – i2c master send data size
*/
bool si7006_getHumidity(float *humidity)
{
uint8_t reg = Si7006_MEAS_REL_HUMIDITY_NO_MASTER_MODE; uint8_t read_data[3] = {0}; unsigned int value; hal_i2c_master_send( i2c_dev, i2c_dev.config.dev_addr, reg, 1, 1000); aos_msleep(30); hal_i2c_master_recv( i2c_dev, i2c_dev.config.dev_addr, read_data, 2, 1000); value = (read_data[0] 8) | read_data[1]; LOGI("APP", "%0x -- %0x -- 0x%x\n", read_data[0],read_data[1],value); if (value 0xFFFE) *humidity = ((125.0f * (float)value ) / 65535.0f) - 6.0f; LOGI("APP", "humidity: %f \n", *humidity); LOGI("APP", "Error on humidity\n"); return 1; return 0;
}
//get temp and humidity
void si7006_getTempHumidity(float humidity, float temperature)
{
si7006_getTemperature(temperature); si7006_getHumidity(humidity);
}
开发者支持
HaaS官方:https://haas.iot.aliyun.com/
HaaS技术社区:https://blog.csdn.net/HaaSTech
开发者钉钉群和公众号见下图,开发者钉钉群每天都有技术支持同学值班。
溢价 域名 的续费价格如何?通常来说,因为溢价域名的价值高于普通域名,所以溢...
在Python开发过程中,我们难免会遇到多重条件判断的情况的情况,此时除了用很多...
TIOBE 公布了 2021 年 3 月的编程语言排行榜。 本月 TIOBE 指数没有什么有趣的变...
本文转载自微信公众号「bugstack虫洞栈」,作者小傅哥 。转载本文请联系bugstack...
本文转载自公众号读芯术(ID:AI_Discovery)。 这一刻你正在应对什么挑战?这位前...
想了解更多内容,请访问: 51CTO和华为官方战略合作共建的鸿蒙技术社区 https://...
前言 统计科学家使用交互式的统计工具(比如R)来回答数据中的问题,获得全景的认...
基本介绍 给定 n 个权值作为 n 个叶子节点,构造一颗二叉树,若该树的带权路径长...
近几年,互联网行业蓬勃发展,在互联网浪潮的冲击下,互联网创业已成为一种比较...
背景 我们知道 如果在Kubernetes中支持GPU设备调度 需要做如下的工作 节点上安装...