#c

Arduino与12864 OLED图形显示屏

I2C连接与U8g2库应用详解

#c
@魅客科创中心

CONTENTS

目录

1. 12864 OLED简介

1. 12864 OLED简介

  • 12864 OLED:一种常见的有机发光二极管(Organic Light-Emitting Diode)显示模块,分辨率为128×64像素,可显示图形和文字。
  • 主要特点
    • 自发光:无需背光源,每个像素点自身发光。
    • 高对比度:黑色区域完全不发光,对比度极高。
    • 低功耗:仅点亮的像素消耗电量,黑色区域不耗电。
    • 视角宽:几乎180度视角都能清晰观看。
    • 响应速度快:微秒级响应,无拖影现象。
    • 支持多种接口:I2C、SPI、并行等。
  • 常见控制器:SSD1306、SH1106等。
  • 应用场景:广泛应用于各种DIY电子项目,用于显示菜单界面、简单图形、数据可视化、游戏等。
返回目录 Arduino 12864 OLED显示屏 魅客科创中心

2. OLED显示原理

2.1 OLED显示原理

  • OLED (有机发光二极管):一种使用有机材料制成的发光二极管,当通电时能自行发光。
  • 基本结构
    • 阳极层(通常为透明导电材料ITO)
    • 有机发光层(含发光有机材料)
    • 阴极层(通常为金属)
  • 工作原理
    • 当电流通过OLED时,电子从阴极注入,空穴从阳极注入。
    • 电子和空穴在有机发光层中结合,释放能量形式为光子。
    • 不同的有机材料可以发出不同颜色的光。
  • 与LCD的区别
    • LCD需要背光源,而OLED自身发光。
    • LCD通过控制液晶分子排列来调节光线通过,而OLED直接控制每个像素点的发光强度。
    • OLED关闭的像素完全不发光,因此能实现真正的黑色和极高的对比度。
返回目录 Arduino 12864 OLED显示屏 魅客科创中心

2.2 12864 OLED的结构与工作原理

  1. 像素矩阵:12864 OLED由128×64个独立控制的像素点组成,每个像素可以单独控制亮灭状态。
  2. 控制器:常见的12864 OLED控制器有SSD1306、SH1106等,负责接收指令和数据,控制像素显示。
  3. 存储器:内置GDDRAM(图形显示数据RAM),用于存储当前显示的内容。
    • 对于SSD1306控制器,GDDRAM被组织为8页,每页128列。
    • 每个字节控制8个垂直排列的像素点。
  4. 显示模式
    • 页寻址模式:按页更新显示内容,适合显示静态图像。
    • 水平寻址模式:按行更新显示内容,适合动画效果。
    • 垂直寻址模式:按列更新显示内容,适合特殊效果。
  5. 颜色:常见的12864 OLED有单色(白色或蓝色)和双色(黄蓝双色)两种。
返回目录 Arduino 12864 OLED显示屏 魅客科创中心

3. I2C连接方式

3.1 I2C连接方式

  • I2C (Inter-Integrated Circuit):一种串行通信协议,只需要两根信号线。
  • 所需引脚:仅需要2个Arduino的IO口。
    • SDA (Serial Data Line):数据线
    • SCL (Serial Clock Line):时钟线
  • I2C特点
    • 主从架构
    • 地址寻址(每个设备有唯一地址)
    • 支持多设备共享总线
    • 较低的传输速度(标准模式100kHz,快速模式400kHz)
  • 接线图示例 (SSD1306控制器)
    • OLED VCC -> Arduino 5V/3.3V (根据模块要求)
    • OLED GND -> Arduino GND
    • OLED SCL -> Arduino A5 (SCL)
    • OLED SDA -> Arduino A4 (SDA)
    • 注意:Arduino Uno/Nano的I2C引脚为A4(SDA)和A5(SCL)
    • Arduino Mega的I2C引脚为20(SDA)和21(SCL)
    • Arduino Leonardo的I2C引脚为2(SDA)和3(SCL)

I2C连接示意图

返回目录 Arduino 12864 OLED显示屏 魅客科创中心

3.2 I2C地址设置

  • 默认地址:大多数12864 OLED模块的默认I2C地址为0x3C0x3D
  • 地址确定方法
    1. 查看模块说明书:制造商通常会在说明书中标明I2C地址。
    2. 查看模块背面:有些模块会在PCB背面标注I2C地址。
    3. 使用I2C扫描程序:通过Arduino运行I2C扫描程序来确定地址。
