STM32分别实现温湿度的采集和OLED显示屏显示数据

目录

一、温湿度的采集

1.1了解I2C总线协议

1.2实现AHT20采集程序

 二、OLED显示屏显示数据

2.1了解SPI

2.2使用OLED显示

2.2.1实验题目:

2.2.2实验过程

三、总结

四、参考资料


一、温湿度的采集

1.1了解I2C总线协议

       由于本次的温湿度采集需要通过I2C接口实现,所以我们先来了解一下I2C总线协议

从图中我们可以看出呢,I2C总线的特点

  1.它是由两根线组成的,一根叫SCL(串行时钟线),一根叫SDA(串行数据线)。线少,好处自然不用多说咯,但是速度肯定就慢了,用作外设之间的数据接口够用了。而快速的芯片内部通信,用的是AMBA总线通信,想了解的自己查一下,或者过几天我研究后再写。

  2.每颗I2C芯片呢都可以作为主机和从机,但一次通行中只允许存在一个主机。

I2C总线存在三种状态:

  1.空闲

  2.工作开始

  3.工作停止

  先说空闲状态:当SCL与SDA同时为高电平时,为空闲态,说白了,就啥也不干。如下图:

                                

  再说说开始工作状态,此时SCL为高,而SDA出现下降沿,如下图:

  最后就是停止工作状态,此时SCL为高,SDA出现上升沿,如下图:

1.2实现AHT20采集程序

串口调试助手可以自己随机选择下载,这里用的是野火串口调试助手

主要代码:

AHT20芯片的使用过程:

void  read_AHT20_once(void)
{
	delay_ms(10);

	reset_AHT20();//重置AHT20芯片
	delay_ms(10);

	init_AHT20();//初始化AHT20芯片
	delay_ms(10);

	startMeasure_AHT20();//开始测试AHT20芯片
	delay_ms(80);

	read_AHT20();//读取AHT20采集的到的数据
	delay_ms(5);
}

AHT20芯片读取数据:

void read_AHT20(void)
{
	uint8_t   i;

	for(i=0; i<6; i++)
	{
		readByte[i]=0;
	}
	I2C_Start();//I2C启动

	I2C_WriteByte(0x71);//I2C写数据
	ack_status = Receive_ACK();//收到的应答信息
	readByte[0]= I2C_ReadByte();//I2C读取数据
	Send_ACK();//发送应答信息

	readByte[1]= I2C_ReadByte();
	Send_ACK();

	readByte[2]= I2C_ReadByte();
	Send_ACK();

	readByte[3]= I2C_ReadByte();
	Send_ACK();

	readByte[4]= I2C_ReadByte();
	Send_ACK();

	readByte[5]= I2C_ReadByte();
	SendNot_Ack();
	//Send_ACK();

	I2C_Stop();//I2C停止函数
	//判断读取到的第一个字节是不是0x08,0x08是该芯片读取流程中规定的,如果读取过程没有问题,就对读到的数据进行相应的处理
	if( (readByte[0] & 0x68) == 0x08 )
	{
		H1 = readByte[1];
		H1 = (H1<<8) | readByte[2];
		H1 = (H1<<8) | readByte[3];
		H1 = H1>>4;

		H1 = (H1*1000)/1024/1024;

		T1 = readByte[3];
		T1 = T1 & 0x0000000F;
		T1 = (T1<<8) | readByte[4];
		T1 = (T1<<8) | readByte[5];

		T1 = (T1*2000)/1024/1024 - 500;

		AHT20_OutData[0] = (H1>>8) & 0x000000FF;
		AHT20_OutData[1] = H1 & 0x000000FF;

		AHT20_OutData[2] = (T1>>8) & 0x000000FF;
		AHT20_OutData[3] = T1 & 0x000000FF;
	}
	else
	{
		AHT20_OutData[0] = 0xFF;
		AHT20_OutData[1] = 0xFF;

		AHT20_OutData[2] = 0xFF;
		AHT20_OutData[3] = 0xFF;
		printf("读取失败!!!");

	}
	printf("\r\n");
	//根据AHT20芯片中,温度和湿度的计算公式,得到最终的结果,通过串口显示
	printf("温度:%d%d.%d",T1/100,(T1/10)%10,T1%10);
	printf("湿度:%d%d.%d",H1/100,(H1/10)%10,H1%10);
	printf("\r\n");
}

