亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

带 DS1302 RTC 的简单闹钟

组件和用品

实时时钟 (RTC)
× 1
蜂鸣器
× 1
Adafruit 标准 LCD - 16x2 蓝底白字
× 1
Arduino UNO
× 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; } }

示意图


制造工艺

  1. 带有 Arduino 的用于飞行模拟器的 LCD 面板
  2. Arduino pov 视觉时钟
  3. DIY 最简单的 IV9 Numitron 时钟与 Arduino
  4. 简单字时钟(Arduino)
  5. 带有伊斯兰祈祷时间的 Arduino 时钟
  6. 主时钟
  7. Arduino 温度。使用 3.2 显示的监视器和实时时钟
  8. 带有 Arduino 的简单障碍物传感器
  9. TM1637 具有时间设置和闹钟功能的数字时钟
  10. 使用 Arduino UNO 在 LCD TFT 屏幕上显示图像!
  11. 带旋转编码器的DIY简易测量轮
  12. 简单的 Arduino 天文钟