LCD 与 OLED 显示
给项目加一块屏幕:1602 字符 LCD、I2C 转接省引脚、SSD1306 OLED 显示文字与图形。
给项目加一块屏幕:1602 字符 LCD、I2C 转接省引脚、SSD1306 OLED 显示文字与图形。
setCursor(列,行) 定位、print() 写字符、clear() 清屏。安装:库管理器搜 "LiquidCrystal I2C"。接好 I2C 设备后,第一步永远是扫地址——不知道地址就没法初始化库。这段代码是万能工具,值得收藏:
#include <Wire.h> // Arduino 自带 I2C 库 void setup() { Wire.begin(); Serial.begin(9600); Serial.println("扫描 I2C 设备..."); } void loop() { int count = 0; for (byte addr = 1; addr < 127; addr++) { Wire.beginTransmission(addr); // endTransmission 返回 0 表示该地址有设备应答 if (Wire.endTransmission() == 0) { Serial.print("发现设备,地址 0x"); Serial.println(addr, HEX); // 以十六进制打印 count++; } } if (count == 0) Serial.println("没找到设备,检查接线!"); delay(3000); }
装 "LiquidCrystal I2C" 库,扫到地址(假设 0x27)后:
#include <LiquidCrystal_I2C.h> // 参数:地址, 列数, 行数 LiquidCrystal_I2C lcd(0x27, 16, 2); void setup() { lcd.init(); // 初始化 lcd.backlight(); // 打开背光 lcd.setCursor(0, 0); // 第 0 列,第 0 行 lcd.print("Hello Arduino"); lcd.setCursor(0, 1); // 第 0 列,第 1 行 lcd.print("gufacode.com"); } void loop() { // 在第二行动态显示秒数 lcd.setCursor(0, 1); lcd.print("Time: "); lcd.print(millis() / 1000); lcd.print("s "); // 末尾空格覆盖旧字符 delay(1000); }
LCD 不会自动擦除旧内容。数字从 100 变成 99 时,若不处理,屏上会显示 "99" 后面残留一个 "0" 变成 "990"。解决法:数字后补几个空格覆盖(如上例的 "s "),或用 lcd.clear() 整屏清除(但 clear 较慢会闪)。看不清字请调板上的蓝色电位器改对比度。
OLED 能显示图形。装 "U8g2" 库,用它显示文字和一个进度条:
#include <U8g2lib.h> #include <Wire.h> // 128x64 I2C OLED,用页缓冲模式(省 RAM) U8G2_SSD1306_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0); void setup() { u8g2.begin(); } void loop() { int progress = (millis() / 50) % 100; // 0~99 模拟进度 // 页缓冲绘制:firstPage/nextPage 循环 u8g2.firstPage(); do { u8g2.setFont(u8g2_font_ncenB10_tr); // 选字体 u8g2.drawStr(0, 15, "Arduino OLED"); // (x,y,文字) // 画进度条边框 u8g2.drawFrame(0, 30, 128, 12); // 画进度条填充 u8g2.drawBox(2, 32, progress * 124 / 100, 8); // 画一个圆 u8g2.drawCircle(110, 55, 6); } while (u8g2.nextPage()); // 逐页刷到屏幕 delay(30); }
U8g2 的分页模式:屏幕被切成几条"页",库每次只在 RAM 里缓存一页、画完刷出去,如此循环覆盖整屏。所以你的绘制代码要放在 do { ... } while(u8g2.nextPage()) 里,它会被自动重复执行多次(每页一次)。好处是只需极少 RAM,非常适合 Uno。
| 特性 | 1602 LCD | SSD1306 OLED |
|---|---|---|
| 显示内容 | 仅字符(2×16) | 任意像素/图形/文字 |
| 分辨率 | 16×2 字符 | 128×64 像素 |
| 接口 | I2C(转接)或并口 | I2C 或 SPI |
| 可视性 | 需背光,对比度一般 | 自发光,对比度极高 |
| RAM 占用 | 极小 | 较大(帧缓冲) |
| 价格/场景 | 便宜,纯文本 | 稍贵,图形界面 |
① 先跑 I2C 扫描确认地址(OLED 常见 0x3C,也有 0x3D),库里若默认地址不符要指定;② 确认 VCC 电压(多数 OLED 3.3V/5V 兼容,但有的只支持 3.3V);③ SDA/SCL 别接反;④ 选对库中的型号宏(NONAME/常见即 SSD1306 128X64);⑤ Uno 用 U8g2 而非全帧缓冲库以防 RAM 不足死机。
给项目加屏幕有两大选择。1602 字符 LCD:2 行×16 字符,只能显示文本,推荐买 I2C 转接版(PCF8574),只需 SDA/SCL 两线;用 LiquidCrystal_I2C 库,init()+backlight() 初始化、setCursor(列,行) 定位、print() 写字,刷新数字时末尾补空格覆盖残留、板上电位器调对比度。SSD1306 OLED:128×64 像素、自发光、可画任意图形,用 U8g2 库(分页模式省 RAM,绘制代码放在 firstPage/do...while(nextPage()) 里)。二者都走 I2C 总线,Uno 的 I2C 固定在 A4(SDA)/A5(SCL),多设备可并联(地址不冲突即可)。上手任何 I2C 设备的第一步都是跑地址扫描程序确认门牌号(1602 常见 0x27/0x3F,OLED 常见 0x3C)——地址不对是点不亮的头号原因。Uno 内存小,OLED 优先用 U8g2 而非全帧缓冲库。