前面帖子已经提到开发板集成了Si7021温湿度传感器,该传感器采用IIC的接口与MCU通信,通过官方的数据手册,我们可以了解这款传感器的封装、特性,以及详细的通信协议。几处重要的信息点分享如下:
Si7021传感器在EFM32PG22开发板上的电路连线可参考电路原理图
同理可知,Si7021与前面分享的环境光传感器(VEML6035)与霍尔效应传感器(Si7210)都是连接在IIC总线上,SDA连接PD02管脚,SCL连接PD03管脚,使能管脚为PC06。在“Simplicity Studio IDE”中,创建一个RTOS基本工程,这里采用上期模板,只需安装对应的配置接口即可。
完成上述组件的搭建后,然后在任务处理源文件中包含Si7021传感器的头文件
此时打开“sl_si70xx.h”文件,则会发现,官方已经给出了参考示例,用户只需将参考示例函数放在任务处理函数中被调用即可。
将采集的Data值使用浮点的数据类型打印输出,然后编译、下载,打开串口调试助手,然后将手指轻放在Si7021传感器上面,可以清晰得看到温度、湿度值都会相应地增大;移开手指,则温度、湿度值都会缓慢恢复室内温湿度值。由此可见,开发板上的Si7021传感器很灵敏,采集的数据很精确。
#include <stdio.h>
#include "FreeRTOS.h"
#include "task.h"
#include "sl_i2cspm.h"
#include "em_cmu.h"
#include "sl_i2cspm_sensor_config.h"
#include "sl_veml6035.h"
#include "sl_si7210.h"
#include "sl_si70xx.h"
#ifndef TOOGLE_DELAY_MS
#define TOOGLE_DELAY_MS 25
#endif
#ifndef Envir_Hall_STACK_SIZE
#define Envir_Hall_STACK_SIZE configMINIMAL_STACK_SIZE
#endif
#ifndef EXAMPLE_USE_STATIC_ALLOCATION
#define EXAMPLE_USE_STATIC_ALLOCATION 0
#endif
static void Envir_Hall_test_task(void *arg);
sl_i2cspm_t *sl_i2cspm_sensor = SL_I2CSPM_SENSOR_PERIPHERAL;
void Envir_Hall_test_init(void)
{
TaskHandle_t xHandle = NULL;
BaseType_t xReturned = pdFAIL;
#if (EXAMPLE_USE_STATIC_ALLOCATION == 1)
static StaticTask_t xTaskBuffer;
static StackType_t xStack[Envir_Hall_STACK_SIZE];
#else
xReturned = xTaskCreate(Envir_Hall_test_task,
"Envir_Hall_test task",
Envir_Hall_STACK_SIZE,
( void * ) NULL,
tskIDLE_PRIORITY + 4,
&xHandle);
EFM_ASSERT(xReturned == pdPASS);
#endif
}
static void Envir_Hall_test_task(void *arg)
{
int32_t temp_data; //温度值
uint32_t rh_data; //湿度值
uint8_t fw_data;
(void)&arg;
sl_si70xx_init(sl_i2cspm_sensor,SI7021_ADDR);
sl_si70xx_get_firmware_revision(sl_i2cspm_sensor,SI7021_ADDR,&fw_data);
printf("si7021's FW Version:%d\r\n",fw_data);
while(1)
{
sl_si70xx_measure_rh_and_temp(sl_i2cspm_sensor,SI7021_ADDR,&rh_data,&temp_data);
printf("\n");
printf("hum=%f tem=%f\r\n",rh_data/1000.0,temp_data/1000.0);
}
}
本帖最后由 yin_wu_qing 于 2021-9-6 09:50 编辑
看来操作还是挺方便的!