文章目录[隐藏]
目录
一、温湿度的采集
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总线协议
由于本次的温湿度采集需要通过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
暂无评论