AHT20温湿度传感器的数据采集并通过串口输出和OLED屏显示

目录

一.I2C总线通信协议、SPI协议

1.I2C总线简介

1.1 I2C总线的物理层

1.2 I2C总线的协议层

2.软件I2C和硬件I2C

3.SPI协议

二.AHT20温湿度数据采集

1.工程代码

2.下载工程后并打开project

 3.编译加烧录

 4.运行结果

三.OLED显示  

1.显示姓名和学号

2.显示AHT20的温度和湿度 

 3.左右的滑动显示长字符

四、总结

参考文献:


一.I2C总线通信协议、SPI协议

1.I2C总线简介

     I2C由飞利浦公司于1980年代提出,为了让主板、嵌入式系统或手机用以连接低速周边外部设备而发展。

    主要用途:SOC和周边外设间的通信。

1.1 I2C总线的物理层

    I2C总线物理层由两根线组成:串行时钟线SCL、串行数据线SDA。由于这两根线都是开漏输出结构,因此必须都接上拉电阻到高电平,因此当总线处于空闲状态时,两根线都处于高电平状态。下图为I2C总线的物理层示意图:

1.2 I2C总线的协议层

     I2C 的协议定义了通讯的起始和停止信号、数据有效性、响应、仲裁、时钟同步和地址广播等环节。

I2C基本读写过程

     起始信号产生后,所有从机就开始等待主机接下来广播的从机地址信号。在 I2C 总线上,每个设备的地址都是唯一的,当主机广播的地址与某个设备地址相同时,这个设备就被选中了,没被选中的设备将会忽略之后的数据信号。根据 I2C协议,这个从机地址可以是 7位或10位。
    在地址位之后,是传输方向的选择位,该位为0时,表示后面的数据传输方向是由主机传输至从机,即主机向从机写数据。该位为 1时,则相反,即主机由从机读数据。
    从机接收到匹配的地址后,主机或从机会返回一个应答(ACK)或非应答(NACK)信号,
    只有接收到应答信号后,主机才能继续发送或接收数据。

通讯的起始和停止信号

   当 SCL 线是高电平时 SDA 线从高电平向低电平切换,这个情况表示通讯的起始。
   当 SCL 是高电平时 SDA 线由低电平向高电平切换,表示通讯的停止。
   起始和停止信号一般由主机产生。

 数据的有效性

  I2C使用SDA信号线来传输数据,使用SCL信号线进行数据同步。 SDA数据线在SCL的每个时钟周期传输一位数据。
  SCL为高电平的时候SDA表示的数据有效,即此时的SDA为高电平时表示数据“1”,为低电平时表示数据“0”。
  当SCL为低电平时,SDA的数据无效,一般在这个时候SDA进行电平切换,为下一次表示数据做好准备。

若想要更详细的了解I2C的知识,可以参考此链接学习:I2C协议——物理层和协议层_吴立赛的博客-CSDN博客 

2.软件I2C和硬件I2C

软件I2C

直接使用 CPU 内核按照 I2C 协议的要求控制 GPIO 输出高低电平,从而模拟I2C。

需要在控制产生 I2C 的起始信号时,控制作为 SCL 线的 GPIO 引脚输出高电平,然后控制作为 SDA 线的 GPIO 引脚在此期间完成由高电平至低电平的切换,最后再控制SCL 线切换为低电平,这样就输出了一个标准的 I2C 起始信号。

硬件I2C

直接利用 STM32 芯片中的硬件 I2C 外设。

只要配置好对应的寄存器,外设就会产生标准串口协议的时序。在初始化好 I2C 外设后,只需要把某寄存器位置 1,此时外设就会控制对应的 SCL 及 SDA 线自动产生 I2C 起始信号,不需要内核直接控制引脚的电平。

3.SPI协议

SPI是一种同步串行通信协议,由一个主设备和一个或多个从设备组成,主设备启动与从设备的同步通信,从而完成数据的交换。SPI是一种高速全双工同步通信总线,标准的SPI仅仅使用4个引脚,主要应用在 EEPROM, Flash, 实时时钟(RTC), 数模转换器(ADC), 数字信号处理器(DSP) 以及数字信号解码器之间。

SPI原理

SPI有3种规格,如图所示为其模型。

3种SPI的处理流程大同小异,使用最多的SPI-4为例来说明SPI的原理。它在发送接口和接收接口都有各自的数据通道和流控状态信息通道,其数据通道和流控状态信息通道是独立的并且是点对点通信。数据是以包的形式发送,根据数据包中的内嵌地址可支持高达256个端口,以下分别说明基本协议及数据通道和流控状态信息的处理过程。

SPI物理层

SS( Slave Select):从设备选择信号线,常称为片选信号线。
SCK (Serial Clock):时钟信号线,用于通讯数据同步。
MOSI (Master Output, Slave Input):主设备输出/从设备输入引脚。
MISO(Master Input,,Slave Output):主设备输入/从设备输出引脚。

 SPI协议层

 SPI 基本通讯过程  

MOSI 与 MISO 的信号只在 NSS 为低电平的时候才有效,在 SCK 的每个时钟周期 MOSI 和 MISO 传输一位数据。