结果显示:

 二、OLED显示屏显示数据

2.1了解SPI

        ISP全称Image Signal Processing,即图像信号处理。主要用来对前端图像传感器输出信号处理的单元,以匹配不同厂商的图象传感器。ISP 通过一系列数字图像处理算法完成对数字图像的效果处理

        ISP 的控制结构如图所示,lens 将光信号投射到sensor 的感光区域后,sensor 经过光电转换,将Bayer 格式的原始图像送给ISP,ISP 经过算法处理,输出RGB 空间域的图像给后端的视频采集单元。在这个过程中,ISP 通过运行在其上的firmware 对ISP逻辑,lens 和sensor 进行相应控制,进而完成自动光圈、自动曝光、自动白平衡等功能。其中,firmware 的运转靠视频采集单元的中断驱动。PQ Tools 工具通过网口或者串口完成对ISP 的在线图像质量调节。

       ISP 由ISP 逻辑及运行在其上的Firmware 组成,逻辑单元除了完成一部分算法处理外,还可以统计出当前图像的实时信息。Firmware 通过获取ISP 逻辑的图像统计信息,重新计算,反馈控制lens、sensor 和ISP 逻辑,以达到自动调节图像质量的目的。

2.2使用OLED显示

2.2.1实验题目:

2. 理解OLED屏显和汉字点阵编码原理,使用STM32F103的SPI或IIC接口实现以下功能:

1) 显示自己的学号和姓名; 

2) 显示AHT20的温度和湿度;

3) 上下或左右的滑动显示长字符,比如“Hello,欢迎来到物联网205实训室!”或者一段歌词或诗词(最好使用硬件刷屏模式)。

2.2.2实验过程

下载官方的资料:(里面有工程)

0.96inch SPI OLED Module - LCD wiki

工程在这里,选择自己所用的芯片即可:

在这里插入图片描述

 

打开后找到oledfont.h (注意:工程需要编译了之后才会出现.h文件,打开工程先编译)

在如图的函数里复制粘贴你想写的东西,但在此之前需要字模的转换 

字模的转换可以用PCtoLCD2002完美版,转换前记得设置选择,选C51

然后去test.c中找到void TEST_MainPage(void)然后输入:

void TEST_MainPage(void)
{	
	GUI_ShowString(28,0,"xuqian",16,1);//英文姓名
	GUI_ShowCHinese(28,20,16,"徐茜",1);//中文姓名
	GUI_ShowString(4,48,"631907030727",16,1);//数字详细
	delay_ms(1500);		
	delay_ms(1500);
}

接线如下,注意烧程序的时候跳线帽是01:

在这里插入图片描述

连好线之后烧录程序后拔掉usb,将跳线帽改成00,再将usb接上电脑即可:

 

之后的滑动显示长字符也和上面的操作差不多,先取字模然后改test.c,最后因为需要滑动的效果,还需要在main.c中合适位置加上 OLED_WR_Byte(0x2F,OLED_CMD); //开启滚动

 

三、总结

     这次的温湿度和OLED的实验让我了解到了I2C总线协议和ISP,这两个实验的代码其实都很开源,网上找找就有,算是验证性实验,在OLED的时候字模和有一些代码需要改成自己想显示的字,还有一些小细节需要注意就好了。

四、参考资料

I2C总线协议详解 - Jamesjiang2050 - 博客园 (cnblogs.com)

温湿度采集的代码参考:GitHub - Sunlight-Dazzling/stm32-AHT20 at master

(62条消息) stm32通过I2C接口实现温湿度(AHT20)的采集_Harriet的博客-CSDN博客(62条消息) stm32通过I2C接口实现温湿度(AHT20)的采集_Harriet的博客-CSDN博客

(62条消息) ISP概述、工作原理及架构_一个人的红尘-CSDN博客

(62条消息) STM32Mini基于SPI接口的0.96寸OLED屏数据显示_CHL的博客-CSDN博客

 

版权声明:本文为CSDN博主「☞天天☜」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_53072511/article/details/121489563

