带 DS1302 RTC 的简单闹钟
组件和用品
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
关于这个项目
大家好,在这个项目中,我们将尝试使用 Arduino UNO 板制作一个简单的闹钟。这个项目是我之前使用过的不同模块的混合,如果你遇到什么问题,你可以在网站上查看模块教程,因为我通常是这样工作的:分别做事情,然后开始混合。 :D
对于这个项目,我们需要:
- Arduino UNO 板,或者您可以使用适合您的:
- DS1302 RTC 模块:
- 4*4 矩阵键盘模块:
- LCD I2C 屏幕:
- 蜂鸣器模块,或 2 针蜂鸣器:
如果您遇到某些问题,可以查看有关上述模块的这些以前的教程:
如何使用Keypad + Arduino + LCD设置DS1302 RTC模块
如何简单地将DS1302 RTC模块与Arduino板和液晶屏结合使用
Arduino LCD I2C简单使用和串口监视器直接写入Arduino LCD I2C简单使用和串口监视器直接写入
Arduino uno + 4×4 键盘矩阵 + LCD i2c 屏幕
如何在 Arduino 中使用蜂鸣器/压电扬声器
接线:
库和代码:
LCD i2c 库您可以选择这个或下载自己的
键盘库 或者您可以从 Arduino IDE 下载
RTC DS1302 virtuabotix 库
代码:
下载代码
代码功能很简单,模块接线后可以按“*”在DS1302 RTC上设置时间和日期,显示屏会显示当前日期和时间,如果要设置闹钟按“A”和您可以设置小时和分钟,您可以在时间前按“B”或在响铃时按任意按钮将其关闭。
希望大家喜欢,有什么问题可以联系我。
代码
- RTC_alarm_clock_LCD.ino
RTC_alarm_clock_LCD.inoArduino
与 UNO + RTC DS1302 + LCD i2c + 4x4 键盘配合使用(12/04/18 进行了重大更改以解决一些问题)
//此代码用于 DS1302 RTC 模块 + 4*4 Keypad + LCD i2c + Arduino + Buzzer//模块接线后,LCD 将显示默认日期和时间或之前设置的日期和时间//这个项目的目的是你可以从键盘设置RTC模块,并确保它会保持存储//然后在屏幕上显示它,然后你可以设置你的警报。//有关更多信息,请参阅 Surtrtech.com 或 SurtrTech youtube 频道#include//需要的库#include #include #include #define I2C_ADDR 0x27 //LCD i2c stuff#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 7LiquidCrystal_I2C_pinD,Rw_pinD,Rw_pin 1#定义Rs_pin ,D5_pin,D6_pin,D7_pin);virtuabotixRTC myRTC(2, 3, 4); //RTC(CLK,DAT,RST)的接线//如果您更改接线,请更改此处的引脚也const byte numRows=4; //键盘上的行数const byte numCols=4; //键盘上的列数//keymap根据keypadchar上显示的行和列定义按下的键 keymap[numRows][numCols]={{'1', '2', '3', ' A'}, {'4', '5', '6', 'B'}, {'7', '8', '9', 'C'},{'*', '0', ' #', 'D'}};byte rowPins[numRows] ={12,11,10,9}; //Rows 0 to 3 //如果你修改你的pins,你应该修改这个toobyte colPins[numCols]={8,7,6,5}; //列0到3int i1,i2,i3,i4;char c1,c2,c3,c4;char keypressed,keypressedx;int A_hour=NULL;int A_minute=NULL;int AlarmIsActive=NULL;int buzzer =13;Keypad myKeypad =Keypad(makeKeymap(keymap), rowPins, colPins, numRows, numCols);void setup() { Serial.begin(9600);液晶显示器开始(16,2); //初始化LCD lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE); lcd.setBacklight(高); lcd.home(); }void loop() { while(keypressed ==NO_KEY){ //只要没有按下任何键,我们就会一直显示日期和时间,我必须每次都清除屏幕,以免数字混淆 //我应该添加一点延迟,以便屏幕正确显示,否则它对我不起作用 keypressed =myKeypad.getKey();液晶显示器(); //这里清除LCD后,我们从模块中获取时间并使用通常的LCD函数将其打印在屏幕上 myRTC.updateTime(); if(myRTC.hours==A_hour &&myRTC.minutes==A_minute &&AlarmIsActive==1 &&myRTC.seconds>=0 &&myRTC.seconds <=2){ while(keypressedx ==NO_KEY){tone(蜂鸣器,1000); //您可以修改音调或制作自己的声音延迟(100);音调(蜂鸣器,2000);延迟(100);液晶显示器(); lcd.print("起来!!!"); //闹钟响起时显示的消息 keypressedx =myKeypad.getKey(); } } keypressedx =NO_KEY; noTone(蜂鸣器); 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);延迟(100); } if (keypressed =='*') //当我们每次检查按下的键时,我们只在按下“*”时才继续设置 { lcd.clear(); lcd.print("设置");延迟(1000);液晶显示器(); lcd.print("安装年份"); //所以你可以理解它是如何工作的,首先它向我们展示“设置”然后打印“设置年份”,现在你可以正常写你的年份(2-0-1-8)//它自动传递到设置月...直到它完成//键盘上的键都被认为是字符(c)所以我们应该将它们转换为int,这就是我所做的然后我们存储它们(i)//我们做一些数学运算并得到年份,月份...作为int所以我们可以将它们注入RTC否则它不会被编译//像四月这样的月份你应该为三月写04、03...否则它不会传递给下一个参数//RTC virtuabotix库已设置为不接受奇怪的时间和日期 (45/17/1990) (58:90:70),并且是旧日期被视为错误 char keypressed2 =myKeypad.waitForKey(); if (keypressed2 !=NO_KEY &&keypressed2 !='*' &&keypressed2 !='#' &&keypressed2 !='A' &&keypressed2 !='B' &&keypressed2 !='C' &&keypressed2 !='D' ) { c1 =按键 2; lcd.setCursor(0, 1);液晶打印(c1); char keypressed3 =myKeypad.waitForKey(); if (keypressed3 !=NO_KEY &&keypressed3 !='*' &&keypressed3 !='#' &&keypressed3 !='A' &&keypressed3 !='B' &&keypressed3 !='C' &&keypressed3 !='D' ) { c2 =keypressed3; lcd.setCursor(1, 1);液晶打印(c2); char keypressed4 =myKeypad.waitForKey(); if (keypressed4 !=NO_KEY &&keypressed4 !='*' &&keypressed4 !='#' &&keypressed4 !='A' &&keypressed4 !='B' &&keypressed4 !='C' &&keypressed4 !='D' ) { c3 =keypressed4; lcd.setCursor(2, 1);液晶打印(c3); char keypressed5 =myKeypad.waitForKey(); if (keypressed5 !=NO_KEY &&keypressed5 !='*' &&keypressed5 !='#' &&keypressed5 !='A' &&keypressed5 !='B' &&keypressed5 !='C' &&keypressed5 !='D' ) { c4 =keypressed5; lcd.setCursor(3, 1);液晶打印(c4); } i1=(c1-48)*1000; //按下的键被存储到字符中我将它们转换为 int 然后我做了一些乘法来得到代码作为 xxxx i2=(c2-48)*100 的 int; i3=(c3-48)*10; i4=c4-48; int N_year=i1+i2+i3+i4;延迟(500);液晶显示器(); lcd.print("设置月份");////////////////////////////////////// ////////////////////// char keypressed6 =myKeypad.waitForKey(); // 这里所有程序都停止,直到你输入四位数字然后它与上面的代码进行比较 if (keypressed6 !=NO_KEY &&keypressed6 !='*' &&keypressed6 !='#' &&keypressed6 !='A' &&keypressed6 !='B' &&keypressed6 !='C' &&keypressed6 !='D' ) { c1 =keypressed6; lcd.setCursor(0, 1);液晶打印(c1); char keypressed7 =myKeypad.waitForKey(); if (keypressed7 !=NO_KEY &&keypressed7 !='*' &&keypressed7 !='#' &&keypressed7 !='A' &&keypressed7 !='B' &&keypressed7 !='C' &&keypressed7 !='D' ) { c2 =keypressed7; lcd.setCursor(1, 1);液晶打印(c2); } i1=(c1-48)*10; i2=c2-48; int N_month=i1+i2;延迟(500);液晶显示器(); lcd.print("设置日"); ////////////////////////////////////////////////// ////////////// char keypressed8 =myKeypad.waitForKey(); // 这里所有程序都停止,直到你输入四位数字然后它与上面的代码进行比较 if (keypressed8 !=NO_KEY &&keypressed8 !='*' &&keypressed8 !='#' &&keypressed8 !='A' &&keypressed8 !='B' &&keypressed8 !='C' &&keypressed8 !='D' ) { c1 =keypressed8; lcd.setCursor(0, 1);液晶打印(c1); char keypressed9 =myKeypad.waitForKey(); if (keypressed9 !=NO_KEY &&keypressed9 !='*' &&keypressed9 !='#' &&keypressed9 !='A' &&keypressed9 !='B' &&keypressed9 !='C' &&keypressed9 !='D' ) { c2 =keypressed9; lcd.setCursor(1, 1);液晶打印(c2); } i1=(c1-48)*10; i2=c2-48; int N_day=i1+i2;延迟(500);液晶显示器(); lcd.print("设置时间");////////////////////////////////////// ////////////////////////////////////////:char keypressed10 =myKeypad.等待键(); // 这里所有程序都停止,直到你输入四位数字然后它与上面的代码进行比较 if (keypressed10 !=NO_KEY &&keypressed10 !='*' &&keypressed10 !='#' &&keypressed10 !='A' &&keypressed10 !='B' &&keypressed10 !='C' &&keypressed10 !='D' ) { c1 =keypressed10; lcd.setCursor(0, 1);液晶打印(c1); } char keypressed11 =myKeypad.waitForKey(); if (keypressed11 !=NO_KEY &&keypressed11 !='*' &&keypressed11 !='#' &&keypressed11 !='A' &&keypressed11 !='B' &&keypressed11 !='C' &&keypressed11 !='D' ) { c2 =keypressed11; lcd.setCursor(1, 1);液晶打印(c2); } i1=(c1-48)*10; i2=c2-48; int N_hour=i1+i2;延迟(500);液晶显示器(); lcd.print("设置分钟");////////////////////////////////////// ////////////////////////////////////////:char keypressed12 =myKeypad.等待键(); // 这里所有程序都停止,直到你输入四位数字然后它与上面的代码进行比较 if (keypressed12 !=NO_KEY &&keypressed12 !='*' &&keypressed12 !='#' &&keypressed12 !='A' &&keypressed12 !='B' &&keypressed12 !='C' &&keypressed12 !='D' ) { c1 =keypressed12; lcd.setCursor(0, 1);液晶打印(c1); } char keypressed13 =myKeypad.waitForKey(); if (keypressed13 !=NO_KEY &&keypressed13 !='*' &&keypressed13 !='#' &&keypressed13 !='A' &&keypressed13 !='B' &&keypressed13 !='C' &&keypressed13 !='D' ) { c2 =keypressed13; lcd.setCursor(1, 1);液晶打印(c2); } i1=(c1-48)*10; i2=c2-48; int N_minutes=i1+i2;延迟(500);液晶显示器(); myRTC.setDS1302Time(22, N_minutes, N_hour, 1, N_day, N_month, N_year); //一旦我们完成设置日期和时间,我们将值传输到 RTC 模块 //22 代表秒,如果需要,您也可以为其添加设置 //1 代表星期几,如长时间我不在屏幕上显示它我不改变它 keypressed=NO_KEY; //“*”键存储在“keypressed”中,因此我从中删除该值,否则它会使我再次进入设置 }////////////////// /////////////////////报警设置////////////////////////// ////// if (keypressed =='A'){ lcd.clear(); lcd.print("闹钟设置");延迟(1000);液晶显示器(); lcd.print("设置闹钟时间"); char keypressed14 =myKeypad.waitForKey(); // 这里所有程序都停止,直到你输入四位数字然后它与上面的代码进行比较 if (keypressed14 !=NO_KEY &&keypressed14 !='*' &&keypressed14 !='#' &&keypressed14 !='A' &&keypressed14 !='B' &&keypressed14 !='C' &&keypressed14 !='D' ) { c1 =keypressed14; lcd.setCursor(0, 1);液晶打印(c1);字符 keypressed15 =myKeypad.waitForKey(); if (keypressed15 !=NO_KEY &&keypressed15 !='*' &&keypressed15 !='#' &&keypressed15 !='A' &&keypressed15 !='B' &&keypressed15 !='C' &&keypressed15 !='D' ) { c2 =keypressed15; lcd.setCursor(1, 1);液晶打印(c2); } i1=(c1-48)*10; i2=c2-48; A_小时=i1+i2;延迟(500);液晶显示器(); lcd.print("设置闹钟分钟数"); char keypressed16 =myKeypad.waitForKey(); // 这里所有程序都停止,直到你输入四位数字然后它与上面的代码进行比较 if (keypressed16 !=NO_KEY &&keypressed16 !='*' &&keypressed16 !='#' &&keypressed16 !='A' &&keypressed16 !='B' &&keypressed16 !='C' &&keypressed16 !='D' ) { c1 =keypressed16; lcd.setCursor(0, 1);液晶打印(c1); } char keypressed17 =myKeypad.waitForKey(); if (keypressed17 !=NO_KEY &&keypressed17 !='*' &&keypressed17 !='#' &&keypressed17 !='A' &&keypressed17 !='B' &&keypressed17 !='C' &&keypressed17 !='D' ) { c2 =keypressed17; lcd.setCursor(1, 1);液晶打印(c2); } i1=(c1-48)*10; i2=c2-48; A_分钟=i1+i2;延迟(500);液晶显示器(); AlarmIsActive=1;按键=NO_KEY; } if (keypressed =='B') { lcd.clear(); lcd.print("警报解除"); AlarmIsActive=0;按键=NO_KEY;延迟(500); } else { myRTC.updateTime();按键=NO_KEY; } }
示意图
制造工艺