STM32+IIC+OLED屏显温湿度
引言:
在当今的科技潮流中,嵌入式系统的应用正变得日益广泛。而在这个充满创新和挑战的领域中,掌握如何操控OLED屏显和理解汉字点阵编码原理,成为了展示技术魅力的关键之一。今天,我们将一同踏入这个奇妙的数字领域,通过STM32F103的SPI或IIC接口,实现一系列令人惊叹的功能。
~
首先,我们要展示的不仅仅是冰冷的数字代码,而是你个人的身份信息。通过精巧的编程和OLED屏幕的魔法,你的学号和姓名将闪烁在屏幕上,为整个嵌入式系统注入一份个性。
~
但这还远远不够,我们的目标是让屏幕不再仅仅是数字的展示平台,而是一个信息的舞台。我们将挑战显示AHT20传感器的温度和湿度,让你的嵌入式系统真正感知周围的环境,为你带来更全面的数据体验。
~
而在技术的舞台上,我们更追求创新。通过上下或左右的滑动,我们将展示如何流畅地显示长字符。比如,“真的,荔枝不了一点”这句热情洋溢的欢迎语在屏幕上流光溢彩地呈现。
~
在这段神奇的嵌入式之旅中,我们将探索技术的无限可能性,用代码书写属于自己的数字奇迹。准备好了吗?让我们一同点亮OLED屏幕,揭开技术的面纱,开启属于你的数字冒险之旅!
~
希望你在本次学习过后,能够有一定的收获!!! 冲啊!!!! ╭ ( `∀´ )╯ ╰ ( ’ ’ )╮
文章目录
一、任务介绍
- 显示自己的学号和姓名
- 显示AHT20的温度和湿度
- 上下或左右的滑动显示长字符,比如“Hello,欢迎来到重庆交通大学物联网205实训室!”或者一段歌词或诗词(最好使用硬件刷屏模式)。
二、SPI介绍
1、SPI协议简介
1.1 SPI协议概括
SPI,是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。**SPI,是一种高速的,全双工,同步的通信总线,**并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议,比如MSP430单片机系列处理器。
1.2 SPI优点
1):支持全双工通信
2):通信简单
3):数据传输速率快
1.3 缺点
没有指定的流控制,没有应答机制确认是否接收到数据,所以跟IIC总线协议比较在数据
可靠性上有一定的缺陷。
2、 工作机制
概述
上图只是对 SPI 设备间通信的一个简单的描述, 下面就来解释一下图中所示的几个组件:
- SSPBUF:泛指 SPI 设备里面的内部缓冲区,一般在物理上是以 FIFO 的形式,保存传输过程中的临时数据;
- SSPSR:泛指 SPI 设备里面的移位寄存器,它的作用是根据设置好的数据位宽(bit-width) 把数据移入或者移出 SSPBUF;
- Controller:泛指 SPI 设备里面的控制寄存器,可以通过配置它们来设置 SPI 总线的传输模式。
通常情况下,我们只需要对上图所描述的四个管脚(pin) 进行编程即可控制整个 SPI 设备之间的数据通信:
- SCK:主要的作用是 Master(主)设备往 Slave(从)设备传输时钟信号, 控制数据交换的时机以及速率;
- SS/CS:用于 Master(主)设备片选 Slave (从)设备,使被选中的 Slave(从)设备能够被 Master(主)设备所访问;
- SDO/MOSI:在 Master(主)上面也被称为 Tx-Channel,作为数据的出口,主要用于 SPI 设备发送数据;
- SDI/MISO:在 Master(主)上面也被称为 Rx-Channel,作为数据的入口,主要用于SPI 设备接收数据;
SPI 设备在进行通信的过程中,Master 设备和 Slave 设备之间会产生一个数据链路回环(Data Loop),就像上图所画的那样, 通过 SDO 和 SDI 管脚, SSPSR 控制数据移入移出 SSPBUF,Controller 确定 SPI 总线的通信模式,SCK 传输时钟信号。
SDI(数据输入)、SDO(数据输出)、SCK(时钟)、CS(片选)
(1)、SDO/MOSI – 主设备数据输出,从设备数据输入;
(2)、SDI/MISO – 主设备数据输入,从设备数据输出;
(3)、SCK – 时钟信号,由主设备产生;
(4)、CS/SS – 从设备使能信号,由主设备控制。当有多个从设备的时候,因为每个从设备上都有一个片选引脚接入到主设备机中,当我们的主设备和某个从设备通信时将需要将从设备对应的片选引脚电平拉低或者是拉高。
三、OLED介绍
OLED简介
OLED是Organic Light-Emitting Diode的缩写,翻译成的中文名常见的是有机发光二极管,又称为有机电激光显示、有机发光半导体。最早的OLED技术研发开始于1950年代的法国南茜大学,法国物化学家安德烈・贝纳诺斯被誉为“OLED之父”,而最早的实用性OLED则于1987被柯达公司的香港人邓青云和美国人史蒂夫・范・斯莱克两人发现。
OLED结构如下图所示:
图1:OLED结构示意图
OLED可分为PMOLED(Passive Matrix OLED的缩写)和AMOLED(AcTIve Matrix OLED的缩写)。
PMOLED翻译成中文是被动驱动式OLED,其单纯地以阴极、阳极构成矩阵状,以扫描方式点亮阵列中的像素,每个像素都是操作在短脉冲模式下,为瞬间高亮度发光。优点是结构简单,可以有效降低制造成本,缺点是驱动电压高,使PMOLED不适合应用在大尺寸与高分辨率面板上。
AMOLED翻译成中文是主动驱动式OLED,其采用独立的薄膜电晶体去控制每个像素,每个像素皆可以连续且独立的驱动发光,可以使用低温多晶硅或者氧化物TFT驱动,优点是驱动电压低,发光元件寿命长。缺点是高成本及制作工艺更为复杂。
- 注:OLED技术起源于欧美,但实现大规模产业化的国家/地区主要集中在东亚,如日本、韩国、中国等地区。
OLED显示屏介绍
OLED显示屏是利用有机发光二极管制成的显示屏。由于同时具备自发光有机电激发光二极管,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性,被认为是下一代的平面显示器新兴应用技术。
有机发光显示技术由非常薄的有机材料涂层和玻璃基板构成。当有电荷通过时这些有机材料就会发光。OLED发光的颜色取决于有机发光层的材料,故厂商可由改变发光层的材料而得到所需之颜色。有源阵列有机发光显示屏具有内置的电子电路系统因此每个像素都由一个对应的电路独立驱动。
由于OLED显示屏的优点,在商业领域OLED显示屏可以适用于POS机和ATM机、复印机、游戏机等;在通讯领域则可适用于手机、移动网络终端等领域;在计算机领域则可大量应用在PDA、商用PC和家用PC、笔记本电脑上;消费类电子产品领域,则可适用于音响设备、数码相机、便携式DVD;在工业应用领域则适用于仪器仪表等;在交通领域则用在GPS、飞机仪表上等。另外,OLED显示屏在可穿戴设备上的应用也越来越广泛。
OLED显示模块(0.96吋和1.3吋)
通常项目或产品中会用到OLED裸屏或OLED显示模块,以实现OLED显示所需字符、文字或图形。OLED屏的尺寸有多种规格(有特殊需求甚至可以定值尺寸),这里介绍较为常见的两种OLED屏,一种是0.96吋OLED屏,一种是1.3吋OLED屏。通常介绍这两种OLED屏时,会有显示颜色的选择,这个需要用户自己确定,常见的选择有白色、蓝色或者显示颜色可以是蓝黄双色。
下面给出OLED裸屏和OLED显示模块的实物图。用户在设计产品时可根据实际需求选择,OLED裸屏会节省体积,设计也会更加灵活,但需要用户把焊接排线,并搭建部分外围器件。OLED显示模块则只需预留接口即可,方便接插调试,但所占体积相对比较大。
图2:OLED裸屏和OLED显示模块实物图
- 注:艾克姆科技使用的0.96吋OLED显示模块和1.3吋OLED显示模块接口完全一样,都是7芯的。
OLED显示模块的规格参数
下面介绍下0.96吋OLED显示模块的规格参数,1.3吋OLED显示模块的规格参数在此不做介绍。
表1:0.96吋OLED显示模块规格参数
参数 | 规格 |
---|---|
工作电压 | 3.3V~5V |
外形尺寸 | 27.8(L)mm × 27.3(W)mm |
显示尺寸 | 21.744mm × 10.864mm |
通信接口 | 3线SPI、4线SPI、IIC接口 |
分 辨 率 | 128 × 64 |
显示颜色 | 蓝、白、黄蓝 |
控制芯片 | SSD1306 |
工作温度 | -40~70度 |
重量 | 5g |
引脚数 | 7个 |
- 注:OLED屏无字库,需要用取模软件取字,还可以显示图形。
OLED显示模块的管脚定义
下面介绍下0.96吋OLED显示模块的管脚定义,1.3吋OLED显示模块的管脚定义和0.96吋OLED显示模块的管脚定义完全一致。
表2:0.96吋OLED显示模块管脚定义
序号 | 管脚名 | 功能描述 |
---|---|---|
1 | GND | 模块供电地 |
2 | VCC | 模块供电正 |
3 | CLK(D0) | 在SPI和IIC通信中为时钟管脚 |
4 | DIN(D1) | 在SPI和IIC通信中为数据管脚 |
5 | RES | 复位管脚(低电平有效) |
6 | DC | 命令和数据控制管脚(低电平发送命令,高电平发送数据) |
7 | CS | OLED片选管脚 |
- 注:OLED屏也有8个管脚的,用户在使用不同接口的OLED屏时请注意。
OLED显示模块和开发板连接
OLED显示模块模块可以使用各种类型的MCU驱动,如STM32系列单片机、STC15系列单片机、LPC系列单片机以及各种蓝牙BLE芯片等。
四、文字取模
对于 1616 的矩阵来说,它所需要的位数共是 1616=256 个位,每个字为 8 位,因此,每个汉字都需要用 256/8=32 个字节来表示。
每两个字节代表一行的 16 个点,共需要 16 行,显示汉字时,只需一次性读取 32 个字节,并将每两个字节为一行打印出来,即可形成一个汉字。
因此借助取模工具即可实现指定字符的取模
分享一个取模快捷网站(上面这个)
产生对应的字模(使用上面的网站,如下图)
五、效果展示
实验效果
- 显示自己的学号和姓名
- 显示AHT20的温度和湿度
温湿度OLED
- 上下或左右的滑动显示长字符~~~真的,荔枝不了一点
流水字幕
六、代码
硬件接线图
在这里插入图片描述
main.c文件
#include "main.h"
#include "dma.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <stdio.h>
#include "AHT20-21_DEMO_V1_3.h"
#include "oled.h"
#include "tb6612.h"
#include "bmp.h"
float tem; // 温度
float dam; // 湿度
uint32_t CT_data[2] = {0, 0};
int main(void)
{
/* USER CODE BEGIN 1 */
volatile int c1, t1;
AHT20_Init();
OLED_Init(); // 初始化OLED
OLED_Clear();
uint8_t t = ' ';
OLED_Init();
OLED_ColorTurn(0); // 0正常显示,1 反色显示
OLED_DisplayTurn(0); // 0正常显示 1 屏幕翻转显示
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
// OLED_ShowChinese(0, 0, 0, 16, 1); // 吴
// OLED_ShowChinese(18, 0, 1, 16, 1); // 乐
// OLED_ShowChinese(36, 0, 2, 16, 1); // 鑫
// OLED_ShowChinese(54, 0, 15, 16, 1); // !
// OLED_ShowChinese(72, 0, 15, 16, 1); // !
// OLED_ShowChinese(90, 0, 15, 16, 1); // !
// OLED_ShowString(8, 16, "632102130104", 16, 1);
// OLED_Refresh();
// HAL_Delay(500);
AHT20_Read_CTdata_crc(CT_data); // crc校验后,读取AHT20的温度和湿度数据
c1 = CT_data[0] * 1000 / 1024 / 1024; // 计算得到湿度值c1(放大了10倍)
t1 = CT_data[1] * 2000 / 1024 / 1024 - 500; // 计算得到温度值t1(放大了10倍)
dam = c1 / 10 + (float)(c1 % 10) * 0.1;
tem = t1 / 10 + (float)(t1 % 10) * 0.1;
// OLED_ShowChinese(0, 0, 3, 16, 1); // 温
// OLED_ShowChinese(16, 0, 5, 16, 1); // 度
// OLED_ShowChinese(32, 0, 16, 16, 1); // :
// OLED_ShowChinese(0, 18, 4, 16, 1); // 湿
// OLED_ShowChinese(16, 18, 5, 16, 1); // 度
// OLED_ShowChinese(32, 18, 16, 16, 1); // :
// 温度显示
// OLED_ShowNum(48, 0, tem, 2, 16, 1);
// OLED_ShowChar(64, 0, '.', 16, 1); // 显示ASCII字符
// OLED_ShowNum(72, 0, (int)(tem * 10) % 10, 1, 16, 1);
// 湿度显示
// OLED_ShowNum(48, 18, dam, 2, 16, 1);
// OLED_ShowChar(64, 18, '.', 16, 1); // 显示ASCII字符
// OLED_ShowNum(72, 18, (int)(dam * 10) % 10, 1, 16, 1);
// OLED_Refresh();
// OLED_ScrollDisplay(10, 2, 0);
printf("\r\n");
printf("温度: %.2f 湿度: %.2f \r\n", tem, dam);
HAL_Delay(500);
}
/* USER CODE END 3 */
}
七、总结
实验总结:
~
在这次实验中,我们成功地利用STM32F103的SPI或IIC接口,实现了一系列引人入胜的功能,充分展示了OLED屏显和汉字点阵编码原理的威力。以下是本次实验的主要总结:
~
首先,通过掌握OLED屏显的原理和SPI/IIC接口的使用,我们成功地在屏幕上显示了个人学号和姓名。这不仅仅是数字的呈现,更是对嵌入式系统个性化展示的一次探索。这一步为我们的数字冒险奠定了基础。
~
其次,通过与AHT20传感器的协同工作,我们成功地将环境数据融入到嵌入式系统中。温度和湿度的实时显示使得我们的系统不再局限于抽象的数字,而是真正地感知和反馈周围的环境变化,为应用场景的扩展提供了更多可能性。
~
最令人振奋的是,在屏幕上流畅展示长字符的过程中,我们充分发挥了硬件刷屏模式的优势。长字符的滑动显示不仅呈现了更为丰富的信息,而且通过硬件刷屏,我们成功地提高了显示的效率,使得整个过程更为流畅自然。
~
总的来说,通过这次实验,我们不仅仅掌握了STM32F103的SPI/IIC接口的使用,更深入理解了OLED屏显和汉字点阵编码原理。实现学号和姓名的显示、AHT20传感器数据的实时展示以及流畅的长字符滑动显示,让我们对嵌入式系统的应用有了更为全面的认识。这次实验为我们打开了数字冒险的大门,引领我们进入一个充满创新和可能性的数字世界。
最后感谢大佬友情链接:
- https://zhuanlan.zhihu.com/p/150121520
- https://zhuanlan.zhihu.com/p/646039124