Arduino Nano 驱动 4×64 LED 点阵时钟 v2:DS3231 RTC + 光敏自适应亮度
项目特色
- 基于 MD_MAX72XX 底层驱动库 (非 MD_Parola),固件仅 13.5 KB,留足 Flash 空间。
- 内置 3×5 像素极简数字字体,秒数实时滚动显示,无需修改库源码。
- DS3231 高精度 RTC (I²C),支持串口指令
DD/MM/YYYY hh:mm:ss一键校时。 - 光敏电阻 (LDR) 自动调节 16 级亮度,夜间不刺眼、白天清晰可见。
- 显示循环:前 53 秒显示时分 (hh:mm),末 7 秒轮显日期 (dd Mon) 与温度 (°C)。
- 可选显示星期 (取消注释两行代码即可)。
- 支持 12/24 小时制切换 (代码中已预留修改点)。
硬件清单
| 器件 | 数量 | 备注 |
|---|---|---|
| Arduino Nano (ATmega328P Old Bootloader) | 1 | 5V 逻辑,硬件 SPI |
| 4 合 1 MAX7219 点阵模块 (FC16/ICSTATION) | 1 | 32×8 像素,右侧接口 |
| DS3231 RTC 模块 (带纽扣电池) | 1 | I²C 地址 0x68 |
| 光敏电阻 (GL5528 等) + 10kΩ 上拉 | 1 | 接 A2 |
| 面包板/万用板 + 跳线 | 若干 |
接线对照表
| 模块引脚 | Nano 引脚 | 说明 |
|---|---|---|
| VCC | 5V | |
| GND | GND | |
| DIN (DATA) | D11 (MOSI) | 硬件 SPI |
| CS (LOAD) | D10 (SS) | |
| CLK | D13 (SCK) | |
| DS3231 SDA | A4 | I²C |
| DS3231 SCL | A5 | I²C |
| LDR 一端 | A2 | 另一端接 GND,内部开启上拉 |
关键代码片段
3×5 数字字体定义 (内置数组)
uint8_t Font3x5[10][3] = {
{248,136,248}, // 0
{144,248,128}, // 1
{200,168,184}, // 2
{136,168,248}, // 3
{112,72,224}, // 4
{184,168,232}, // 5
{248,168,232}, // 6
{8,232,24}, // 7
{248,168,248}, // 8
{184,168,248} // 9
};
亮度自适应映射
byte ledIntensitySelect(int light) {
if (light <= 127) return 12; // 暗环境 → 亮度 12/15
else if (light <= 319) return 3; // 中环境 → 亮度 3/15
else return 0; // 强光 → 亮度 0/15 (最暗)
}
主循环显示逻辑 (简化)
void loop() {
matrix.control(MD_MAX72XX::INTENSITY, ledIntensitySelect(analogRead(LDR_PIN)));
getHour(); // 从 RTC 读取 hh,mm,ss, 计算 dots 闪烁列
printText(0,3,buf); // 显示 hh:mm
unsigned long t0 = millis();
while (ss < 53) { // 前 53 秒
if (millis()-t0 >= 1000) { t0=millis(); ss++; showsec(ss); }
blinkDots(); // 双点 2.4Hz 闪烁
}
scrollUp(); // 向上滚动退出
getDate(); printText(0,3,buf); delay(2000); // 日期
getTemp(); printText(0,3,buf); delay(2000); // 温度
if (Serial.available() && !timeset) adjustClock(Serial.readString());
}
库依赖与安装
- MD_MAX72XX:库管理器搜索 "MD_MAX72XX" 安装 (由 MajicDesigns 维护)。
- DS3231:使用 Rinky-Dink Electronics 版库:
https://www.rinkydinkelectronics.com/library.php?id=73
下载DS3231.zip→ 草图→加载库→添加 .ZIP 库。
常见问题 FAQ
- 点阵显示乱码/镜像/倒立?
- 运行库自带示例
MD_MAX72xx_HW_Mapper.ino,按提示按键切换硬件类型,直到显示正确。常见类型:FC16_HW(绿板)、ICSTATION_HW(蓝板)。在代码中修改#define HARDWARE_TYPE即可。 - 编译报警告 "ISO C++ forbids converting string constant to char*"?
- v2 已将月份字符串改为二维数组
char months[12][4]消除警告;DS3231 库内部警告可忽略。 - 如何改 12 小时制?
- 在
getHour()中将hh转换:if (hh>12) hh-=12; if (hh==0) hh=12;并调整dots位置计算。 - 串口校时格式?
- Arduino IDE 串口监视器发送
25/12/2025 14:30:00(含空格),波特率 9600,换行符 "Both NL & CR"。
扩展建议
- 加装 BME280 替代 DS3231 内部温度,获得真实环境温湿度气压。
- 接入 ESP8266/ESP32 通过 NTP 自动校时,彻底免维护。
- 使用
MD_Parola实现跑马灯、动画特效,代价是固件体积增至 ~28 KB。 - PCB 定制版:将 Nano、RTC、LDR、电源接口集成在一块 5×7 cm 板载,适合批量制作礼品。
制造工艺
- 自制 Arduino 伊斯兰祷告时间实时时钟
- Arduino Due 驱动 3.2″ TFT 实现温度监测与实时时钟
- Arduino + HC-05 蓝牙控制 LED:MIT App Inventor 手机 App 开发全攻略
- 基于 Arduino Mega 与 Nextion 显示屏的交互式气象站
- 互动 LED 矩阵门显:PIR 触发节日问候 + 待机特效
- Arduino Nano + 摇杆控制双步进电机:Visuino 图形化教程
- Arduino 8×8 LED 矩阵翻页时钟 - DIY 实时时钟项目
- Arduino Uno驱动MAX7219级联8×8 LED矩阵:从入门到动画显示
- Arduino Nano 手持盖革计数器:DIY 核辐射检测仪
- 高级智能电池充电器:多路复用与数字显示
- Arduino 实时天气时钟:OLED 显示时间、日期与温度
- 信用卡大小 Arduboy 克隆机:Arduino Nano + I²C OLED 复古游戏机自制