11 HAL库的硬件I2C驱动SI7006和AP3216C

news2024/11/29 20:39:46

引言: 本片文章想给大家分享一下使用HAL库驱动SI7006和AP3216C, 这两款常见的芯片的手册会在文章的末尾提供给大家。

一、SI7006和AP3216C简介


  • SI7006

SI7006是一款数字湿度和温度传感器,由Silicon Labs(全称Silicon Laboratories Inc.)生产。SI7006使用了集成式微控制器和感测技术,可以准确测量环境中的温度和湿度。

SI7006的主要特点包括:

1. 温湿度测量:SI7006可以同时测量环境的温度和湿度。其温度测量范围为-40°C至+125°C,湿度测量范围为0%至100%相对湿度。

2. 高精确度:SI7006具有高精度的温湿度测量能力,其温度测量精度为±0.4°C,湿度测量精度为±3%RH。

3. 数字输出:SI7006将温湿度测量结果以数字形式输出,使用标准的I2C(Inter-Integrated Circuit)总线接口进行通信。这种数字输出形式方便了传感器与微控制器或其他数字系统的集成和数据处理。

4. 低功耗:SI7006采用低功耗设计,使其适用于电池供电或节能型应用场景。在测量时,SI7006的工作电流非常低,一般在200μA以下。

5. 低失真滤波:SI7006内置了低失真数字滤波器,可以减少测量结果的噪声和变化。

6. 温度传感器补偿:SI7006内部集成了温度传感器补偿功能,可以通过检测温度对湿度进行修正,提高测量精度。

总之,SI7006是一款高精度、数字输出的温湿度传感器,适用于多种应用场景,如气象观测、室内环境监测、自动控制系统等。它具有低功耗、高精确度和方便集成的特点,可以提供准确可靠的环境温湿度测量数据。

  • AP3216C

AP3216C是一款集成式环境光和接近传感器,由AMS(Austriamicrosystems)公司生产。AP3216C可以用于测量环境光强度和检测物体的接近距离。

AP3216C的主要特点包括:

1. 环境光测量:AP3216C可以测量环境中的光照强度。它采用红外LED发射器和光敏电阻来实现对光照强度的感测。通过调整集成电路中的工作模式和增益,能够适应不同的光照条件。

2. 接近传感器:AP3216C还内置了接近传感器,可以检测物体与传感器之间的距离。它使用红外LED发射器和接收器之间的反射光信号来判断物体的接近情况。

3. 数字输出:AP3216C的测量结果以数字形式输出,使用标准的I2C总线接口进行通信。这种数字输出形式方便了传感器与微控制器或其他数字系统的集成和数据处理。

4. 低功耗:AP3216C采用低功耗设计,适合电池供电或节能型应用场景。在测量时,AP3216C的工作电流较低,一般在100μA左右。

5. 环境适应性:AP3216C采用了自适应环境补偿技术,能够自动调整测量范围和增益,提高测量精度和稳定性。

6. 多种光照模式:AP3216C支持多种光照模式,如主动模式和待机模式,可以根据实际需求选择不同的模式进行工作。

总之,AP3216C是一款集成式环境光和接近传感器,具有测量环境光强度和检测物体接近距离的功能。它具有数字输出、低功耗和自适应环境补偿等特点,适用于各种光照环境和接近检测应用场景,如智能手机、平板电脑、智能家居等。

二、硬件接线


三、代码实现


  • 读取温湿度信息
#ifndef Si7006_H
#define Si7006_H

#define Si7006_SLAVE_ADDR (0x80)     //最低位默认是主机发送
#define BUS_READ (0X01)
#define BUS_WRITE (0x00)

#define READ_TEMP (0xE3)
#define READ_HUMIDITY (0xE5)
#define SI7006_RESET (0xFE)

extern void Si7006_Init(void);
extern void 

#endif
#include "Si7006.h"

extern I2C_HandleTypeDef hi2c1             //Cubemx自动帮我们生成的
void Si7006_Init(void)
{
    //01 初始化i2c通道
    HAL_I2C_Init(&hi2c1);
    //02 发送复位指令给Si7006
    Si7006_WriteByte(SI7006_RESET);
    //03 延时一会
    HAL_Delay(50);
}

uint8_t Si7006_WriteByte(uint8_t data)
{
    uint8_t temp_buf = data;
    HAL_StatusTypeDef flag;
    //01 调用hal库的i2c发送函数将设备的地址发送出去
   flag = HAL_I2C_Master_Transmit(&hi2c1, Si7006_SLAVE_ADDR|BUS_WRITE, &temp_buf, sizeof(temp_buf), 300);
   if(flag != HAL_OK)
   {
        Error_Handler();
   }

    //02 等待数据发送完成
    while(HAL_I2C_GetState(&hi2c1) != HAL_I2C_STATE_READY);
    return 0;
}

