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

引言: 本片文章想给大家分享一下使用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 
 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言之scanf浅析

前言&#xff1a; 当有了变量&#xff0c;我们需要给变量输入值就可以使用scanf函数&#xff0c;如果需要将变量的值输出在屏幕上的时候可以使用printf函数&#xff0c;如&#xff1a; #include <stdio.h> int main() {int score 0;printf("请输⼊成绩:");sc…

数据结构——红黑树 and B-树

红黑树 根据平衡条件第4、5两点 最短路径&#xff0c;都是黑色 最长路径&#xff0c;红黑相间 最长是最短的两倍 B-树

webpack的深入学习与实战(持续更新)

一、何为Webpack Webpack是 一个开源的JavaScript模块打包工具&#xff0c;其最核心的功能是解决模块之间的依赖&#xff0c;把各个模块按照特定的规则和顺序组织在一起&#xff0c;最终合并为一个JS文件或多个。 二、带宽的换算 目前我们的云服务器带宽为5M 三 、bundle 体…

小白入门java基础-注解

一&#xff1a;介绍 Java 是由 Sun Microsystems 公司于 1995 年 5 月推出的高级程序设计语言。 Java 可运行于多个平台&#xff0c;如 Windows, Mac OS 及其他多种 UNIX 版本的系统。Java语言编写的程序&#xff0c;在一次编译后&#xff0c;可以在多个系统平台上运行。 主…

一元函数微分学——刷题(8

目录 1.题目&#xff1a;2.解题思路和步骤&#xff1a;3.总结&#xff1a;小结&#xff1a; 1.题目&#xff1a; 2.解题思路和步骤&#xff1a; 先看A&#xff0c;既然存在&#xff0c;那么f(x)和x属于同阶无穷小&#xff0c;所以f(0)0&#xff0c;没问题 再看C&#xff0c;结…

数据结构,题目笔记

哈希表 线性探测再散列 【算法数据结构&#xff5c;哈希查找&#xff5c;哈希冲突&#xff5c;除留余数法&#xff5c;线形探测法&#xff5c;例题讲解】https://www.bilibili.com/video/BV1514y1P7BK?vd_source1a684a3a1b9d05485b3d6277aeeb705d 【二次探测再散列法】 【【…

从入门到精通,30天带你学会C++【第十天:猜数游戏】

目录 Everyday English 前言 实战1——猜数游戏 综合指标 游玩方法 代码实现 最终代码 试玩时间 必胜策略 具体演示 结尾 Everyday English All good things come to those who wait. 时间不负有心人 前言 今天是2024年的第一天&#xff0c;新一年&#xff0c;新…

linux休眠机制介绍

一、概述 Linux系统提供了休眠和低功耗模式&#xff0c;可以帮助节省电力和延长电池寿命&#xff0c;休眠对应的另外一种模式就是唤醒。 二、常用的休眠方式 常用的休眠方式有freeze,standby, mem, disk&#xff0c;hibernate freeze: 冻结所有的进程&#xff0c;包括用户空…

中小微医院机构云服务(云HIS)平台源码

云HIS&#xff08;Cloud-Based Healthcare Information System&#xff09;重新定义了HIS&#xff0c;目标是为中小型医疗卫生机构提供优质经济的医疗卫生信息化产品及服务&#xff1b;是以健康档案为主线、以电子病历为核心、以云计算技术为基础的医疗卫生系统。云HIS作为基于…

C# 如何读取Excel文件

当处理Excel文件时&#xff0c;从中读取数据是一个常见的需求。通过读取Excel数据&#xff0c;可以获取电子表格中包含的信息&#xff0c;并在其他应用程序或编程环境中使用这些数据进行进一步的处理和分析。本文将分享一个使用免费库来实现C#中读取Excel数据的方法。具体如下&…

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

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

springboot 接收appsflyer 参数

1、官网登陆&#xff1a;hq1.appsflyer.com a、配置接收请求的地址和需要的事件 配置详情 2、Controller配置接收 RequestMapping(value "/req", method POST)ResponseBodypublic ResData req(RequestBody Map<String, String> map) {String jsonObject J…

Swift 周报 第三十四期

文章目录 前言新闻和社区iPhone Pro 要提价&#xff01;新款 iPhone 或会使用 USB-C 充电器&#xff0c;边框更薄与 App Store 专家会面交流让你的 App 和游戏在 visionOS 模拟器外更进一步 提案通过的提案正在审查的提案 Swift论坛推荐博文话题讨论关于我们 前言 本期是 Swif…

C语言之分支与循环【附6个练习】

文章目录 前言一、什么是语句&#xff1f;1.1 表达式语句1.2 函数调用语句1.3 控制语句1.4 复合语句1.5 空语句 二、分支语句&#xff08;选择结构&#xff09;2.1 if语句2.1.1 悬空else2.1.2 练习&#xff08;1. 判断一个数是否为奇数 2. 输出1-100之间的奇数&#xff09; 2.2…

深入理解Java虚拟机系列 - 总结

深入理解Java虚拟机系列 - 总结 前言一. JVM 内存模型和 Java 对象模型1.1 JVM 内存模型包括哪些&#xff1f;作用分别是&#xff1f;1.2 JVM 内存模型中的各个区域的特点&#xff1f;1.3 对象分配内存的方式有哪些&#xff1f;1.4 对象的内存布局是怎样的&#xff1f;① 对象头…

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

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

【数据结构】栈【详解】

目录 栈的定义&#xff1a; 栈的声明与定义&#xff1a; 头文件的包含&#xff1a; 对栈的基本操作&#xff1a; 栈的初始化&#xff1a; 摧毁栈: 入栈&#xff1a; ​编辑 出栈&#xff1a; ​编辑 输出栈顶位置&#xff1a; 输出栈的当前大小&#xff1a; 判空操…

小兔鲜儿 uniapp - 购物车模块

目录 加入购物车​ 接口相关​ 购物车列表​ 静态结构​ 登录状态​ 列表渲染​ 删除购物车 接口相关​ 参考代码 修改商品信息​ 接口相关​ ​修改商品数量​ 修改商品选中/全选​ 底部结算信息​ 计算总钱数(总金额)​ 带返回按钮的购物车​ 完成加入购物车…

读书笔记1-C++ Primer Plus

C是在C语言基础上开发的一种集面向对象编程&#xff08;OOP&#xff09;、通用编程和传统的过程化编程于一体的编程语言。本书是根据2003年的ISO/ANSI C标准编写的&#xff0c;通过大量短小精悍的程序详细而全面地阐述了C的基本概念和技术。 全书分17章和10个附录&#xff0c;分…