Arduino Uno 点亮OLED屏幕(SSD1306,4PIN,IIC)
目录
实验效果
简单演示Arduino Uno如何点亮OLED屏幕,显示一些简单的英文或字符。
注意:本示例使用的OLED屏幕的芯片型号是 「SSD1306」,单色,128x64像素,0.96英寸。请确认您的屏幕的芯片和像素,对实验的成功非常关键。
元件说明
OLED显示屏不需要背光,因此在黑暗的环境中能获得非常好的对比度。另外,它的像素只有在开启的时候才会消耗能量,所以与其他显示器相比,OLED显示器的功耗更低。
没有背光源大大降低了运行OLED所需的功率。平均来说,显示屏的耗电量约为20mA,不过这取决于显示屏的点亮程度。
该模块的核心是一个功能强大的单芯片CMOS OLED驱动控制器——SSD1306。它可以通过多种方式与微控制器通信,包括I2C和SPI。
SPI一般比I2C快,但需要更多的I/O引脚。而I2C只需要两个引脚,并且可以与其他I2C外设共享。这是在引脚和速度之间的权衡。有的型号还多了一个RESET引脚。
在本示例中使用的型号只有四个引脚,与Arduino使用I2C通信协议进行通信。
SSD1306控制器的工作电压为1.65V至3.3V,而OLED面板需要7V至15V的电源电压。所有这些不同的电源需求都可以通过内部的充电泵电路来满足。这使得它可以轻松地连接到Arduino或任何5V逻辑微控制器,而无需使用任何逻辑电平转换器。
无论OLED模块的大小,SSD1306驱动都为屏幕内置了1KB图形显示数据RAM(GDDRAM),其中保存了要显示的位图。这个1K的内存区域被组织成8页(从0到7)。每页包含128个列/段(0到127块)。而每一列可以存储8位数据(从0到7)。
8页x 128段x 8位数据= 8192位= 1024字节= 1KB内存
- 显示技术 OLED(Organic LED)
- MCU通信 I2C / SPI
- 屏幕尺寸 跨度0.96英寸
- 解析度 128×64像素
- 工作电压 3.3V – 5V
- 工作电流 最大20mA
- 可视角度 160°
- 每行字符 21
- 字符行数 7
引脚说明
GND 为接地 VCC 为供电(需要供电3.3V-5V) SCL 为I2C时钟线 SDA 为I2C数据线
BOM表
名称 | 数量 |
---|---|
Arduino Uno | x1 |
OLED屏幕(SSD1306) | x1 |
面包板 | x1 |
跳线(杜邦线) | 若干 |
接线方式
Arduino Uno 引脚 | <-> | OLED 引脚 |
---|---|---|
GND | <-> | GND |
3.3V | <-> | VCC |
A5 | <-> | SCL |
A4 | <-> | SDA |
程序提点
要顺利运行OLED的程序,需要安装以下两个库。 安装方法很简单,在菜单栏依次打开: 菜单栏「工具」-> 「管理库」
在弹出的库管理窗口中的搜素对应的关键字,找到对应的库(注意要找对库名称和库作者),点击安装,等待安装完成即可。
安装库 Adafruit_GFX_Library
安装库 Adafruit_SSD1306
定义屏幕的分辨率
SSD1306控制器的多功能性,使得该模块具有不同的尺寸和颜色:例如128x64、128×32,使用同样的库,进行开发。
像如下代码,声明了正在使用的OLED屏幕的分辨率是128x64,如果您使用了其他分辨率请进行对应的修改。
Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire);
定义屏幕的I2C地址
一般默认的OLED屏幕的地址是0x3C,但我也遇到过不是这个地址的模块,如果有时候发现你的OLED屏幕,不亮,也许是I2C地址设置错了。
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
清空屏幕
使用以下代码,作用是清空整个屏幕的显示,熄灭所有亮起来的像素。
display.clearDisplay();
屏幕更改生效
最后,别忘了使用display()函数,使屏幕的更改生效
display.display();
还有其他函数,它们将帮助你处理OLED显示库,以编写文本或绘制简单的图形。
display.drawPixel(x,y, color) - 以x,y为坐标绘制一个像素。 display.setTextSize(n) - 设置字体大小,支持1-8号字体。 display.setCursor(x,y) - 设置开始显示文字的坐标。 display.print("message") - 打印x,y位置的字符。 display.display() - 调用此方法使更改生效。
程序代码
#include <SPI.h> // 加载SPI库
#include <Wire.h> // 加载Wire库
#include <Adafruit_GFX.h> // 加载Adafruit_GFX库
#include <Adafruit_SSD1306.h> // 加载Adafruit_SSD1306库
// 定义 OLED屏幕的分辨率
Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire);
void setup() {
Serial.begin(9600); // 设置串口波特率
Serial.println("OLED FeatherWing test"); // 串口输出
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // 设置OLED的I2C地址
display.clearDisplay(); // 清空屏幕
display.setTextSize(1); // 设置字体大小
display.setTextColor(SSD1306_WHITE); // 设置字体颜色
display.setCursor(0,0); // 设置开始显示文字的坐标
display.println("Hello World!"); // 输出的字符
display.println(" by Lingshunlab.com");
display.display(); // 使更改的显示生效
}
void loop() {
}
上传程序后,即可看到屏幕显示所输出的的字符。