通讯的起始和停止信号
在图 25-2 中的标号① 处, NSS 信号线由高变低,是 SPI 通讯的起始信号。 NSS 是每个
从机各自独占的信号线,当从机在自己的 NSS 线检测到起始信号后,就知道自己被主机选
中了,开始准备与主机通讯。在图中的标号⑥ 处, NSS 信号由低变高,是 SPI 通讯的停止
信号,表示本次通讯结束,从机的选中状态被取消。

数据有效性

SPI 使用 MOSI 及 MISO 信号线来传输数据,使用 SCK 信号线进行数据同步。 MOSI 及
MISO 数据线在 SCK 的每个时钟周期传输一位数据,且数据输入输出是同时进行的。数据
传输时, MSB 先行或 LSB 先行并没有作硬性规定,但要保证两个 SPI 通讯设备之间使用同
样的协定,一般都会采用图 25-2 中的 MSB 先行模式。

二.AHT20温湿度数据采集

1.工程代码

工程链接:百度网盘 请输入提取码
提取码:lbai 

main.c

#include "delay.h"
#include "usart.h"
#include "bsp_i2c.h"


int main(void)
{	
	delay_init();    
	uart_init(115200);	 
	IIC_Init();
		while(1)
	{
		printf("温度湿度显示");
		read_AHT20_once();
		delay_ms(1500);
  }
}

2.下载工程后并打开project

 3.编译加烧录

 4.运行结果

​​​

三.OLED显示  

1.显示姓名和学号

1.1工程代码

工程链接:百度网盘 请输入提取码

提取码:qwer

main.c

#include "delay.h"
#include "sys.h"
#include "oled.h"
#include "gui.h"
#include "test.h"
int main(void)
{	
	delay_init();	    	       //延时函数初始化	  
	NVIC_Configuration(); 	   //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 	
	OLED_Init();			         //初始化OLED  
	OLED_Clear(0);             //清屏(全黑)
	while(1) 
	{	
		TEST_MainPage();         //主界面显示测试
		OLED_Clear(0); 
    }
}

1.2打开工程修改代码

打开test.c修改TEST_MainPage函数中GUI_ShowString,GUI_ShowCHinese的参数

 1.3将上面输入的对应的字模点阵加入到oledfont.h里

 1.4汉字取模点阵

首先设置字模输出选项,可以自定义格式 不同的取模方式对应的十六进制码不一样,这里是16X16点阵。

 添加到oledfont.h的16x16中

1.5 编译烧录

 1.6实验效果

2.显示AHT20的温度和湿度 

2.1工程代码

链接:百度网盘 请输入提取码
提取码:qwer

main.c

#include "delay.h"
#include "usart.h"
#include "bsp_i2c.h"
#include "sys.h"
 
#include "oled.h"
#include "gui.h"
#include "test.h"
 
int main(void)
{	
	delay_init();	    	       //延时函数初始化    	  
	uart_init(115200);	 
	IIC_Init();
		  
	NVIC_Configuration(); 	   //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 	
	OLED_Init();			         //初始化OLED  
	OLED_Clear(0); 
	while(1)
	{
		//printf("温度湿度显示");
		read_AHT20_once();
		OLED_Clear(0); 
		delay_ms(1500);
  }
}

2.2编译烧录

 2.3实验效果

 3.左右的滑动显示长字符

3.1工程代码

链接:百度网盘 请输入提取码

提取码:qwer

main.c

#include "sys.h"
#include "oled.h"
#include "gui.h"
#include "test.h"
int main(void)
{	
	delay_init();	    	       //延时函数初始化	  
	NVIC_Configuration(); 	   //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 	
	OLED_Init();			         //初始化OLED  
	OLED_Clear(0);             //清屏(全黑)
	OLED_WR_Byte(0x2E,OLED_CMD);        //关闭滚动
  OLED_WR_Byte(0x27,OLED_CMD);        //水平向左或者右滚动 26/27
  OLED_WR_Byte(0x00,OLED_CMD);        //虚拟字节
	OLED_WR_Byte(0x00,OLED_CMD);        //起始页 0
	OLED_WR_Byte(0x07,OLED_CMD);        //滚动时间间隔
	OLED_WR_Byte(0x07,OLED_CMD);        //终止页 7
	OLED_WR_Byte(0x00,OLED_CMD);        //虚拟字节
	OLED_WR_Byte(0xFF,OLED_CMD);        //虚拟字节
	TEST_MainPage();
	OLED_WR_Byte(0x2F,OLED_CMD);        //开启滚动
	while(1) 
	{	

	}
}

3.2打开test.c修改TEST_MainPage函数中GUI_ShowCHinese参数

3.3添加字模数据,操作设置与上面相同 

3.4编译烧录    

3.5运行效果          

四、总结

  此次实验利用了温度传感器,实现了对温度湿度的测验,最终输出到屏幕上,对于I2C和SPI协议的学习有了一定理解。大致理解OLED屏显和汉字点阵编码原理后,对代码进行编写,然后在OLED屏幕上输出自己想要的字,也是很有趣的一件事。

参考文献:

I2C协议——物理层和协议层_吴立赛的博客-CSDN博客

基于I2C的AHT20温度采集器以及基于SPI协议OLED显示_Laul Ken-Yi的博客-CSDN博客

基于STM32的0.96寸OLED显示屏显示数据_Harriet的博客-CSDN博客_基于stm32的oled显示时间

基于SPI通信方式的OLED显示_不#曾&轻听的博客-CSDN博客

猜你喜欢

转载自blog.csdn.net/SS_SS_SSS_SSS/article/details/121474293