uint16_t Si7006_Read_HalfWord(uint8_t reg)
{
    uint16_t read_data = 0;
    HAL_StatusTypeDef flag;

    //01 发送从机地址和需要写的数据
    flag = HAL_I2C_Master_Transmit(&hi2c1, Si7006_SLAVE_ADDR|BUS_WRITE, &reg, sizeof(reg), 300);
    if(flag != HAL_OK)
    {
        Error_Handler();
    }

    while(HAL_I2C_GetState(&hi2c1) != HAL_I2C_STATE_READY);

    //需要改变数据的传输方向
    if(HAL_I2C_Master_Receive(&hi2c1, SI7006_ADDR | SI7006_R , (uint8_t*)&read_data, 2,300) != HAL_OK)
    {
        Error_Handler();
    }

    return read_data;
}

//进行高低字节的转换
void Real_Read_Data(uint8_t cmd)
{
    uint16_t data = 0, low_data = 0, high_data = 0;

    data = Si7006_Read_HalfWord(cmd);
    low_data = data & 0xff;
    high_data = (data >> 8) & 0xff;
    data = (low_data << 8) + high_data;

    return data;
}

void read_temp_humi_test(void)
{
    uint16_t tem, humi;
    
    tem = Real_Read_Data(READ_TEMP);
    humi = Real_Read_Data(READ_HUMIDITY);

    //按照手册提供的公式对数据进行转换
    tem = ((17572*tem)/65536 - 4685);
	hum = (125*hum/65536 - 6);
	tem_1 = tem/100;
	tem_2 = tem%100;
	printf("\r hum = %d%% \n", hum);
	printf("\r tem = %d.%d\n", tem_1,tem_2);
}


/*将printf的输出从定向到屏幕*/
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
PUTCHAR_PROTOTYPE
{
	HAL_UART_Transmit(&huart4,(uint8_t*)&ch,1,HAL_MAX_DELAY);
	return ch;
}
#endif

  • 读取光照强度
/*
 * ap3216c.h
 *
 *  Created on: Dec 28, 2023
 *      Author: 哈西好多
 */

#ifndef INC_AP3216C_H_
#define INC_AP3216C_H_

#include "main.h"

#define AP3216_ADDR (0x3C)
#define AP3216_W (0x00)
#define AP3216_R (0x01)

/**************** System Register ****************/
#define SYS_CONFIG_ADDR (0x00) // System Configuration, Default:0x00,Bits[2:0],System Mode
#define SYS_ALS_ACT (0x01) // 0x01: ALS function active
#define SYS_SW_RESET (0x04) // 0x04: SW reset
#define ALS_DATA_LOW (0x0C) // Bits[7:0](RO) ALS lower byte of ADC OUTPUT
#define ALS_DATA_HIGH (0x0D) // Bits[7:0](RO) ALS Higher byte of ADC OUTPUT

extern uint8_t AP3216_Init(void);
extern uint8_t AP3216_WriteOneByte(uint8_t reg, uint8_t data);
extern uint8_t AP3216_ReadOneByte(uint8_t reg);
extern uint16_t AP3216_Read_ALS_Data();

#endif

/*
I2C驱动ap216c模块读取环境的光照信息
*/
uint8_t AP3216_Init(void)
{
	uint8_t ret_value = 0;
	AP3216_WriteOneByte(SYS_CONFIG_ADDR, SYS_SW_RESET);
	HAL_Delay(50);
	AP3216_WriteOneByte(SYS_CONFIG_ADDR, SYS_ALS_ACT);
	HAL_Delay(50);
	ret_value = AP3216_ReadOneByte(SYS_CONFIG_ADDR);

	if(ret_value != SYS_ALS_ACT)
	{
		printf("read error \n");
	}

	printf("\r I2C Configuration register: 0x%x \n", SYS_CONFIG_ADDR);
 	printf("\r I2C Read configuration value: 0x%x \n", ret_value);
	return 0;
}

/*往i2c总线上写一个字节的数据*/
uint8_t AP3216_WriteOneByte(uint8_t reg, uint8_t data)
{
	uint16_t write_data = reg | (data<<8);

	/*先发送高位*/
	if(HAL_I2C_Master_Transmit(&hi2c1, AP3216_ADDR | AP3216_W , (uint8_t*)&write_data, 2, 300) != HAL_OK)
	{
		Error_Handler();
	}
	while (HAL_I2C_GetState(&hi2c1) != HAL_I2C_STATE_READY);
	return 0;
}

