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() {

}

上传程序后,即可看到屏幕显示所输出的的字符。