I2C OLED Module CN

概述
Arduino OLED 模块是一个小巧且高分辨率的显示模块,可用于各种项目。基于 OLED(有机发光二极管)技术,提供出色的色彩和对比度。
OLED 工作原理
- 有机物: OLED 包含一层薄薄的有机物质,这层物质在电流通过时会发光。有机化合物具有在电刺激下发光的特性。
- 电极: OLED 面板通常由两个电极(阳极和阴极)组成,当电流流过时,有机物质会释放电子,电子与空穴结合产生光。
SSD1306
SSD1306 是用于驱动 OLED 显示器的驱动 IC(集成电路)。
它内置 1KB 的图形显示专用 RAM(GDDRAM),用于存储显示的位图模式。

| 项目 | 说明 |
|---|---|
| 内存容量 | 1KB(8192 位) |
| 页数 | 8 页(页 0-7) |
| 垂直行数 | 128 垂直行(0-127) |
| 位信息 | 每垂直行 8 位(位 0-7) |
| 计算 | 8 页 x 128 垂直行 x 8 位 = 8192 位 = 1024 字节(1KB) |
规格
| 项目 | 说明 |
|---|---|
| 屏幕尺寸 | 0.91 英寸,0.96 英寸,1.3 英寸,2.42 英寸等多种尺寸 |
| 分辨率 | 128x64 像素或 128x32 像素 |
| 显示类型 | OLED(有机发光二极管) |
| 颜色 | 单色(白色或蓝色) |
| 接口 | I2C(2 线) |
| 电压 | 3.3V ~ 5V |
| 功耗 | 待机功耗:约 0.1mA,最大功耗:约 20mA |
应用示例
电路组成
| OLED 模块引脚 | Arduino UNO/Nano | Arduino Mega |
|---|---|---|
| VCC | 5V 或 3.3V | 5V 或 3.3V |
| GND | GND | GND |
| SCL | A5 | 21 |
| SDA | A4 | 22 |

设备地址确认
此代码用于查找连接到 I2C 总线上的设备地址。
在执行以下示例之前,请先运行 I2C 扫描器,确认模块的地址。
#include <Wire.h>
void setup() {
Serial.begin(9600); // 启动串口通信
Wire.begin(); // 启动 I2C 总线
Serial.println("I2C 扫描器启动...");
}
void loop() {
byte error, address;
int nDevices = 0;
Serial.println("正在搜索 I2C 设备...");
for (address = 1; address < 127; address++) {
// 尝试连接到 I2C 设备
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0) {
Serial.print("设备发现! 地址:0x");
if (address < 16) {
Serial.print("0");
}
Serial.print(address, HEX);
Serial.println();
nDevices++;
} else if (error == 4) {
Serial.print("地址 0x");
Serial.print(address, HEX);
Serial.println(" 出现错误!");
}
}
if (nDevices == 0) {
Serial.println("未发现 I2C 设备。");
} else {
Serial.println("设备搜索完成。");
}
delay(5000); // 等待 5 秒后重新扫描
}
执行结果

库
使用 Adafruit SSD1306 库。
安装 SSD1306 时,还需安装 Adafruit BusIO 和 Adafruit GFX 库,点击“INSTALL ALL”进行安装。

1. 库提供的默认示例
点击文件 - 示例 - Adafruit SSD1306 - ssd1306_128x64 i2c 打开示例代码。
在示例代码中的 Address 部分,替换为之前通过 I2C 扫描器确认的设备地址。

执行结果
2. 文本输出
这是一个输出简单文本的示例。
使用了 0.91 英寸 OLED,考虑到该模块的分辨率为 128 x 32 像素,所以将 SCREEN_HEIGHT 从 64 改为 32。
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED 屏幕宽度
#define SCREEN_HEIGHT 32 // OLED 屏幕高度
// OLED 模块的 I2C 地址(通常为 0x3D 或 0x3C)
#define OLED_ADDR 0x3C
// 创建 Adafruit_SSD1306 对象
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
void setup() {
// 初始化 OLED
display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR);
display.clearDisplay(); // 清屏
display.setTextSize(1); // 设置文本大小
display.setTextColor(SSD1306_WHITE); // 设置文本颜色
display.setCursor(0, 0); // 设置光标位置
display.println("GONGZIPSA"); // 输出文本
display.setCursor(0, 10); // 设置光标位置
display.println("ArduWiki"); // 输出文本
display.display(); // 显示到屏幕
}
void loop() {
// 循环内无任务
}
使用的函数说明如下:
| 函数名 | 说明 |
|---|---|
begin()
|
初始化 OLED 显示屏,设置 I2C 地址和分辨率。 |
clearDisplay()
|
清除当前显示内容。 |
setTextSize(size)
|
设置显示文本的大小。size 代表倍数(例如:1、2 等)。
|
setTextColor(color)
|
设置文本的颜色。通常使用 SSD1306_WHITE 或 SSD1306_BLACK。
|
setCursor(x, y)
|
设置文本显示的位置。x 是水平位置,y 是垂直位置。
(0, 0) 是左上角, |
| println("显示内容") | 设置要显示的内容。 |
display()
|
将缓冲区中的内容显示到 OLED 屏幕上。 |
执行结果