uint8_t AP3216_ReadOneByte(uint8_t reg)
{
	uint8_t read_data = 0;
	if(HAL_I2C_Master_Transmit(&hi2c1, AP3216_ADDR | AP3216_W , (uint8_t*)&reg, 1, 300) != HAL_OK)
	{
		Error_Handler();
	}
	while (HAL_I2C_GetState(&hi2c1) != HAL_I2C_STATE_READY);
	if(HAL_I2C_Master_Receive(&hi2c1, AP3216_ADDR | AP3216_R , (uint8_t*)&read_data, 1, 300) != HAL_OK)
	{
		Error_Handler();
	}
	return read_data;
}

uint16_t AP3216_Read_ALS_Data()
{
	uint8_t als_l = 0, als_h = 0;
	uint16_t data;
	als_l = AP3216_ReadOneByte(ALS_DATA_LOW);
	als_h = AP3216_ReadOneByte(ALS_DATA_HIGH);
	data = (als_h<<8) | (als_l);
	printf("%d\n",data);

	return data;
}


本文只是提供一个代码参考, 当然整体的读取数据的代码思路还是一样的, 大家读取到的数据根据自己的需求就行相应的逻辑处理。



芯片手册:

链接:https://pan.baidu.com/s/1SZMo-wfXccfckpy8beoLjw 
提取码:1234 
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1348454.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【AI视频领域展望】未来视频行业:人工智能、5G和VR技术将如何改变视频制作和观看方式?

5G技术 5G技术的商用将会进一步推动物联网和视频行业的融合。通过5G技术&#xff0c;可以实现高清视频的实时传输和播放&#xff0c;为用户提供更加流畅和快速的观看体验。 5G视频的优势主要体现在以下几个方面&#xff1a; 更低的延迟&#xff1a;5G网络的延迟时间相比4G降低…

Plantuml之EBNF语法介绍(二十七)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

App.vue中引入自定义组件

components目录中定义组件&#xff1a;Person.vue 目录截图&#xff1a; Person.vue文件中内容&#xff1a; <template><div class"person"><h2>姓名&#xff1a;{{name}}</h2><h2>年龄&#xff1a;{{age}}</h2><!--定义了…

OSCHINA Gitee 联合呈现,《2023 中国开源开发者报告》正式发布,总结分非常帮,可以免费看的报告!

《2023 中国开源开发者报告》 详细地址&#xff1a; https://talk.gitee.com/report/china-open-source-2023-annual-report.pdf 不需要收费下载&#xff01;&#xff01; 其中大模型的部分总结的非常棒 gietee 也支持 AI 模型托管了 如何在 Gitee 上托管 AI 模型 https://…

使用WAZUH检测LD_PRELAOD劫持、SQL注入、主动响应防御

目录 1、检查后门 使用工具检测后门 1.chkrootkit 2.rkhunter 手动检查文件 检查ld.so.preload文件 2、检测LD_PRELOAD ubuntu配置 wazuh配置 3、检测SQL注入 ubuntu配置 攻击模拟 4、主动响应 wauzh的安装以及设置代理可以参考本篇&#xff1a;WAZUH的安装、设置…

【Qt之Quick模块】6. QML语法详解_3 QML对象特性

概述 每一个QML对象类型都包含一组已定义的特性。当进行实例时都会包含一组特性&#xff0c;这些特性是在对象类型中定义的。 一个QML文档中的对象类型声明了一个新的类型&#xff0c;即实例出一个类型。 其中包含以下特性。 the id attribute &#xff1a; id特性property a…

《教育观察》是什么级别的期刊?是正规期刊吗?能评职称吗?

教育类&#xff5c;《教育观察》知网收录 《教育观察》始终秉持“ 立足教育实践&#xff0c;展望教育未来”&#xff0c;致力于在教育实践中以“观察”为方法&#xff0c;以“观察者”为主体&#xff0c;以“新观察”为旨趣&#xff0c;打造从教育实践中洞察教育未来的教育研究…

深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第四节 参数传递对堆栈的影响 2

深入浅出图解C#堆与栈 C# Heaping VS Stacking 第四节 参数传递对堆栈的影响 2 [深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈](https://mp.csdn.net/mdeditor/101021023)[深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第二节 栈基本工作原理](htt…

c语言:打印平行四边形|练习题

一、题目 输入平行四边形的边数&#xff0c;用星号打印平行四边形 如图&#xff1a; 二、思路分析 图形分为两部分 1、左边的空格 2、右边的星号 因此&#xff0c;把空格和星号合起来&#xff0c;就是要求的图形 三、代码图片【带注释】 四、源代码【带注释】 #include <s…

