Arduino UNO 驱动 Nokia 5110 LCD 旋钮编码器菜单系统构建指南
核心硬件清单
- Arduino UNO ×1
- Nokia 5110 LCD(PCD8544 控制器) ×1 — 84×48 像素,超低功耗(背光关 0.4 mA,休眠 0.06 mA)
- 旋转编码器(带按键) ×1 — 5 线接口(CLK, DT, SW, VCC, GND)
- 面包板 + 跳线 若干
软件库依赖
- Adafruit GFX Library:GitHub
- Adafruit PCD8544 Nokia 5110 Library:GitHub
- Encoder Library:GitHub
- TimerOne Library:GitHub
接线指南
| 模块引脚 | Arduino 引脚 | 备注 |
|---|---|---|
| RST | D3 | |
| CE | D4 | |
| DC | D5 | |
| DIN | D11 | SPI MOSI |
| CLK | D13 | SPI SCK |
| VCC | 3.3V | 严禁接 5V! |
| BL | D7 | 背光 PWM 控制 |
| GND | GND | |
| 编码器 CLK | A0 | |
| 编码器 DT | A1 | |
| 编码器 SW | A2 | 按键输入 |
| 编码器 VCC/GND | 5V/GND |
菜单系统架构设计
核心状态变量
page:当前 UI 页面(1=主菜单,2=参数编辑)menuItem:当前高亮菜单项(1~6)frame:显示窗口起始项(每屏 3 项,frame=1 显示 1~3,frame=2 显示 2~4…)
菜单项定义(可轻松扩展)
String menuItem1 = "Contrast";
String menuItem2 = "Volume";
String menuItem3 = "Language";
String menuItem4 = "Difficulty";
String menuItem5 = "Light: ON";
String menuItem6 = "Reset";
boolean backlight = true;
int contrast = 60;
int volume = 50;
String language[3] = {"EN", "ES", "EL"}; int selectedLanguage = 0;
String difficulty[2] = {"EASY", "HARD"}; int selectedDifficulty = 0;
绘制流程(drawMenu 函数)
- 清屏,绘制标题栏。
- 根据
frame计算本屏显示的 3 个菜单项索引。 - 高亮当前
menuItem(反色显示),其余正常显示。 - 若
page==2,进入参数编辑界面:显示当前项名称、当前值,编码器旋转修改值,按键确认返回主菜单。
主循环逻辑
void loop() {
drawMenu(); // 刷新显示
readEncoder(); // 更新 menuItem / frame / 参数值
checkButtonPress(); // 短按切换 page,长按等扩展功能可自行添加
}
关键技术点
- 帧滚动机制: 当
menuItem超出当前帧范围时,自动增减frame实现菜单滚动。 - 参数编辑通用化: 通过数组存储选项文本,新增菜单项只需修改数组,无需改动绘制逻辑。
- 低功耗优化建议: 当前采用轮询按键,后续可改用引脚中断唤醒,进一步降低功耗。
测试验证
上传代码后,LCD 显示主菜单,旋转编码器可上下导航,按下按键进入参数编辑(如调节对比度、音量、语言、难度、背光开关、复位),再次按键返回。操作流畅,响应无感延迟。
扩展建议
- 增加子菜单层级,支持多级嵌套。
- 引入 EEPROM 存储用户设置,掉电保持。
- 结合 RTC 模块实现定时任务菜单。
- 移植至 ESP8266/ESP32,增加 Wi-Fi 配网界面。
制造工艺
- 用 Arduino 打造绚丽显示器 Ambilight 系统
- 用 Arduino Nano 和 Nokia 5110 LCD 自制 20kHz 示波器:简易 DIY 指南
- Arduino UNO 驱动 16x2 LCD 实现动画与小游戏
- Arduino 与智能手机打造智能电压表——简单易做的 DIY 项目
- 基于 Arduino 与 MAX30100 的实时物联网心率监测系统
- Arduino Uno WiFi 网页服务器:通过浏览器控制 LED 开关
- Arduino DIY 电压表:Nokia 5110 屏幕显示,手把手教学
- 自制高精度测距轮:Arduino Nano + 旋转编码器 + 1602 LCD
- Arduino 自动化 Chrome 恐龙游戏 - LDR 光敏电阻 + Python 实现全自动跳跃
- 使用 Arduino Nano 和 RDA8057M 制作紧凑型 FM 收音机
- 无线Arduino编程盾:HC-05蓝牙模块实现免USB线烧录
- Arduino 电容式触控开关:一枚硬币点亮 LED 的极简 DIY