目录

一、温湿度的采集

1.1了解I2C总线协议

1.2实现AHT20采集程序

 二、OLED显示屏显示数据

2.1了解SPI

2.2使用OLED显示

2.2.1实验题目:

2.2.2实验过程

三、总结

四、参考资料


一、温湿度的采集

1.1了解I2C总线协议

       由于本次的温湿度采集需要通过I2C接口实现,所以我们先来了解一下I2C总线协议

从图中我们可以看出呢,I2C总线的特点

  1.它是由两根线组成的,一根叫SCL(串行时钟线),一根叫SDA(串行数据线)。线少,好处自然不用多说咯,但是速度肯定就慢了,用作外设之间的数据接口够用了。而快速的芯片内部通信,用的是AMBA总线通信,想了解的自己查一下,或者过几天我研究后再写。

  2.每颗I2C芯片呢都可以作为主机和从机,但一次通行中只允许存在一个主机。

I2C总线存在三种状态:

  1.空闲

  2.工作开始

  3.工作停止

  先说空闲状态:当SCL与SDA同时为高电平时,为空闲态,说白了,就啥也不干。如下图:

                                

  再说说开始工作状态,此时SCL为高,而SDA出现下降沿,如下图:

  最后就是停止工作状态,此时SCL为高,SDA出现上升沿,如下图:

1.2实现AHT20采集程序

串口调试助手可以自己随机选择下载,这里用的是野火串口调试助手

主要代码:

AHT20芯片的使用过程:

void  read_AHT20_once(void)
{
	delay_ms(10);

	reset_AHT20();//重置AHT20芯片
	delay_ms(10);

	init_AHT20();//初始化AHT20芯片
	delay_ms(10);

	startMeasure_AHT20();//开始测试AHT20芯片
	delay_ms(80);

	read_AHT20();//读取AHT20采集的到的数据
	delay_ms(5);
}

AHT20芯片读取数据:

void read_AHT20(void)
{
	uint8_t   i;

	for(i=0; i<6; i++)
	{
		readByte[i]=0;
	}
	I2C_Start();//I2C启动

	I2C_WriteByte(0x71);//I2C写数据
	ack_status = Receive_ACK();//收到的应答信息
	readByte[0]= I2C_ReadByte();//I2C读取数据
	Send_ACK();//发送应答信息

	readByte[1]= I2C_ReadByte();
	Send_ACK();

	readByte[2]= I2C_ReadByte();
	Send_ACK();

	readByte[3]= I2C_ReadByte();
	Send_ACK();

	readByte[4]= I2C_ReadByte();
	Send_ACK();

	readByte[5]= I2C_ReadByte();
	SendNot_Ack();
	//Send_ACK();

	I2C_Stop();//I2C停止函数
	//判断读取到的第一个字节是不是0x08,0x08是该芯片读取流程中规定的,如果读取过程没有问题,就对读到的数据进行相应的处理
	if( (readByte[0] & 0x68) == 0x08 )
	{
		H1 = readByte[1];
		H1 = (H1<<8) | readByte[2];
		H1 = (H1<<8) | readByte[3];
		H1 = H1>>4;

		H1 = (H1*1000)/1024/1024;

		T1 = readByte[3];
		T1 = T1 & 0x0000000F;
		T1 = (T1<<8) | readByte[4];
		T1 = (T1<<8) | readByte[5];

		T1 = (T1*2000)/1024/1024 - 500;

		AHT20_OutData[0] = (H1>>8) & 0x000000FF;
		AHT20_OutData[1] = H1 & 0x000000FF;

		AHT20_OutData[2] = (T1>>8) & 0x000000FF;
		AHT20_OutData[3] = T1 & 0x000000FF;
	}
	else
	{
		AHT20_OutData[0] = 0xFF;
		AHT20_OutData[1] = 0xFF;

		AHT20_OutData[2] = 0xFF;
		AHT20_OutData[3] = 0xFF;
		printf("读取失败!!!");

	}
	printf("\r\n");
	//根据AHT20芯片中,温度和湿度的计算公式,得到最终的结果,通过串口显示
	printf("温度:%d%d.%d",T1/100,(T1/10)%10,T1%10);
	printf("湿度:%d%d.%d",H1/100,(H1/10)%10,H1%10);
	printf("\r\n");
}

