STM32基于I2C温湿度采集

目录

一、题目要求

二、关于I2C

1、什么IIC

 2、IIC的主要特点

3、IIC协议数据传输过程

三、关于DHT20

 1、概述

2、引脚参数

 四、DHT20温湿度采集

1、程序代码分析

2、实验效果展示

五、总结

六、参考资料


一、题目要求

1. 学习I2C总线通信协议,使用STM32F103完成基于I2C协议的AHT20温湿度传感器的数据采集,并将采集的温度-湿度值通过串口输出。具体任务:

1)解释什么是“软件I2C”和“硬件I2C”? (阅读野火配套教材的第23章“I2C--读写EEPROM”原理章节)

2)阅读DHT20数据手册,编程实现:每隔2秒钟采集一次温湿度数据,并通过串口发送到上位机

二、关于I2C

1、什么IIC

         IIC(Inter-Integrated Circuit)总线 是一种由NXP(原PHILIPS)公司开发的两线式串行总线,用于连接微控制器及其外围设备。多用于主控制器和从器件间的主从通信,在小数据量场合使用,传输距离短,任意时刻只能有一个主机等特性。

在 CPU 与被控 IC 之间、IC 与 IC 之间进行双向传送,高速 IIC 总线一般可达 400kbps 以上。

IIC一共有只有两个总线: 一条是双向的串行数据线SDA,一条是串行时钟线SCL

SDA(Serial data)是数据线,D代表Data也就是数据,Send Data 也就是用来传输数据的

SCL(Serial clock line)是时钟线,C代表Clock 也就是时钟 也就是控制数据发送的时序的

软件IIC:软件IIC通信指的是用单片机的两个I/O端口模拟出来的IIC,用软件控制管脚状态以模拟I2C通信波形,软件模拟寄存器的工作方式。

硬件IIC :一块硬件电路,硬件I2C对应芯片上的I2C外设,有相应I2C驱动电路,其所使用的I2C管脚也是专用的,硬件(固件)I2C是直接调用内部寄存器进行配置。

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

 2、IIC的主要特点

通常我们为了方便把IIC设备分为主设备和从设备,基本上谁控制时钟线(即控制SCL的电平高低变换)谁就是主设备。

· IIC主设备功能:主要产生时钟,产生起始信号和停止信号

· IIC从设备功能:可编程的IIC地址检测,停止位检测

· IIC的一个优点是它支持多主控(multimastering), 其中任何一个能够进行发送和接收的设备都可以成为主总线。一个主控能够控制信号的传输和时钟频率。当然,在任何时间点上只能有一个主控。

· 支持不同速率的通讯速度,标准速度(最高速度100kHZ),快速(最高400kHZ)

· SCL和SDA都需要接上拉电阻 (大小由速度和容性负载决定一般在3.3K-10K之间) 保证数据的稳定性,减少干扰。

· IIC是半双工,而不是全双工 ,同一时间只可以单向通信

· 为了避免总线信号的混乱,要求各设备连接到总线的输出端时必须是漏极开路(OD)输出或集电极开路(OC)输出。这一点在等下我们会讲解 

3、IIC协议数据传输过程

主设备和从设备进行数据传输时遵循以下协议格式。数据通过一条SDA数据线在主设备和从设备之间传输01的串行数据。串行数据序列的结构可以分为,开始条件,地址位,读写位,应答位,数据位,停止条件。

 开始条件

当主设备决定开始通讯时,需要发送开始信号,需要执行以下动作:
· 先将SDA线从高压电平切换到低压电平;
· 然后将SCL从高电平切换到低电平;
在主设备发送开始条件信号之后,所有从机即使处于睡眠模式也将变为活动状态,并等待接收地址位。

 

 从机应答/非应答

· 主机每次发送完数据之后会等待从设备的应答信号ACK
· 在第9个时钟信号,如果从设备发送应答信号ACK,则SDA会被拉低若没有应答信NACK,则SDA会输出为高电平,这过程会引起主设备发生重启或者停止

 

结束条件 

当主设备决定结束通讯时,需要发送停止信号,需要执行以下动作
· 先将SDA线从低电压电平切换到高电压电平
· 再将SCL线从高电平拉到低电平

 

三、关于DHT20

 1、概述

        DHT20采用I2C通讯协议,响应迅速,配有一个全新设计的ASIC专用芯片、一个经过改进的MEMS半导体电容式湿度传感元件和一个标准的片上温度传感元件,是一款全新升级的智能温湿度传感器模块,在测量精度、供电电压、测量范围等方面的性能参数都有大幅提升,超出了前一代传感器的可靠性水平,即使在恶劣环境下也能保持性能稳定。每一款产品出厂时都经过严格的校准和测试。由于对传感器做了改良和微型化改进,因此它的性价比更高。

2、引脚参数

 

 四、DHT20温湿度采集

1、程序代码分析

read_DHT20_once();    //I2C读取传感器温度

void  read_DHT20_once(void)
{
	delay_ms(10);

	reset_DHT20();				//复位DHT20
	delay_ms(10);

	init_DHT20();				//初始化DHT20
	delay_ms(10);

	startMeasure_DHT20();		//准备开始测量DHT20温湿度	
	delay_ms(80);

	read_DHT20();				//通过IIC读取DHT20采集的温湿度
	delay_ms(5);
}

 main() ;   函数

int main(void)
{	
	delay_init();	    	       //延时函数初始化    	  
	uart_init(115200);	 			//串口初始化
	IIC_Init();						//IIC协议初始化
		  
	NVIC_Configuration(); 	   //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 	
	OLED_Init();			         //初始化OLED  
	OLED_Clear(0); 
	while(1)
	{
		printf("温度湿度显示");
		read_DHT20_once();				//I2C读取传感器温度
		OLED_Clear(0); 					
		delay_ms(1500);
  }
}

工程代码文件传送门:工程代码

2、实验效果展示

温湿度采集实验

五、总结

        温湿度采集实验是一个很有趣的实验,通过温湿度采集基本了解了IIC通信协议的相关知识,以及学会了如何运用IIC协议读取数据,很有帮助;实验过程也遇到了一些问题,对于温湿度采集传感器的供电特别注意,需要5v供电可能才能正常读取采集数据,一开始3.3v供电怎么都读取不了温度。

六、参考资料

IIC原理超详细讲解---值得一看

I2C协议靠这16张图彻底搞懂(超详细)

stm32通过I2C接口实现温湿度(AHT20)的采集

猜你喜欢

转载自blog.csdn.net/qq_52791446/article/details/127592627