基于I2C的AHT20温湿度传感器的数据采集

   日期:2020-12-15     浏览:622    评论:0    
核心提示:摘要:本文先介绍一下对I2C学习的理解,然后用I2C实现AHT20进行温湿度采集文章目录摘要:一、I2C简介二、硬件I2C与软件I2C的区别三、实现I2CAHT20温湿度传感器的数据采集1、AHT20简介2、配置函数库,编写函数4、最终结果展示四、总结一、I2C简介IC( Inter-- Integrated Circuit)总线是一种由 PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。它是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。在CPU与被控I2C之

摘要:

本文先介绍一下对I2C学习的理解,然后用I2C实现AHT20进行温湿度采集

文章目录

      • 摘要:
      • 一、I2C简介
      • 二、硬件I2C与软件I2C的区别
      • 三、实现I2CAHT20温湿度传感器的数据采集
        • 1、AHT20简介
        • 2、配置函数库,编写函数
        • 4、最终结果展示
      • 四、总结

一、I2C简介

IC( Inter-- Integrated Circuit)总线是一种由 PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。它是由数据线SDA时钟SCL构成的串行总线,可发送和接收数据。
在CPU与被控I2C之间、I2C与I2C之间进行双向传送,高速IC总线一般可达400kbps以上。 I2C总线在传送数据过程中共有三种类型信号,它们分别是:开始信号、结束信号和应答信号

  • 开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。
  • 结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结東传送数据。
  • 应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲表示已收到数据。CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接
    收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为 受控单元出现故障。

这些信号中,起始信号是必需的结束信号和应答信号,都可以不要

⭐️ stm32(正点原子)的SLC和SDA的连接如下:

二、硬件I2C与软件I2C的区别

️‍ 硬件I2C

硬件I2C对应芯片上的I2C外设,有相应I2C驱动电路,其所使用的I2C管脚也是专用的

️‍ 软件I2C

软件I2C一般是用GPIO管脚,用软件控制管脚状态以模拟I2C通信波形

硬件I2C的效率要远高于软件的,而软件I2C由于不受管脚限制,接口比较灵活

模拟I2C 是通过GPIO,软件模拟寄存器的工作方式,而硬件(固件)I2C是直接调用内部寄存器进行配置。如果要从具体硬件上来看,可以去看下芯片手册。因为固件I2C的端口是固定的,所以会有所区别。

区分他们:

  • 可以看底层配置,比如IO口配置,如果配置了IO口的功能(IIC功能)那就是固件IIC
  • 可以看IIC写函数,看里面有木有调用现成的函数或者给某个寄存器赋值,如果有,则肯定是固件IIC功能,没有的话肯定是数据一个bit一个bit模拟发生送的,肯定用到了循环,则为模拟。
    根据代码量判断,模拟的代码量肯定比固件的要大。

三、实现I2CAHT20温湿度传感器的数据采集

1、AHT20简介

AHT20是国内奥松生成的I2C接口的MEMS温湿度传感器,ADC位数为20Bit,具有体积小、精度高、成本低等优点。

由于AHT10/15/20 具有国产化、体积小、精度高、成本低等特点,可以替代 DHT11/DHT12/AM2320/SHT20/SHT30,单芯片价格在¥2~3,体积小巧很轻松嵌入到产品上

参数如下:

AHT20
供电电压 2.0-5.5V
工作电流(休眠) 0.25uA
工作电流(测量) 23uA
测量范围(湿度) 0~100%RH
测量范围(温度) -40~+85℃
温度精度 ±2%RH(25℃)
湿度精度 ±0.3℃
分辨率 温度: 0.01℃ 湿度: 0.024%RH
信号输出 I²C信号
防护
封装大小 3x3x1.0mm(DFN)

2、配置函数库,编写函数

参考 正点原子STM32开发板第27章 IIC实验

step0:驱动代码(官网下载),下载AHT20.c和AHT20.h,官网都有,另外最重要的还是I2C可以参考原子的代码在myiic下就是关于i2c的代码。

对于正点原子的精英版,其SCL和SDL分别对应的就是PB6和PB7,我们用普通IO口来模拟I2C的功能,来实现功能。

step1:用例程原子I2C例程!基本函数库的基本框架不用变,因为做的串口通信,所以就不需要lcd与key的系列函数了,并且加入我们的代码。

这里你可以把上面的两个代码复制在HARDWARE问件夹下

点击manage project items 在HARDWRE下加入上面.c文件。

然后点击魔术棒,C/C++,路径添加AHT20文件夹

step2:编写主函数

1、检测AHT20是否采集到数据,如果采到就处理数据

2、根据如下两个公式

c1 = AHT20.HT[0]10010/1024/1024; //湿度
t1 = AHT20.HT[1]20010/1024/1024-500;//温度计算公式

来计算得出温度。

3、通过指示灯翻转标识正常工作

4、AHT20函数中,有定义结构体,根据结构体来得到相关值

下面是主函数:

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "usmart.h" 
#include "24cxx.h" 
#include "AHT20.h"
		 	
struct m_AHT20 AHT20;
int main(void)
{ 
	volatile int  c1,t1;
	float c2,t2;
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置中断优先级
	LED_Init();									//初始化LED
	delay_init();	    				//延时初始化
	IIC_Init();							//IIC初始化
  uart_init(115200);	 //串口初始化为115200
	AHT20.alive=!AHT20_Init();	        //AHT20初始化
 
	while(1)
	{ 
		if(AHT20.alive)//是否存活
		{ 
			//读取其原始数据
			AHT20.flag = AHT20_ReadHT(AHT20.HT);
			c1 = AHT20.HT[0]*100*10/1024/1024;  //湿度
			t1 = AHT20.HT[1]*200*10/1024/1024-500;//温度计算公式
			//结果都放大了10倍
			c2=c1/10.0;
			t2=t1/10.0;
			printf("湿度:\r\n%f\r\n",c2);
			printf("温度:\r\n%f\r\n\r\n",t2);
			//正常工作双灯翻转
			LED0=!LED0;
			LED1=!LED1;
		}
		delay_ms(2000);
		
	}
}

step3:编译连接,烧入程序

硬件如下

分别对应

SCL–>PB6

SDA–>PB7

共地

给3.3V电

4、最终结果展示

四、总结

这次的学习我了解了什么是硬件I2C什么是软件I2C,通过对AHT20的配置与实验更加了解了如何使用I2C。获益匪浅。

参考

https://blog.csdn.net/weixin_42048417/article/details/80683556

http://www.aosong.com/products-61.html

https://zhidao.baidu.com/question/693765215942559364.html

https://blog.csdn.net/toopoo/article/details/80053929

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服