本项目是一个基于 Arduino 的多功能数字和模拟(OLED部分可选模拟表盘)时钟,具有时间、日期、星期、温度显示、闹钟、整点报时、秒表和倒计时功能。它使用 DS1302 RTC 模块保持时间准确性,并通过 LCD1602 和一个可选的 OLED SSD1306/SH1106 显示屏同时显示信息。用户通过三个按钮进行交互。
_compressed.mp4
-
双显示: 同时在 LCD1602 和 OLED 屏幕上显示信息。
-
实时时钟 (RTC): 使用 DS1302 模块精确计时,断电后时间不丢失。
-
时间显示: 年、月、日、星期、时、分、秒。
-
温度显示: 显示当前环境温度,使用卡尔曼滤波器平滑读数。
-
闹钟功能:
- 可设置时间闹钟 (时、分)。
- 可设置温度阈值闹钟。
-
整点报时: 可选功能,在每个整点蜂鸣提示。
-
秒表功能: 正向计时,支持开始、暂停、继续和重置。
-
倒计时功能:
- 可设置倒计时时长 (时、分、秒)。
- 支持开始、暂停、继续和停止。
- 倒计时结束时蜂鸣提示。
-
用户交互: 通过三个按钮(选择/模式、增加、减少)进行操作。
-
可配置性: 大部分参数(如引脚定义、功能开关、阈值)可通过
Config.h文件配置。 -
卡尔曼滤波器: 用于温度传感器读数的平滑处理,参数可通过串口动态配置。
-
游戏功能: 类似超级马里奥的小游戏
- Arduino UNO (或其他兼容开发板)
- DS1302 RTC 模块 (带电池)
- LCD1602 显示屏 (通常带 I2C 背板或直接并口连接)
- OLED 显示屏 (SSD1306 或 SH1106, I2C接口, 例如 128x64 分辨率)
- 温度传感器 (例如 LM35, 或根据代码中
readAndUpdateTemperature函数的转换公式选择合适的传感器) - 无源蜂鸣器
- 3个瞬时按钮 (按键)
- 若干杜邦线和面包板 (如果未使用 PCB)
- 上拉/下拉电阻 (如果按钮未设置为
INPUT_PULLUP或模块未自带)
-
PlatformIO (最新版本推荐)
-
必需的库:
DS1302.h(例如 Rinky-Dink Electronics 的版本) - 用于 RTC 模块。LiquidCrystal.h- (通常 Arduino IDE 自带) 用于 LCD1602 并口连接。U8g2lib.hby oliver - 用于 OLED 显示屏。
请通过 Arduino IDE 的“库管理器”安装这些库。
- 连接硬件: 根据
Config.h文件中的引脚定义连接所有模块和组件到 Arduino。 - 配置
Config.h:- 打开项目中的
Config.h文件。 - 仔细检查并修改所有引脚定义 (LCD, RTC, OLED_SCL_PIN, OLED_SDA_PIN, 按钮, 蜂鸣器, 温度传感器) 以匹配您的实际硬件连接。
- 根据需要调整其他参数,如功能启用/禁用、闹钟默认值、延时等。
- 打开项目中的
- 安装库: 确保已通过 Arduino IDE 安装了上述所有必需的库。
- 上传代码: 将主
.ino文件和Config.h文件放在同一工程文件夹下,然后通过 Arduino IDE 上传代码到您的 Arduino 板。
所有引脚连接均在 Config.h 文件中定义。以下为典型示例:
- LCD1602:
LCD_RS_PIN,LCD_EN_PIN,LCD_D4_PIN,LCD_D5_PIN,LCD_D6_PIN,LCD_D7_PIN - DS1302 RTC:
DS1302_CE_PIN(RST),DS1302_IO_PIN(DAT),DS1302_SCLK_PIN(CLK) - OLED (I2C):
OLED_SDA_PIN(SDA),OLED_SCL_PIN(SCL) - 确保与代码中软件I2C定义一致 - 按钮:
BUTTON_CHOOSE_PIN,BUTTON_ADD_PIN,BUTTON_MINUS_PIN(建议使用INPUT_PULLUP并将另一端接地) - 蜂鸣器:
BUZZER_TONE_PIN - 温度传感器:
TEMP_SENSOR_PIN(模拟输入)
通过三个按钮(选择/模式、增加、减少)与时钟交互:
- 正常模式:
- 短按【选择】: 进入时间设置模式。
- 长按【增加】: 进入秒表模式。
- 长按【减少】: 进入倒计时设置模式。
- 同时按【增加】+【减少】: 进入闹钟设置模式。
- 设置模式中:
- 【选择】: 切换要调整的项目 (例如 时 -> 分 -> 秒) 或确认/进入下一步。
- 【增加】: 增加当前选定项目的值。
- 【减少】: 减少当前选定项目的值。
- 同时按【增加】+【减少】: (在某些设置模式下) 强制退出设置而不保存。
- 设置模式通常有30秒无操作超时,会自动退出。
- 秒表/倒计时运行模式:
- 【选择】: 开始 / 暂停 / 继续。
- 【增加】: (秒表暂停时) 重置秒表。
- 【减少】: (倒计时运行时) 停止倒计时并返回设置。
- 倒计时结束或闹钟响起时,按任意键通常可以停止蜂鸣。
- OLED 显示屏提供更丰富的图形化界面,可以与 LCD1602 同时工作。
- RAM占用: U8g2 库在全缓冲模式下 (代码中默认使用
_F_后缀的构造函数) 会占用较多RAM (128x64 OLED 约 1KB)。如果 Arduino UNO 出现不稳定或内存不足的情况,请将 U8g2 构造函数更改为页缓冲模式 (例如,U8G2_SSD1306_128X64_NONAME_1_SW_I2C)。这会显著减少 RAM 占用,但可能需要微调绘图代码。 - F() 宏: 为了节省 RAM,代码中应广泛使用
F()宏来处理固定字符串 (例如lcd.print(F("Hello")),oledPrint(0, 10, F("Status")))。
- 首次使用 DS1302 或更换电池后,RTC 时间可能不准确,需要手动设置一次时间。代码包含一个简单的 RTC 时间有效性检查,如果无效会设置一个默认时间。
- 如果显示不正常或功能异常,请首先检查
Config.h中的引脚定义是否与硬件连接完全一致。 - 使用 Arduino IDE 的串口监视器(如果启用了
__Serial_DEBUG__)可以帮助调试。 - 确保所有外部模块(RTC, OLED, LCD)供电稳定。