用 DS1302 RTC 和 Arduino UNO 制作可靠闹钟
项目简介
本项目将制作一个基于 Arduino UNO 的简易闹钟,整合了多个模块教程。若在某个模块遇到困难,可参考网站上对应的单独教程。
所需组件
- Arduino UNO 开发板(或兼容板)
- DS1302 RTC 实时时钟模块
- 4×4 矩阵键盘模块
- LCD I2C 显示屏(16×2)
- 蜂鸣器模块或两脚无源蜂鸣器
参考教程
- DS1302 RTC + 键盘 + Arduino + LCD 设置
- DS1302 RTC + Arduino + LCD 简单使用
- Arduino LCD I2C 简单使用及串口直接写入
- Arduino UNO + 4×4 键盘矩阵 + LCD I2C
- 蜂鸣器/压电喇叭与 Arduino 配合使用
接线说明

库与代码
- LCD I2C 库(可选用其他兼容库)
- Keypad 库(Arduino IDE 库管理器可直接安装)
- RTC DS1302 virtuabotix 库
代码功能
接线完成后,LCD 显示默认或之前设定的日期时间。按“*”键进入时间日期设置模式;按“A”键设置闹钟时分;按“B”键可在闹钟响起前取消,或响铃时按任意键停止。
完整代码
// DS1302 RTC + 4x4 Keypad + LCD I2C + Arduino + Buzzer
#include <Keypad.h>
#include <Wire.h>
#include <virtuabotixRTC.h>
#include <LiquidCrystal_I2C.h>
#define I2C_ADDR 0x27
#define BACKLIGHT_PIN 3
#define En_pin 2
#define Rw_pin 1
#define Rs_pin 0
#define D4_pin 4
#define D5_pin 5
#define D6_pin 6
#define D7_pin 7
LiquidCrystal_I2C lcd(I2C_ADDR, En_pin, Rw_pin, Rs_pin, D4_pin, D5_pin, D6_pin, D7_pin);
virtuabotixRTC myRTC(2, 3, 4); // CLK, DAT, RST
const byte numRows = 4;
const byte numCols = 4;
char keymap[numRows][numCols] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[numRows] = {12,11,10,9};
byte colPins[numCols] = {8,7,6,5};
int i1,i2,i3,i4;
char c1,c2,c3,c4;
char keypressed, keypressedx;
int A_hour = NULL, A_minute = NULL, AlarmIsActive = NULL;
int buzzer = 13;
Keypad myKeypad = Keypad(makeKeymap(keymap), rowPins, colPins, numRows, numCols);
void setup() {
Serial.begin(9600);
lcd.begin(16,2);
lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE);
lcd.setBacklight(HIGH);
lcd.home();
}
void loop() {
while(keypressed == NO_KEY) {
keypressed = myKeypad.getKey();
lcd.clear();
myRTC.updateTime();
// 闹钟触发逻辑:时、分匹配且秒在 0-2 之间
if(myRTC.hours == A_hour && myRTC.minutes == A_minute && AlarmIsActive == 1 && myRTC.seconds >= 0 && myRTC.seconds <= 2) {
while(keypressedx == NO_KEY) {
tone(buzzer, 1000); delay(100);
tone(buzzer, 2000); delay(100);
lcd.clear(); lcd.print("Get up !!!");
keypressedx = myKeypad.getKey();
}
}
keypressedx = NO_KEY;
noTone(buzzer);
// 显示日期时间
lcd.setCursor(0,0);
lcd.print(myRTC.dayofmonth); lcd.print("/");
lcd.print(myRTC.month); lcd.print("/");
lcd.print(myRTC.year);
lcd.setCursor(0,1);
lcd.print(myRTC.hours); lcd.print(":");
lcd.print(myRTC.minutes); lcd.print(":");
lcd.print(myRTC.seconds);
delay(100);
}
// 时间日期设置(按 * 进入)
if (keypressed == '*') {
lcd.clear(); lcd.print(" Setup"); delay(1000);
lcd.clear(); lcd.print("Setup year");
// 依次输入年(4位)、月(2位)、日(2位)、时(2位)、分(2位)
// 每步使用 waitForKey 阻塞等待按键,过滤功能键
// 最终调用 myRTC.setDS1302Time(秒, 分, 时, 周, 日, 月, 年)
keypressed = NO_KEY;
}
// 闹钟设置(按 A 进入)
if (keypressed == 'A') {
lcd.clear(); lcd.print(" Alarm setup "); delay(1000);
lcd.clear(); lcd.print("Set alarm hour");
// 输入时(2位)、分(2位),设置 A_hour, A_minute, AlarmIsActive=1
keypressed = NO_KEY;
}
// 取消闹钟(按 B)
if (keypressed == 'B') {
lcd.clear(); lcd.print("Alarm deactivated");
AlarmIsActive = 0; keypressed = NO_KEY; delay(500);
} else {
myRTC.updateTime(); keypressed = NO_KEY;
}
}
原理图

制造工艺
- Arduino Nano飞行模拟2020控制面板——LCD与CDI显示
- Arduino POV 时钟:自制视觉暂留 LED 显示器
- 复古 Numitron 管时钟:Arduino Nano 驱动,低温可靠省电
- DIY Arduino单词时钟 – 极简优雅的实时文字显示
- 自制 Arduino 伊斯兰祷告时间实时时钟
- 自制大尺寸LED主时钟带闹钟功能 — 12米外清晰可见
- Arduino Due 驱动 3.2″ TFT 实现温度监测与实时时钟
- 自制简易红外避障传感器:IR LED + 光电二极管 + Arduino
- TM1637 数码管时钟:Arduino Nano 实现时间设定与闹钟
- Arduino UNO 驱动 1.17 英寸 TFT 屏显示图片 (SD 卡读取)
- 自制高精度测距轮:Arduino Nano + 旋转编码器 + 1602 LCD
- 轻松打造 Arduino 秒表:按钮触发计时器