结果显示:

 二、OLED显示屏显示数据

2.1了解SPI

        ISP全称Image Signal Processing,即图像信号处理。主要用来对前端图像传感器输出信号处理的单元,以匹配不同厂商的图象传感器。ISP 通过一系列数字图像处理算法完成对数字图像的效果处理

        ISP 的控制结构如图所示,lens 将光信号投射到sensor 的感光区域后,sensor 经过光电转换,将Bayer 格式的原始图像送给ISP,ISP 经过算法处理,输出RGB 空间域的图像给后端的视频采集单元。在这个过程中,ISP 通过运行在其上的firmware 对ISP逻辑,lens 和sensor 进行相应控制,进而完成自动光圈、自动曝光、自动白平衡等功能。其中,firmware 的运转靠视频采集单元的中断驱动。PQ Tools 工具通过网口或者串口完成对ISP 的在线图像质量调节。

       ISP 由ISP 逻辑及运行在其上的Firmware 组成,逻辑单元除了完成一部分算法处理外,还可以统计出当前图像的实时信息。Firmware 通过获取ISP 逻辑的图像统计信息,重新计算,反馈控制lens、sensor 和ISP 逻辑,以达到自动调节图像质量的目的。

2.2使用OLED显示

2.2.1实验题目:

2. 理解OLED屏显和汉字点阵编码原理,使用STM32F103的SPI或IIC接口实现以下功能:

1) 显示自己的学号和姓名; 

2) 显示AHT20的温度和湿度;

3) 上下或左右的滑动显示长字符,比如“Hello,欢迎来到物联网205实训室!”或者一段歌词或诗词(最好使用硬件刷屏模式)。

2.2.2实验过程

下载官方的资料:(里面有工程)

0.96inch SPI OLED Module - LCD wiki

工程在这里,选择自己所用的芯片即可:

在这里插入图片描述

 

打开后找到oledfont.h (注意:工程需要编译了之后才会出现.h文件,打开工程先编译)

在如图的函数里复制粘贴你想写的东西,但在此之前需要字模的转换 

字模的转换可以用PCtoLCD2002完美版,转换前记得设置选择,选C51

然后去test.c中找到void TEST_MainPage(void)然后输入:

void TEST_MainPage(void)
{	
	GUI_ShowString(28,0,"xuqian",16,1);//英文姓名
	GUI_ShowCHinese(28,20,16,"徐茜",1);//中文姓名
	GUI_ShowString(4,48,"631907030727",16,1);//数字详细
	delay_ms(1500);		
	delay_ms(1500);
}

接线如下,注意烧程序的时候跳线帽是01:

在这里插入图片描述

连好线之后烧录程序后拔掉usb,将跳线帽改成00,再将usb接上电脑即可:

 

之后的滑动显示长字符也和上面的操作差不多,先取字模然后改test.c,最后因为需要滑动的效果,还需要在main.c中合适位置加上 OLED_WR_Byte(0x2F,OLED_CMD); //开启滚动

 

三、总结

     这次的温湿度和OLED的实验让我了解到了I2C总线协议和ISP,这两个实验的代码其实都很开源,网上找找就有,算是验证性实验,在OLED的时候字模和有一些代码需要改成自己想显示的字,还有一些小细节需要注意就好了。

四、参考资料

I2C总线协议详解 - Jamesjiang2050 - 博客园 (cnblogs.com)

温湿度采集的代码参考:GitHub - Sunlight-Dazzling/stm32-AHT20 at master

(62条消息) stm32通过I2C接口实现温湿度(AHT20)的采集_Harriet的博客-CSDN博客(62条消息) stm32通过I2C接口实现温湿度(AHT20)的采集_Harriet的博客-CSDN博客

(62条消息) ISP概述、工作原理及架构_一个人的红尘-CSDN博客

(62条消息) STM32Mini基于SPI接口的0.96寸OLED屏数据显示_CHL的博客-CSDN博客

 

版权声明:本文为CSDN博主「☞天天☜」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_53072511/article/details/121489563

生成海报
点赞 0

☞天天☜

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