使用 Arduino 移位寄存器创建绚丽灯光序列
项目概述
本项目演示如何使用 Arduino UNO 和 74HC595 移位寄存器控制 8 个 LED,并通过 LCD 显示屏和按钮实现动画的编辑、播放、速度调节及循环次数设置。无需修改代码即可通过菜单交互创建自定义灯光动画,适合初学者学习移位寄存器、数组操作及人机交互界面设计。
核心功能
- 动画编辑:逐帧设置 8 个 LED 的开关状态,支持光标前后移动
- 参数调节:可调节帧间延时(动画速度)与循环播放次数
- 菜单交互:4 个按钮配合 16×2 LCD 实现完整菜单导航
- 断电保护:动画数据存储在数组中,上电后可直接播放
硬件清单
| 组件 | 数量 | 备注 |
|---|---|---|
| Arduino UNO | 1 | 主控板 |
| 74HC595 移位寄存器 | 1 | 扩展 8 路输出 |
| LED(通用) | 8 | 配合 220Ω 电阻 |
| 电阻 220Ω | 9 | LED 限流 + 按钮上拉 |
| 电阻 10kΩ | 4 | 按钮下拉电阻 |
| 按钮 | 4 | 菜单导航与数值修改 |
| 旋转电位器 | 1 | LCD 对比度调节 |
| 16×2 LCD 显示屏 | 1 | HD44780 兼容 |
| 面包板 ×2、跳线若干 | - | 搭建电路 |
电路连接要点
74HC595 引脚映射
- DS (Pin 14) → Arduino Pin 12 (dataPin)
- SH_CP (Pin 11) → Arduino Pin 13 (clockPin)
- ST_CP (Pin 12) → Arduino Pin 11 (latchPin)
- Q0-Q7 → 8 个 LED 陽极(阴极接地,串联 220Ω)
- OE (Pin 13) 接地,MR (Pin 10) 接 VCC
LCD 接线(4 位模式)
- RS → A1 (Pin 15), EN → A0 (Pin 14)
- D4-D7 → Pin 3,4,5,6
- V0 接电位器中间脚,两侧接 VCC/GND 调节对比度
按钮矩阵(内部上拉)
- Btn1 (增/置 HIGH) → Pin 7
- Btn2 (减/置 LOW) → Pin 8
- Btn3 (光标左移) → Pin 9
- Btn4 (返回/确认) → Pin 10
软件架构
关键数据结构
#define ARR_SIZE 16 // 总帧数,可修改
#define LIGHTS 8 // LED 数量
bool ArrOne[ARR_SIZE][LIGHTS] = {false}; // 帧缓冲:每帧 8 位状态
byte lightArrOne[ARR_SIZE] = {0xFF}; // 移位寄存器字节缓存
int animSpeed = 50; // 帧间延时 ms
int loopCount = 5; // 循环次数
核心流程
- setup():初始化引脚、LCD、移位寄存器锁存脚,显示主菜单
- loop():轮询 4 个按钮,分发至对应功能:
- Btn1 →
Play()播放动画 - Btn2 →
Create()编辑动画 - Btn3 →
SetSpeed()设置速度 - Btn4 →
SetLoop()设置循环次数
- Btn1 →
- Create():双层循环遍历帧与位,实时刷新 LCD 显示光标与二进制预览
- IntToHexToByte() +
BoolArrayToByte():将二维布尔数组转为字节数组供shiftOut()发送 - Play():按循环次数逐帧锁存输出,帧间延时
animSpeed
代码亮点与改进建议
现有代码特点
- 使用自定义
shiftOut()实现 MSB 先行时序,兼容性强 - 状态机式菜单结构清晰,去抖动采用
delay(150)简单有效 - 帧缓冲与显示缓冲分离,便于扩展多动画槽位
可优化方向
- 引入
PROGMEM存储动画数据,突破 SRAM 限制,支持更多帧 - 添加 EEPROM 断电保存功能,掉电后保留用户编辑的动画
- 改用非阻塞定时器(
millis())替代delay(),提升响应性 - 支持串口导入/导出动画数据,便于分享与备份
扩展玩法
- 级联多个 74HC595 控制 16/24/32 个 LED,制作跑马灯、频谱仪等效果
- 结合声音传感器或加速度计,实现声控/体感触发动画
- 移植至 ESP32/STM32,利用 Wi-Fi/Bluetooth 通过手机 App 编辑动画
常见问题排查
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| LED 全亮/全灭 | 移位寄存器锁存脚接线错误 | 检查 ST_CP (Pin 11) 连接,确保 digitalWrite(latchPin, HIGH) 后再延时 |
| 动画乱序 | 数据/时钟引脚反接 | 对照原理图核对 DS/SH_CP 接线 |
| LCD 显示乱码 | 对比度未调节或数据线接触不良 | 调节电位器;重插 D4-D7 跳线 |
| 按钮无响应 | 未启用内部上拉或引脚冲突 | 确认 pinMode(btn, INPUT_PULLUP) 且引脚未被占用 |
总结
本项目以「移位寄存器 + 菜单交互」为核心,展示了如何用极简硬件实现功能完整的灯光动画编辑器。代码结构清晰,极易扩展为多动画播放器、音乐频谱显示或节日装饰灯控制器。建议初学者从修改 ARR_SIZE、调整 animSpeed 入手,逐步理解数组与移位寄存器的配合原理。
制造工艺
- 基于 Edge Impulse 的 TinyML 语言检测器:Arduino Nano 33 BLE Sense 实战
- Arduino Nano 与 MPU-6050 构建实时陀螺仪游戏
- Arduino 数字骰子:LCD 显示随机点数的电子骰子
- 用 Arduino Nano 自制 37 灯珠轮盘赌游戏机
- ATtiny85 迷你街机:贪吃蛇 — 打造掌上 OLED 游戏机
- 便携测距仪 DIY 套件:Arduino Nano + HC-SR04 + 18650 电池 + 3D 打印外壳
- 声控氛围灯:Arduino Nano + 麦克风模块 + WS2812B 灯珠
- Arduino Nano + OpenCV 人脸追踪自主机器人小车
- 铜电镀智能系统:基于 Arduino UNO 的可控电解装置
- Arduino Nano 驱动 NeoPixel 矩阵:自制霓虹乒乓游戏
- Arduino MKR1000 WiFi 拣选指灯系统(二):UDP 通信与序列号防错
- 智能插座:基于 Arduino 与 RTC 的 120V 定时开关插座