基于I2C/SPI的温湿度采集与OLED显示

本文详细介绍了如何使用STM32通过SPI协议与0.96寸OLED显示屏进行通信,展示汉字、数字及字符滚动效果。同时,结合AHT20传感器,展示了如何读取并显示温度和湿度信息。通过代码实例,解析了相关配置和函数调用,帮助读者理解嵌入式系统中传感器数据的获取与显示过程。
摘要由CSDN通过智能技术生成

一、概念相关

1.SPI是什么

SPI是串行外设接口(Serial Peripheral Interface)的缩写,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,越来越多的芯片集成了这种通信协议,比如AT91RM9200。

2.SPI协议

SPI总线是一种4线总线,因其硬件功能很强,所以与SPI有关的软件就相当简单,使中央处理器(Central Processing Unit,CPU)有更多的时间处理其他事务。正是因为这种简单易用的特性,越来越多的芯片集成了这种通信协议,比如AT91RM9200。SPI是一种高速、高效率的串行接口技术。
SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以(单向传输时)。也是所有基于SPI的设备共有的,它们是MISO(主设备数据输入)、MOSI(主设备数据输出)、SCLK(时钟)、CS(片选)。
(1)MISO– Master Input Slave Output,主设备数据输入,从设备数据输出;
(2)MOSI– Master Output Slave Input,主设备数据输出,从设备数据输入;
(3)SCLK – Serial Clock,时钟信号,由主设备产生;
(4)CS – Chip Select,从设备使能信号,由主设备控制。

二、0.96寸OLED显示屏显示

1.显示汉字及数字

(1)准备工作

①工具:keil + STM32F103C8最小开发版 + 0.96寸OLED显示屏
②DEMO程序:下载链接
③串口连线(按照下表对应连接即可):
在这里插入图片描述
④字模准备
需要使用PCtoLCD2002工具,直接在网上搜索下载即可。
打开软件即可进行字模的生成,但是需要注意修改设置。
在这里插入图片描述
在这里插入图片描述

(2)代码修改

由于使用的样本代码,并没有STM32F103C8这个种类,就用同一个系列的STM32F103RC。
在这里插入图片描述
打开gui.c里的oledfont.h文件,可以在这里增加自己定义的字模。
在这里插入图片描述
定义函数

void TEST_MainPage(void)
{	
	GUI_ShowCHinese(28,24,16,"狴鲲",1);//显示中文名
	GUI_ShowString(4,48,"111222333444",16,1);//显示学号
	delay_ms(1500);		
	delay_ms(1500);
}

main函数

int main(void)
{	
	delay_init();	    	       //延时函数初始化	  
	OLED_Init();			         //初始化OLED  
	OLED_Clear(0);             //清屏(全黑)
	while(1) 
	{	
		TEST_MainPage();         //界面显示
	}
}

(3)运行结果

在这里插入图片描述

2.字符滚动

(1)代码修改

水平左右滚动

OLED_WR_Byte(0x2E,OLED_CMD);        //关闭滚动
OLED_WR_Byte(0x26,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);        //虚拟字节
OLED_WR_Byte(0x2F,OLED_CMD);        //开启滚动

垂直和水平滚动

OLED_WR_Byte(0x2e,OLED_CMD);        //关闭滚动
OLED_WR_Byte(0x29,OLED_CMD);        //水平垂直和水平滚动左右 29/2a
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);        //终止页 1
OLED_WR_Byte(0x01,OLED_CMD);        //垂直滚动偏移量
OLED_WR_Byte(0x2F,OLED_CMD);        //开启滚动

main函数

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);        //开启滚动
	}

数据定义

void TEST_MainPage(void)
{	
	GUI_ShowCHinese(10,0,16,"帝王将相几抔土",1);
	delay_ms(1500);		
	delay_ms(1500);
}

(2)运行结果

不会有人这么晚了才交作业吧

3.配合AHT20显示温度和湿度

1.准备工作

①导入文件:将上面OLED显示的文件导入AHT20的代码文件内
在这里插入图片描述
②同时在keil内也需要导入

(2)代码修改

增加show_info函数,将信息显示到OLED屏上

void show_info(){
	GUI_ShowCHinese(10,10,16,"温湿度显示",1);
	
  GUI_ShowString(5,50,"温度:",16,1);
	GUI_ShowNum(40,50,T1/100,1,16,1);
	GUI_ShowNum(49,50,(T1/10)%10,1,16,1);
	GUI_ShowString(56,50,".",16,1);
	GUI_ShowNum(58,50,T1%10,1,16,1);
	
	GUI_ShowString(70,50,"湿度:",16,1);
	GUI_ShowNum(100,50,H1/100,1,16,1);
	GUI_ShowNum(109,50,(H1/10)%10,1,16,1);
	GUI_ShowString(116,50,".",16,1);
	GUI_ShowNum(118,50,H1%10,1,16,1);
}

main函数

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();//读取温湿度
		show_info();//显示
		delay_ms(5000);//延时
		OLED_Clear(0);//清屏
		read_AHT20_once();//读取温湿度
		show_info();
		delay_ms(5000);
		OLED_Clear(0);
		
  }
}

(3)运行结果

下次再晚交作业我就去操场倒立

三、总结

本次实验学会了如何使用OLED进行字符的显示,学会了如何利用AHT20配合OLED进行温湿度显示。

参考链接

SPI (SPI协议)
基于STM32的温湿度采集——OLED显示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值