你逛过凌晨四点的校园吗?--大四毕业生的年终总结

前言&#xff1a; Hello大家好&#xff0c;我是Dream。 又是一年的年终总结&#xff0c;我也迎来了自己的毕业季&#xff0c;没错&#xff0c;我马上要毕业啦&#xff01;不知道大家是什么时候认识我的呢&#xff0c;又或者是第一次发现我~这一年&#xff0c;迎接过朝阳、拍下过…

手摸手系列之SpringBoot+Vue2项目整合高德地图实现车辆实时定位功能

前言 最近在做一个物流内陆运输的项目&#xff0c;其中的一个关键功能是根据车辆的GPS数据在页面上实时显示车辆位置信息。由于我们已经获得了第三方提供的GPS数据&#xff0c;所以接下来的任务是将这些数据整合到我们的系统中&#xff0c;并利用高德地图API来展示车辆的实时位…

机器学习分类

1. 监督学习 监督学习指的是人们给机器一大堆标记好的数据&#xff0c;比如&#xff1a; 一大堆照片&#xff0c;标记出哪些是猫的照片&#xff0c;哪些是狗的照片 让机器自己学习归纳出算法或模型 使用该算法或模型判断出其他没有标记的照片是否是猫或狗 上述流程如下图所…

解决windows系统找不到msvcr100.dll问题,vcomp100.dll缺失的5个解决方法

在日常使用计算机的过程中&#xff0c;我们可能会遇到一些错误提示&#xff0c;其中之一就是“找不到vcomp100.dll”的错误。那么&#xff0c;vcomp100.dll究竟是什么文件&#xff1f;为什么会出现丢失的情况&#xff1f;本文将为您详细解析vcomp100.dll的作用、丢失原因以及提…

C++的面向对象学习(9):文件操作

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、类的封装的多文件实现回顾二、文件操作1.对文件进行操作需要头文件<fstream>2.操作文件的三大类方法&#xff1a;读、写、读写 三、实现文本文件的读、写…

【STM32F103】SysTick系统定时器延时函数

SysTick SysTick是Cortex-M3内核中的一个外设&#xff0c;内嵌在NVIC中&#xff0c;叫系统定时器。 当处理器在调试期间被喊停时&#xff0c;SysTick也将暂停运作。 一共有四个寄存器&#xff0c;不过我们通常用前三个&#xff0c;不需要校准。下图出自《STM32F10xxx Cortex…

小兔鲜儿 uniapp - SKU 模块

目录 存货单位&#xff08;SKU&#xff09;​ 插件市场​ 下载 SKU 插件​ 使用 SKU 插件​ 插件类型问题​ 核心业务​ 渲染商品规格​ 打开弹窗交互​ 渲染被选中的值​ 存货单位&#xff08;SKU&#xff09;​ SKU 概念 存货单位&#xff08;Stock Keeping Unit&a…

【教学类-43-11】 20231231 3*3宫格数独提取单元格坐标数字的通用模板(做成2*2=4套、3*2=6套)

背景需求&#xff1a; 1、以前做单元格填充&#xff0c;都是制作N个分开的单元格 &#xff08;表格8&#xff09; 2、这次做五宫格数独的Word模板&#xff0c;我图方便&#xff0c;就只用了一个大表格&#xff0c;第六行第六列隐藏框线&#xff0c;看上去就是分开的&#xff…

Linux | 解决问题Ubuntu重启无法进入系统以及网络无法连接【图文详解】

Ubuntu18.04重启无法进入系统&#xff0c;重开后如图 一直在加载系统内核4.15.0-213-generic,无法加载 错误原因 原本的系统是Ubuntu16.04,使用命令升级到Ubuntu18.04版本&#xff0c;升级重启后&#xff0c;远程无法连接&#xff01; 错误解决 第一步&#xff1a;进入GRUB…

ZigBee案例笔记 - 无线点灯

文章目录 无线点灯实验概述工程关键字工程文件夹介绍Basic RF软件设计框图简单说明工程操作Basic RF启动流程Basic RF发送流程Basic RF接收流程 无线点灯案例无线点灯现象 无线点灯实验概述 ZigBee无线点灯实验&#xff08;即Basic RF工程&#xff09;&#xff0c;由TI公司提供…

neovim调试linux内核过程中索引不到对应头文件问题

大家好&#xff0c;我叫徐锦桐&#xff0c;个人博客地址为www.xujintong.com&#xff0c;github地址为https://github.com/jintongxu。平时记录一下学习计算机过程中获取的知识&#xff0c;还有日常折腾的经验&#xff0c;欢迎大家访问。 一、环境 neovim–0.9.4 mason的clang…