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

主时钟

组件和用品

Arduino UNO
× 1
Freetronics DMD 显示
× 1
RTC 模块
× 1
瞬时按钮
× 1
开/关开关
× 1

应用和在线服务

Arduino IDE

关于这个项目

关于

这是一个项目,适合想要在 12 米外或近距离观看的漂亮大钟的任何人。你可以把它做成你想要的大小。它还包含一个内置闹钟,可用作事件处理程序,例如用于花园的自动浇水系统或提醒您有关每周聚会的内容,或者您​​可以连接到继电器的任何其他内容.

你需要:

● Freetronics DMD 显示

● Arduino 实时时钟模块

● 蜂鸣器(可选——声音大到可以在早上叫醒你)

● 瞬时开启按钮

● 2x 开关按钮(电源一个是可选的)

● Arduino UNO 或 Arduino 兼容板

● Arduino Proto-shield(可选)

● Arduino 电源

● 5VDC 稳压电源,可提供 4 – 30 安培(高亮度可选 – 正常操作不需要)

施工:

第 1 部分 - 电子:

第一步:将蜂鸣器、静音按钮和闹钟设置开关连接到面包板

第 2 步:将每个开关引脚之一接地,将蜂鸣器 GND 引脚连接到 Arduino 上的 GND 引脚(如图所示)

步骤3:将报警设置开关的另一个引脚连接到D2,将静音引脚连接到D3,将蜂鸣器连接到D4

第 4 步:根据类型将 RTC 模块连接到 Arduino(读取制造数据 - 在大多数情况下按照图表)

步骤 5:将 DMDCON 连接到 Arduino 并插入 DMD

第 6 步:要获得 DMD 的全亮度,将 5V 电源连接到高亮度端子

第 7 步:如果您希望在原型屏蔽上进行此操作,请将所有部件焊接到屏蔽上并正确连接

第 2 部分 - 软件:

首先,您需要安装此处提供的 DMD 库并将其安装在您的库文件夹中。

该软件可以从原型角或本页底部下载。这包含主时钟的基本操作。

要在 RTC 模块上设置时间,请查找第 117 至 124 行并将它们调整为当前时间。现在取消注释第 124 行并上传到 Arduino。现在再次评论第 124 行并再次上传。如果不这样做,RTC 将保持不变。

在第 593 和 594 行,您可以设置希望闹钟发生的时间和日期。第 593 行是您希望它发生的星期几。天数对应的数字如下:

1 =星期日

2 =星期一

3 =星期二

4 =星期三

5 =星期四

6 =星期五

7 =星期六

然后在第 594 行设置闹钟在 24 小时内响起的时间。

更进一步:

添加更多显示器:

您可以添加更多 DMD 显示器,使时钟更大。阅读本文了解更多信息。

添加更多闹钟:

要添加更多警报,请将以下代码行添加到草图并在主循环中调用 void:

void CheckAlarm-ALARM-NO-() {

AlarmSet =digitalRead(AlarmSetPin);

Snooze =digitalRead(SnoozePin);

字节秒、分、小时、dayOfWeek、dayOfMonth、月、年;

getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);

/* 如果是下面列出的一天,则仅触发警报。这可以通过将数字更改为以下任何一项来更改:

1 =星期日

2 =星期一

3 =星期二

4 =星期三

5 =星期四

6 =星期五

7 =星期六

<代码> */

if(dayOfWeek ==2 || dayOfWeek ==3 || dayOfWeek ==4 || dayOfWeek ==5 ||dayOfWeek ==6) { //这是允许响铃的天数

if(hour ==18 &&minute ==05) { //在这里设置时间(24小时内)

if(AlarmSet ==LOW) { //如果报警引脚打开

Snooze =digitalRead(SnoozePin);

while(Snooze ==HIGH)

<代码> {

Snooze =digitalRead(SnoozePin);

//添加这里发生的事情

<代码> }

<代码> }

<代码> }

<代码> }

