3D 打印月相时钟:Arduino Nano 驱动 OLED+NeoPixel 还原真实月相
项目亮点
- 高精度月相算法(基于儒略日计算),误差 < 0.1 天
- 18 颗 NeoPixel (WS2812B) 环形分布在月球模型内侧,模拟月面明暗分界线
- 0.96″ OLED 显示日期、时间、温湿度 (DHT11)、闹钟设定
- DS1307 RTC 掉电走时,3 按键全功能交互
- 多模式:月相演示、呼吸灯、派对闪烁、唤醒灯、台灯模式
- 仅 79g PLA 耗材,打印 3 小时,总成本约 $25
硬件清单
| 元件 | 规格 | 关键参数 |
|---|---|---|
| Arduino Nano | ATmega328P | 5V 16MHz |
| OLED | 0.96″ 128×64 SSD1306 I2C | 4Pin: VCC/GND/SDA/SCL |
| RTC | Tiny RTC (DS1307+24C32) | 需焊接 LIR2032 充电扣电池 |
| NeoPixel | 60LED/m 灯带截 18 颗 | DIN→D6,外部 5V 供电 |
| DHT11 | 温湿度模块(自带上拉) | DATA→D7 |
| 蜂鸣器 | 无源 | D8,闹钟提示 |
| 按键 | RAFI 1.10.001.001 ×3 | D2/D3/D4,内部上拉 |
3D 打印参数
- 模型来源:Thingiverse #1891599 (月球体) + #1929844 (底座/按键)
- 切片设置:层高 0.2mm,壁厚 1mm,月球体填充 0%(中空透光),其余 100%
- 月球体需 Z 轴下沉 5mm 打印,或使用 Netfabb 切割版本
- 木质 PLA (FormFutura EasyWood Birch/Coconut) 效果最佳,打磨上漆后质感接近真月球
NeoPixel 排布与接线
背面视角 LED 编号(顺时针螺旋): | 1 | 6 | 7 | 12 | 13 | 18 | | 2 | 5 | 8 | 11 | 14 | 17 | | 3 | 4 | 9 | 10 | 15 | 16 |
- 将 18 颗 LED 按箭头方向串联,DIN 接 Nano D6,电源单独接 5V/GND(共地)。
- 热熔胶固定在月球内壁凹槽,导光均匀。
核心固件架构
完整代码见 GitHub:G4lile0/Arduino_3dprinted_Lunar_Phase_Clock
关键库
U8glib(OLED)Adafruit_NeoPixel(灯带)RTClib(DS1307)DHT(温湿度)
月相计算核心
// 返回 0.0~1.0 月相值 (0=新月, 0.5=满月)
float moonPhase(uint16_t year, uint8_t month, uint8_t day) {
// 儒略日计算
if (month <= 2) { year--; month += 12; }
long jd = 365.25*year + 30.6001*(month+1) + day + 1720994.5;
float phase = fmod((jd - 2451550.1) / 29.530588853, 1.0);
return phase < 0 ? phase + 1.0 : phase;
}
NeoPixel 映射月相
void updateMoonLeds(float phase) {
// phase 0.0~1.0 对应 0~17 号 LED 点亮
uint8_t lit = round(phase * 17);
for (uint8_t i=0; i<18; i++) {
if (i <= lit) strip.setPixelColor(i, strip.Color(255, 200, 100)); // 暖黄
else strip.setPixelColor(i, 0);
}
strip.show();
}
按键交互状态机
- 短按 MODE:切换 模式(月相/时钟/温湿/闹钟/亮度/灯效)
- 短按 UP/DOWN:调整当前模式参数
- 长按 MODE:进入睡眠/唤醒
组装要点
- 先焊接主板排母,测试 OLED/RTC/NeoPixel/DHT11 单独工作。
- 按键焊线时预留长度,穿过底座按键柱再焊接主板。
- RTC 模块自带 CR2032 座,**必须**改为 LIR2032 充电电池或切断充电电路(拆除充电二极管/电阻),否则不可充电电池漏液风险极大。
- 月球体上盖用 M2 螺丝固定,便于维护。
固件烧录与校准
- 安装上述库,打开
LunarPhaseClock.ino,编译上传。 - 首次上电 OLED 显示「SET TIME」,按键设定年/月/日/时/分,写入 RTC。
- 对照天文历验证月相显示,若偏差 >1 天,检查 RTC 走时或月相算法年份基准。
- NeoPixel 亮度建议设 50/255 以下,避免过亮刺眼且降低功耗。
扩展创意
- 加入 BME280 替代 DHT11,获取气压/海拔,显示天气趋势。
- 接入 ESP8266/ESP32 实现 NTP 对时、天气 API 获取、Home Assistant MQTT 上报。
- 设计「月食/日食」特效模式,配合 NASA API 推送天文事件提醒。
- 做成「行星仪」:多层叠加显示地球、火星、木星相位。
制造工艺
- 布谷鸟钟:历史、工艺与现代演变
- 集成电路 (IC):微观世界里的算力引擎与制造极限
- 印制电路板:设计、制造与未来趋势
- Arduino POV 时钟:自制视觉暂留 LED 显示器
- 复古 Numitron 管时钟:Arduino Nano 驱动,低温可靠省电
- 自制大尺寸LED主时钟带闹钟功能 — 12米外清晰可见
- 用 Arduino UNO 制作柏林时钟 – DIY LED 矩阵时钟
- MOSMusic 套件:MOSFET + Arduino 打造音乐同步灯光控制系统
- MMF #5:掌握 3D 打印件组件嵌入技术——Markforged 打印机实战
- 印制电路板:现代电子设备的核心骨干
- 印制电路板在现代电子中的核心作用
- 上电相位确定性:在高速 ADC/DAC 平台利用多芯片同步