3. 简单图形输出
这是一个输出矩形、三角形、圆形等简单图形的示例。
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_ADDR 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR);
display.clearDisplay(); // 初始化屏幕
display.drawTriangle(10, 10, 40, 30, 10, 30, WHITE); // 小三角形
display.drawRect(50, 10, 30, 20, WHITE); // 矩形
display.fillRect(90, 10, 30, 20, WHITE); // 填充矩形
display.drawCircle(25, 50, 13, WHITE); // 圆形
display.drawRoundRect(50, 40, 30, 20, 7, WHITE); // 圆角矩形
display.fillRoundRect(90, 40, 30, 20, 7, WHITE); // 填充圆角矩形
display.display();
}
void loop() {
}
与图形相关的函数如下:
| 函数名 | 说明 |
|---|---|
drawLine(x1, y1, x2, y2, color)
|
画一条连接两点的线。 |
drawRect(x, y, width, height, color)
|
画一个空心矩形。 |
fillRect(x, y, width, height, color)
|
画一个填充矩形。 |
drawCircle(x, y, radius, color)
|
画一个空心圆。 |
fillCircle(x, y, radius, color)
|
画一个填充圆。 |
drawTriangle(x1, y1, x2, y2, x3, y3, color)
|
画一个三角形。 |
drawRoundRect(x, y, width, height, radius, color)
|
画一个圆角矩形。 |
fillRoundRect(x, y, width, height, radius, color)
|
画一个填充的圆角矩形。 |
执行结果

4. ASCII 码输出
这是一个输出 ASCII 码表中 1 到 8 的字符的示例。
要输出更多字符,请参考 ASCII 码表。
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_ADDR 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR);
display.clearDisplay(); // 清除显示
// 设置文本输出
display.setTextSize(1); // 设置文本大小
display.setTextColor(WHITE); // 设置文本颜色
display.setCursor(0, 0); // 设置光标位置
// 输出 ASCII 字符
display.println("ASCII Code Print");
// 输出 ASCII 字符
for (char c = 1; c < 9; c++) { // ASCII 码 1 到 8
display.print(c); // 输出每个字符
display.print(" "); // 添加空格
}
display.display(); // 显示缓冲区内容
}
void loop() {
// 循环内没有任务
}
执行结果

5. 位图图像输出
这是一个将图像转换为字节数组并在 OLED 上显示的示例。
将图像转换为字节数组
1. 访问 image2cpp (javl.github.io)。
2. 上传图像
从左侧的「Select image」中选择并上传图像。

3. 设置图像
在画布大小中输入图像的大小,并查看预览。如果图像太大且大小调整不当,则预览中不会正确显示图像。

4. 输出
将「Code output format」设置为 Arduino Code,然后点击「Generate code」,下方会显示字节数组。
将生成的字节数组复制并在示例代码中使用。

示例代码
使用 drawBitmap(x, y, bitmap, width, height, color) 函数将位图绘制到指定位置。
color 被设置为白色,因此图像将以白色显示。
将第 12 行的 const unsigned char ~ 部分替换为之前创建的字节数组。
如果示例图像的大小(64 x 64)不同,则需要修改第 56 行 drawBitmap 函数中的 x、y 光标位置、宽度和高度。
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_ADDR 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// GONGZIPSA LOGO
const unsigned char GONGZIPSA [] PROGMEM = {
0xff, 0xff, 0xff, 0xf0, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x7f, 0xff, 0xff,
...
};
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR);
display.clearDisplay(); // 清除屏幕
}
void loop() {
display.clearDisplay(); // 清屏
// 绘制 64x64 位图图像
display.drawBitmap(32, 0, GONGZIPSA, 64, 64, WHITE); // (x, y, bitmap, width, height, color)
display.display(); // 显示缓冲区内容
}
执行结果
由于闪烁现象,拍摄时图像可能会被裁剪,但实际显示时圆形 logo 清晰可见。