代码

  • 主时钟代码
主时钟代码C/C++
/* 主时钟草图。创建于 26/03/14 这是一个使用 Freetronics DMD 作为显示输出的 arduino 程序。它包含一个报警功能。日期、日期和时间打印在 DMD 上。闹钟功能按钮在针脚 2 上用于闹钟设置,针脚 3 上用于小睡,针脚 4 上用于输出闹钟。闹钟时间和星期几可以在第 551 和 552 行设置。 Jed Hodson 2014 */byte dayOfWeek=4;byte dayOfMonth=1;#include  //SPI.h 必须包含在 DMD 中通过 SPI(IDE 否则会抱怨)#include  //#include  //#include "SystemFont5x7.h"#include "Wire.h"#define DS1307_I2C_ADDRESS 0x68int AlarmSetPin =2;int SnoozePin =3;int Alarm =4;int AlarmSet =0;int Snooze =0;// 将普通十进制数转换为二进制编码的十进制字节 decToBcd(byte val){ return ( (val/10*16) + (val%10) );}// 将二进制编码的十进制数转换为正常的十进制数byte bcdToDec(byte val){ return ( (val/16*10) + (val%16) );}// 1) 在 ds1307 上设置日期和时间// 2) 启动时钟// 3) 将小时模式设置为 24 小时制// 假设您正在传递有效数字void setDateDs1307(byte second, // 0-59byte minute, // 0-59byte hour, // 1-23byte dayOfWeek, // 1-7byte dayOfMonth, // 1-28/29/30/31byte month, // 1-12byte year) // 0-99{ Wire.beginTransmission(DS1307_I2C_AD裙子); Wire.write(0); Wire.write(decToBcd(second)); // 0 到第 7 位启动时钟 Wire.write(decToBcd(minute)); Wire.write(decToBcd(小时)); Wire.write(decToBcd(dayOfWeek)); Wire.write(decToBcd(dayOfMonth)); Wire.write(decToBcd(month)); Wire.write(decToBcd(year)); Wire.write(00010000); // 发送 0x10 (hex) 00010000 (binary) 到控制寄存器 - 打开方波 Wire.endTransmission();}// 从 ds1307void getDateDs1307(byte *second,byte *minute,byte *hour, byte *dayOfWeek,byte *dayOfMonth,byte *month,byte *year){ // 重置寄存器指针 Wire.beginTransmission(DS1307_I2C_ADDRESS); Wire.write(0); Wire.endTransmission(); Wire.requestFrom(DS1307_I2C_ADDRESS, 7); // 其中一些需要掩码,因为某些位是控制位 *second =bcdToDec(Wire.read() &0x7f); *分钟 =bcdToDec(Wire.read()); *小时 =bcdToDec(Wire.read() &0x3f); // 如果 12 小时 am/pm *dayOfWeek =bcdToDec(Wire.read()); *dayOfMonth =bcdToDec(Wire.read()); *month =bcdToDec(Wire.read()); *year =bcdToDec(Wire.read());}//启动DMD库为dmdDMD dmd(1,1);void ScanDMD(){ dmd.scanDisplayBySPI();}void setup(){ byte second, minute ,小时,dayOfWeek,dayOfMonth,月,年; //初始化TimerOne的中断/CPU使用率,用于扫描刷新显示 Timer1.initialize(5000); //以微秒为单位调用ScanDMD的周期。任何超过 5000 (5ms) 的时间,您都会看到闪烁。 Timer1.attachInterrupt(ScanDMD); // 将 Timer1 中断附加到 ScanDMD,后者转到 dmd.scanDisplayBySPI() //清除/初始化 RAM 中保存的 DMD 像素 dmd.clearScreen( true ); //true 为正常(所有像素关闭),false 为负(所有像素开启) dmd.selectFont(System5x7); Wire.begin(); // 将这些值更改为您希望将时钟设置为的值。 // 您可能只想设置一次时钟,然后删除 // setDateDs1307 调用。秒 =0;分钟 =35;小时 =11; // 使用 24 小时制,否则日期/日期计算将关闭 dayOfWeek =1; dayOfMonth =23;月 =3;年 =14; //取消注释下面的 setDateDs1307 调用以将时间设置为上面的间隔。请记住,如果您设置了时间//您需要再次取消注释下面的行,否则草图将只停留在设置的时间。 //setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year); pinMode(AlarmSetPin, INPUT_PULLUP); pinMode(SnoozePin,INPUT_PULLUP); pinMode(报警,输出); digitalWrite(Alarm, LOW);}void drawDay()// 显示星期几{ byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); switch(dayOfWeek) { case 1:dmd.drawString( 1,0, "Sun,", 3, GRAPHICS_NORMAL );休息;情况 2:dmd.drawString( 1,0, "Mon,", 3, GRAPHICS_NORMAL);休息;情况 3:dmd.drawString( 1,0, "Tue,", 3, GRAPHICS_NORMAL);休息;情况 4:dmd.drawString( 1,0, "Wed,", 3, GRAPHICS_NORMAL);休息;案例 5:dmd.drawString( 1,0, "Thu,", 3, GRAPHICS_NORMAL);休息;案例 6:dmd.drawString( 1,0, "Fri,", 3, GRAPHICS_NORMAL);休息;案例 7:dmd.drawString( 1,0, "Sat,", 3, GRAPHICS_NORMAL);休息; }}void drawDate()// 显示数字日期{ byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); switch(dayOfMonth) { case 1:dmd.drawString( 20,0, "01", 2, GRAPHICS_NORMAL );休息;情况 2:dmd.drawString( 20,0, "02", 2, GRAPHICS_NORMAL);休息;情况 3:dmd.drawString( 20,0, "03", 2, GRAPHICS_NORMAL );休息;情况 4:dmd.drawString( 20,0, "04", 2, GRAPHICS_NORMAL);休息;案例 5:dmd.drawString( 20,0, "05", 2, GRAPHICS_NORMAL );休息;情况 6:dmd.drawString( 20,0, "06", 2, GRAPHICS_NORMAL);休息;情况 7:dmd.drawString( 20,0, "07", 2, GRAPHICS_NORMAL );休息;案例 8:dmd.drawString( 20,0, "08", 2, GRAPHICS_NORMAL );休息;案例 9:dmd.drawString( 20,0, "09", 2, GRAPHICS_NORMAL );休息;案例 10:dmd.drawString( 20,0, "10", 2, GRAPHICS_NORMAL );休息;案例 11:dmd.drawString( 20,0, "11", 2, GRAPHICS_NORMAL );休息;案例 12:dmd.drawString( 20,0, "12", 2, GRAPHICS_NORMAL );休息;案例 13:dmd.drawString( 20,0, "13", 2, GRAPHICS_NORMAL );休息;案例 14:dmd.drawString( 20,0, "14", 2, GRAPHICS_NORMAL );休息;案例 15:dmd.drawString( 20,0, "15", 2, GRAPHICS_NORMAL );休息;案例 16:dmd.drawString( 20,0, "16", 2, GRAPHICS_NORMAL );休息;案例 17:dmd.drawString( 20,0, "17", 2, GRAPHICS_NORMAL );休息;案例 18:dmd.drawString( 20,0, "18", 2, GRAPHICS_NORMAL );休息;案例 19:dmd.drawString( 20,0, "19", 2, GRAPHICS_NORMAL );休息;案例 20:dmd.drawString( 20,0, "20", 2, GRAPHICS_NORMAL );休息;案例 21:dmd.drawString( 20,0, "21", 2, GRAPHICS_NORMAL );休息;案例 22:dmd.drawString( 20,0, "22", 2, GRAPHICS_NORMAL );休息;案例 23:dmd.drawString( 20,0, "23", 2, GRAPHICS_NORMAL );休息;案例 24:dmd.drawString( 20,0, "24", 2, GRAPHICS_NORMAL );休息;案例 25:dmd.drawString( 20,0, "25", 2, GRAPHICS_NORMAL );休息;案例 26:dmd.drawString( 20,0, "26", 2, GRAPHICS_NORMAL);休息;案例 27:dmd.drawString( 20,0, "27", 2, GRAPHICS_NORMAL );休息;案例 28:dmd.drawString( 20,0, "28", 2, GRAPHICS_NORMAL );休息;案例 29:dmd.drawString( 20,0, "29", 2, GRAPHICS_NORMAL );休息;案例 30:dmd.drawString( 20,0, "30", 2, GRAPHICS_NORMAL );休息; case 31:dmd.drawString( 20,0, "31", 2, GRAPHICS_NORMAL );休息; }}void drawHour()// 绘制时针{ byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); if (hour>12) //去掉这个if命令24小时{hour=hour-12; // 这是一个 12 小时制的时钟 } switch(hour) { case 1:dmd.drawString( 1,8, "01", 2, GRAPHICS_NORMAL );休息;情况 2:dmd.drawString( 1,8, "02", 2, GRAPHICS_NORMAL );休息;情况 3:dmd.drawString( 1,8, "03", 2, GRAPHICS_NORMAL);休息;情况 4:dmd.drawString( 1,8, "04", 2, GRAPHICS_NORMAL);休息;案例 5:dmd.drawString( 1,8, "05", 2, GRAPHICS_NORMAL);休息;情况 6:dmd.drawString( 1,8, "06", 2, GRAPHICS_NORMAL);休息;情况 7:dmd.drawString( 1,8, "07", 2, GRAPHICS_NORMAL );休息;案例 8:dmd.drawString( 1,8, "08", 2, GRAPHICS_NORMAL);休息;案例 9:dmd.drawString( 1,8, "09", 2, GRAPHICS_NORMAL );休息;案例 10:dmd.drawString( 1,8, "10", 2, GRAPHICS_NORMAL );休息;案例 11:dmd.drawString( 1,8, "11", 2, GRAPHICS_NORMAL );休息;案例 12:dmd.drawString( 1,8, "12", 2, GRAPHICS_NORMAL );休息;案例 13:dmd.drawString( 1,8, "13", 2, GRAPHICS_NORMAL );休息;案例 14:dmd.drawString( 1,8, "14", 2, GRAPHICS_NORMAL );休息;案例 15:dmd.drawString( 1,8, "15", 2, GRAPHICS_NORMAL );休息;案例 16:dmd.drawString( 1,8, "16", 2, GRAPHICS_NORMAL);休息;案例 17:dmd.drawString( 1,8, "17", 2, GRAPHICS_NORMAL );休息;案例 18:dmd.drawString( 1,8, "18", 2, GRAPHICS_NORMAL );休息;案例 19:dmd.drawString( 1,8, "19", 2, GRAPHICS_NORMAL );休息;案例 20:dmd.drawString( 1,8, "20", 2, GRAPHICS_NORMAL );休息;案例 21:dmd.drawString( 1,8, "21", 2, GRAPHICS_NORMAL );休息;案例 22:dmd.drawString( 1,8, "22", 2, GRAPHICS_NORMAL );休息;案例 23:dmd.drawString( 1,8, "23", 2, GRAPHICS_NORMAL );休息;案例 24:dmd.drawString( 1,8, "24", 2, GRAPHICS_NORMAL );休息; }}void drawMinute(){ 字节秒、分、小时、dayOfWeek、dayOfMonth、月、年; getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); switch(minute) { case 0:dmd.drawString( 20,8, "00", 2, GRAPHICS_NORMAL );休息;情况 1:dmd.drawString(20,8, "01", 2, GRAPHICS_NORMAL);休息;情况 2:dmd.drawString( 20,8, "02", 2, GRAPHICS_NORMAL );休息;情况 3:dmd.drawString( 20,8, "03", 2, GRAPHICS_NORMAL);休息;情况 4:dmd.drawString( 20,8, "04", 2, GRAPHICS_NORMAL);休息;案例 5:dmd.drawString( 20,8, "05", 2, GRAPHICS_NORMAL);休息;情况 6:dmd.drawString( 20,8, "06", 2, GRAPHICS_NORMAL);休息;情况 7:dmd.drawString( 20,8, "07", 2, GRAPHICS_NORMAL);休息;案例 8:dmd.drawString( 20,8, "08", 2, GRAPHICS_NORMAL );休息;案例 9:dmd.drawString( 20,8, "09", 2, GRAPHICS_NORMAL);休息;案例 10:dmd.drawString( 20,8, "10", 2, GRAPHICS_NORMAL );休息;案例 11:dmd.drawString( 20,8, "11", 2, GRAPHICS_NORMAL );休息;案例 12:dmd.drawString( 20,8, "12", 2, GRAPHICS_NORMAL );休息;案例 13:dmd.drawString( 20,8, "13", 2, GRAPHICS_NORMAL );休息;案例 14:dmd.drawString( 20,8, "14", 2, GRAPHICS_NORMAL );休息;案例 15:dmd.drawString( 20,8, "15", 2, GRAPHICS_NORMAL);休息;案例 16:dmd.drawString( 20,8, "16", 2, GRAPHICS_NORMAL);休息;案例 17:dmd.drawString( 20,8, "17", 2, GRAPHICS_NORMAL );休息;案例 18:dmd.drawString( 20,8, "18", 2, GRAPHICS_NORMAL );休息;案例 19:dmd.drawString( 20,8, "19", 2, GRAPHICS_NORMAL );休息;案例 20:dmd.drawString( 20,8, "20", 2, GRAPHICS_NORMAL );休息;案例 21:dmd.drawString( 20,8, "21", 2, GRAPHICS_NORMAL );休息;案例 22:dmd.drawString( 20,8, "22", 2, GRAPHICS_NORMAL );休息;案例 23:dmd.drawString( 20,8, "23", 2, GRAPHICS_NORMAL);休息;案例 24:dmd.drawString( 20,8, "24", 2, GRAPHICS_NORMAL );休息;案例 25:dmd.drawString( 20,8, "25", 2, GRAPHICS_NORMAL );休息;案例 26:dmd.drawString( 20,8, "26", 2, GRAPHICS_NORMAL );休息;案例 27:dmd.drawString( 20,8, "27", 2, GRAPHICS_NORMAL );休息;案例 28:dmd.drawString( 20,8, "28", 2, GRAPHICS_NORMAL );休息;案例 29:dmd.drawString( 20,8, "29", 2, GRAPHICS_NORMAL );休息; case 30:dmd.drawString( 20,8, "30", 2, GRAPHICS_NORMAL);休息;案例 31:dmd.drawString( 20,8, "31", 2, GRAPHICS_NORMAL);休息; case 32:dmd.drawString( 20,8, "32", 2, GRAPHICS_NORMAL );休息;案例 33:dmd.drawString( 20,8, "33", 2, GRAPHICS_NORMAL );休息; case 34:dmd.drawString( 20,8, "34", 2, GRAPHICS_NORMAL);休息; case 35:dmd.drawString( 20,8, "35", 2, GRAPHICS_NORMAL);休息; case 36:dmd.drawString( 20,8, "36", 2, GRAPHICS_NORMAL );休息; case 37:dmd.drawString( 20,8, "37", 2, GRAPHICS_NORMAL );休息; case 38:dmd.drawString( 20,8, "38", 2, GRAPHICS_NORMAL );休息; case 39:dmd.drawString( 20,8, "39", 2, GRAPHICS_NORMAL );休息;案例 40:dmd.drawString( 20,8, "40", 2, GRAPHICS_NORMAL );休息;案例 41:dmd.drawString( 20,8, "41", 2, GRAPHICS_NORMAL );休息;案例 42:dmd.drawString( 20,8, "42", 2, GRAPHICS_NORMAL );休息;案例 43:dmd.drawString( 20,8, "43", 2, GRAPHICS_NORMAL );休息;案例 44:dmd.drawString( 20,8, "44", 2, GRAPHICS_NORMAL );休息; case 45:dmd.drawString( 20,8, "45", 2, GRAPHICS_NORMAL );休息; case 46:dmd.drawString( 20,8, "46", 2, GRAPHICS_NORMAL);休息;案例 47:dmd.drawString( 20,8, "47", 2, GRAPHICS_NORMAL);休息; case 48:dmd.drawString( 20,8, "48", 2, GRAPHICS_NORMAL );休息;案例 49:dmd.drawString( 20,8, "49", 2, GRAPHICS_NORMAL);休息;案例 50:dmd.drawString( 20,8, "50", 2, GRAPHICS_NORMAL);休息;案例 51:dmd.drawString( 20,8, "51", 2, GRAPHICS_NORMAL );休息;案例 52:dmd.drawString( 20,8, "52", 2, GRAPHICS_NORMAL );休息;案例 53:dmd.drawString( 20,8, "53", 2, GRAPHICS_NORMAL );休息;案例 54:dmd.drawString( 20,8, "54", 2, GRAPHICS_NORMAL);休息;案例 55:dmd.drawString( 20,8, "55", 2, GRAPHICS_NORMAL);休息;案例 56:dmd.drawString( 20,8, "56", 2, GRAPHICS_NORMAL);休息;案例 57:dmd.drawString( 20,8, "57", 2, GRAPHICS_NORMAL);休息;案例 58:dmd.drawString( 20,8, "58", 2, GRAPHICS_NORMAL);休息; case 59:dmd.drawString( 20,8, "59", 2, GRAPHICS_NORMAL);休息; }}void drawCol(){ dmd.drawString( 14,8, ":", 1, GRAPHICS_NORMAL );}void runClock(){ drawDay();绘制日期();绘制时间(); drawCol();绘制分钟(); CheckAlarm();}void AlarmSequence() { drawDay();绘制日期();绘制时间(); drawCol();绘制分钟();数字写入(警报,高);延迟(1000); dmd.clearScreen(真);数字写入(报警,低); delay(1000);}void CheckAlarm() { AlarmSet =digitalRead(AlarmSetPin); Snooze =digitalRead(SnoozePin);字节秒、分、小时、dayOfWeek、dayOfMonth、月、年; getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); /* 如果是下面列出的一天,则仅触发警报。这可以通过将数字更改为以下任何一项来更改:1 =星期日 2 =星期一 3 =星期二 4 =星期三 5 =星期四 6 =星期五 7 =星期六 */ if(dayOfWeek ==2 || dayOfWeek ==3 | | dayOfWeek ==4 || dayOfWeek ==5 ||dayOfWeek ==6) { //这是允许响铃的天数 if(hour ==18 &&minute ==05 ) { //在这里设置时间(24小时内) Time) if(AlarmSet ==LOW) { //如果闹钟针脚开启贪睡 =digitalRead(SnoozePin); while(Snooze ==HIGH) { Snooze =digitalRead(SnoozePin);报警序列(); } } } }}void loop(){ runClock(); }

示意图


制造工艺

  1. 布谷鸟钟
  2. Arduino pov 视觉时钟
  3. DIY 最简单的 IV9 Numitron 时钟与 Arduino
  4. 简单字时钟(Arduino)
  5. 带有伊斯兰祈祷时间的 Arduino 时钟
  6. Arduino Spybot
  7. FlickMote
  8. 自制电视 B-Gone
  9. Arduino 温度。使用 3.2 显示的监视器和实时时钟
  10. 柏林时钟
  11. 找到我
  12. 带 DS1302 RTC 的简单闹钟