// I2C扫描程序示例
#include <Wire.h>

void setup() {
  Wire.begin();
  Serial.begin(9600);
  Serial.println("I2C Scanner");
}

void loop() {
  byte error, address;
  int nDevices = 0;

  Serial.println("Scanning...");

  for(address = 1; address < 127; address++) {
    Wire.beginTransmission(address);
    error = Wire.endTransmission();

    if (error == 0) {
      Serial.print("I2C device found at address 0x");
      if (address < 16) Serial.print("0");
      Serial.print(address, HEX);
      Serial.println();
      nDevices++;
    }
  }
  
  if (nDevices == 0) Serial.println("No I2C devices found");
  else Serial.println("Scan complete");
  
  delay(5000);
}
返回目录 Arduino 12864 OLED显示屏 魅客科创中心

3.3 I2C连接 - 代码示例 (U8g2库)

#include <U8g2lib.h>
#include <Wire.h>

// 初始化U8g2库,使用I2C接口
// 构造函数格式: U8G2_显示控制器_分辨率_缓冲区模式_接口
// 缓冲区模式: 1 = 单缓冲, 2 = 双缓冲, F = 全缓冲
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

void setup() {
  // 初始化OLED
  u8g2.begin();
  // 设置字体
  u8g2.setFont(u8g2_font_ncenB08_tr);
}

void loop() {
  // 清除缓冲区
  u8g2.clearBuffer();
  
  // 绘制文本
  u8g2.drawStr(0, 20, "Hello, Arduino!");
  u8g2.drawStr(0, 40, "12864 OLED Test");
  
  // 绘制一个框
  u8g2.drawFrame(0, 0, 128, 64);
  
  // 绘制一个实心矩形
  u8g2.drawBox(100, 10, 20, 20);
  
  // 将缓冲区内容发送到显示器
  u8g2.sendBuffer();
  
  // 延时2秒
  delay(2000);
}
返回目录 Arduino 12864 OLED显示屏 魅客科创中心

3.4 I2C连接 - 优缺点

  • 优点
    • 极简接线:仅需2个IO口,节省Arduino引脚资源。
    • 接线简单:减少错误接线的可能性。
    • 支持多设备:可以在同一总线上连接多个I2C设备。
    • 标准化:I2C是一种广泛使用的标准协议。
  • 缺点
    • 速度较慢:相比SPI和并行接口,刷新率较低。
    • 地址冲突:如果连接多个相同地址的I2C设备,需要额外的地址转换器。
    • 距离限制:I2C不适合长距离通信。
返回目录 Arduino 12864 OLED显示屏 魅客科创中心

4. 图形绘制与中文显示

4.1 图形绘制功能

12864 OLED的一大优势是可以绘制各种图形,U8g2库提供了丰富的图形绘制函数:

// 绘制点
u8g2.drawPixel(x, y);

// 绘制线
u8g2.drawLine(x1, y1, x2, y2);

// 绘制矩形
u8g2.drawFrame(x, y, width, height);  // 空心矩形
u8g2.drawBox(x, y, width, height);    // 实心矩形

// 绘制圆
u8g2.drawCircle(x, y, radius, U8G2_DRAW_ALL);        // 空心圆
u8g2.drawDisc(x, y, radius, U8G2_DRAW_ALL);          // 实心圆

// 绘制椭圆
u8g2.drawEllipse(x, y, rx, ry, U8G2_DRAW_ALL);  // 空心椭圆
u8g2.drawFilledEllipse(x, y, rx, ry, U8G2_DRAW_ALL);  // 实心椭圆

// 绘制三角形
u8g2.drawTriangle(x1, y1, x2, y2, x3, y3);

// 绘制位图
u8g2.drawXBM(x, y, width, height, bitmap);

// 绘制圆角矩形
u8g2.drawRFrame(x, y, width, height, radius);  // 空心圆角矩形
u8g2.drawRBox(x, y, width, height, radius);    // 实心圆角矩形

// 绘制字符串
u8g2.drawStr(x, y, "Text");  // 使用当前字体绘制字符串
返回目录 Arduino 12864 OLED显示屏 魅客科创中心

4.2 中文显示

12864 OLED支持中文显示,U8g2库提供了多种中文字库:

#include <U8g2lib.h>
#include <Wire.h>

U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

void setup() {
  u8g2.begin();
  // 设置中文字体
  u8g2.setFont(u8g2_font_wqy12_t_chinese1);  // 文泉驿12点阵中文字体
}

void loop() {
  u8g2.clearBuffer();
  
  // 显示ASCII字符
  u8g2.drawStr(0, 20, "Hello");
  
  // 显示中文
  u8g2.setCursor(0, 40);
  u8g2.print("你好世界");  // 直接使用print方法显示中文
  
  u8g2.sendBuffer();
  delay(2000);
}

注意

  1. U8g2库内置了多种中文字库,如文泉驿系列:
    • u8g2_font_wqy12_t_chinese1:12像素高度
    • u8g2_font_wqy13_t_chinese1:13像素高度
    • u8g2_font_wqy14_t_chinese1:14像素高度
    • u8g2_font_wqy15_t_chinese1:15像素高度
    • u8g2_font_wqy16_t_chinese1:16像素高度
  2. 中文字库较大,会占用较多的程序存储空间,请根据Arduino板的闪存大小选择合适的字库。
  3. 如果需要显示自定义字符,可以使用U8g2的字体编辑工具生成自己的字库。
返回目录 Arduino 12864 OLED显示屏 魅客科创中心

4.3 动画效果

OLED显示屏的高刷新率使其非常适合显示简单动画:

#include <U8g2lib.h>
#include <Wire.h>

U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

int position = 0;
int direction = 1;

void setup() {
  u8g2.begin();
  u8g2.setFont(u8g2_font_ncenB08_tr);
}

void loop() {
  // 更新位置
  position += direction;
  if (position > 100 || position < 0) {
    direction = -direction;
  }
  
  // 绘制动画帧
  u8g2.clearBuffer();
  u8g2.drawBox(position, 20, 28, 28);
  u8g2.sendBuffer();
  
  // 控制帧率
  delay(10);
}
返回目录 Arduino 12864 OLED显示屏 魅客科创中心

5. 总结与展望

5. 总结与展望

  • 12864 OLED的优势
    • 自发光,高对比度,视角宽。
    • 低功耗,特别适合电池供电的项目。
    • 响应速度快,适合显示动画效果。
    • 无需背光源,结构简单,体积小。
  • I2C连接方式的优势
    • 仅需2个IO口,节省Arduino资源。
    • 接线简单,减少错误可能性。
    • 可与其他I2C设备共享总线。
  • U8g2库的强大功能
    • 支持多种控制器和显示屏。
    • 丰富的图形绘制函数。
    • 内置多种字体,包括中文字库。
    • 良好的文档和示例。
  • 应用场景
    • 数据可视化:温湿度、气压等传感器数据显示。
    • 用户界面:菜单系统、设置界面。
    • 游戏开发:简单的图形游戏。
    • 状态指示:系统运行状态、错误信息等。
  • 展望
    • 结合其他传感器,创建完整的监控系统。
    • 使用更高级的图形库,实现复杂的用户界面。
    • 尝试彩色OLED显示屏,实现更丰富的视觉效果。
    • 探索低功耗应用,延长电池供电项目的使用时间。
返回目录 Arduino 12864 OLED显示屏 魅客科创中心

演讲者备注: - 欢迎学生,介绍12864 OLED及其在Arduino项目中的应用。 - 强调本讲义将介绍I2C连接方式和U8g2库的使用方法。

目录页: - 12864 OLED简介 - OLED显示原理 - I2C连接方式 - 图形绘制与中文显示 - 总结

转场页: - 引入12864 OLED的基本概念和特点。

12864 OLED简介: - 什么是12864 OLED?(128×64像素有机发光二极管显示屏) - 主要特点:自发光、高对比度、可显示图形、中文字符等。 - 常见应用:项目数据可视化、菜单界面、简单游戏等。

转场页: - 简要介绍即将解释OLED显示的基本工作方式。

OLED显示原理: - 与LCD不同,OLED是自发光技术。

转场页: - 介绍12864 OLED的I2C连接方式。

I2C连接: - I2C通信协议简介 - 与Arduino的接线图 - 优缺点分析

转场页: - 介绍12864 OLED的图形绘制和中文显示功能。

讲义结束,感谢大家! 鼓励提问和动手实践。