数字时钟是怎么做的(DIY一个超大号的数字时钟)

数字时钟是怎么做的(DIY一个超大号的数字时钟)(1)

超大号数码管时钟

最近发现家里居然没有钟,看时间还得先找手机,买一个又太贵还不够有创意,为了彰显个性(其实是穷),所以决定自己做一个。

准备的工具和材料:
  • arduino pro mini
  • DS1307模块
  • LED灯带
  • 74HC595
  • 人体感应模块
  • 小刀、电烙铁、胶水、网线、漆包线、纸板若干

本来是准备用大号的数码管显示时间,上网一看,不但不够大而且还贵。转念一想,反正数码管也是LED做的,正好最近买了一盘LED灯带,自己来做超大号的LED算了。

超大号数码管的制作
  • 把硬纸板切成1cm宽的长条,用来做每一段数码管的边框。

数字时钟是怎么做的(DIY一个超大号的数字时钟)(2)

1cm宽的长条

  • 把纸条围成一个六边形,自己做了一个固定用的框架用来给六边形的纸条定型。尺寸根据自己的LED灯带来做,我的边框可以装下3颗LED灯珠,最长的那条边是55mm。接头的地方抹上白胶,想要干得快可以用热风枪或者电吹风吹一下。

数字时钟是怎么做的(DIY一个超大号的数字时钟)(3)

正六边形边框

  • 我做的是7段数码管,所以每位数码管要准备7个边框

数字时钟是怎么做的(DIY一个超大号的数字时钟)(4)

7段数码管要准备7个边框

  • 准备一块底板,按7段数码管的位置用胶粘好,大小根据自己的边框来准备

数字时钟是怎么做的(DIY一个超大号的数字时钟)(5)

7段数码管框架

  • 边框准备好了,把LED灯带剪成3个一组粘到底板上

数字时钟是怎么做的(DIY一个超大号的数字时钟)(6)

粘上LED灯带

  • 在每段灯带焊脚上钻2个孔,用来穿线焊接导线

数字时钟是怎么做的(DIY一个超大号的数字时钟)(7)

钻孔

  • 我准备做成共阴型数码管。把准备好的网线剥开,取一种颜色用来连接所有负极。在底板背面每一段的位置标上字母,方便识别。

数字时钟是怎么做的(DIY一个超大号的数字时钟)(8)

标上字母,连接所有灯带负极

  • 每一段的正极接一根线,我的LED灯带每颗灯珠自带了电阻,所以我就直接接线了。没有电阻的需要自己焊接电阻哟

数字时钟是怎么做的(DIY一个超大号的数字时钟)(9)

  • 小时和分钟各两位,一共需要4个这样的超大号数码管。根据设计,需要一个从b段位置出线、一个从c段位置出线、两个从a段位置出线,所以要把正负极的线引到相应的位置,尽量多留一点,长了可以剪掉,短了就呵呵了

数字时钟是怎么做的(DIY一个超大号的数字时钟)(10)

设计图手稿

数字时钟是怎么做的(DIY一个超大号的数字时钟)(11)

4位数码管出线位置不一样

数字时钟是怎么做的(DIY一个超大号的数字时钟)(12)

4位数码管完工

主控电路和外壳
  • 电路原理比较简单,由arduino读取DS1307的时间,控制74HC595驱动我们自制的超大号数码管显示时间。由于数码管太大了,LED灯带在晚上会非常亮,完全可以当灯用了,所以我增加了一个人体感应模块,没有人的时候就控制数码管不显示,侦测到人时显示时间5秒钟。我买的人体感应模块如果感应到人体会自动刷新延时时间,所以如果有人一直在钟前移动的话,钟会一直显示时间直到人走开。

数字时钟是怎么做的(DIY一个超大号的数字时钟)(13)

主控电路图

  • 电路部分稍微说明一下。74HC595是一个8位串行输入、并行输出的位移缓存器,其中SHCP、STCP是两个时钟线,DS是串行输入口,OE控制Q0-Q7输出即控制数码管显示与熄灭,Q0-Q7是并行输出口,接数码管用。因为做的是7段数码管,所以只用了Q0-Q6,Q7不用,Q7'是用来串联下一个74HC595的DS口。输入第一个74HC595的数据满8位后会自动通过Q7'串行输出至下一个74HC595的DS口。这样可以只用SHCP、STCP和DS3个端口,就控制多位数码管输出,理论上可以串很多很多个,但实际使用受电源驱动能力影响。我这里只有4位数码管,只需要串联4个74HC595。

数字时钟是怎么做的(DIY一个超大号的数字时钟)(14)

74HC595

  • DS1307是一款低功耗,具有56字节非失性RAM的全BCD码时钟日历实时时钟芯片,使用I2C通信。外围电路比较简单,可以自己搭建,体积更小。我用的是成品模块。

数字时钟是怎么做的(DIY一个超大号的数字时钟)(15)

DS1307模块

  • 主控模块外壳同样使用硬纸板制作,用1cm宽的硬纸条围成一个边长43mm的正六边形粘在一块同样大小的底板上,再做一个大一圈的正六边形做盖子。将arduino和74HC595插在底板上固定,用网线按电路图连接各个模块的端口。各模块一定要共地。线有点多有点密,焊接的时候一定要规划好,先接最下面层的线,再依次接上面的线。DS1307的I2C接的arduino的A4、A5,图中是以前接的。实际应该接哪个位置应该根据你用的DS1307库来确定。

数字时钟是怎么做的(DIY一个超大号的数字时钟)(16)

主控模块正面

数字时钟是怎么做的(DIY一个超大号的数字时钟)(17)

主控模块背面

  • 根据设计,主控周围还有六个大小不等的正六边形作为装饰,其中一个可以装进一个微型人体感应模块,我选择最左边边长14mm的正六边形装人体感应模块。设计图中的模块位置和尺寸供大家参考。其中两个边长21mm的模块和主控模块准备装一到两颗LED,用arduino控制和数码管同时亮灭,以作为装饰。最右边边长33mm的正六边形模块引入电源正负极和串口作为备用。

数字时钟是怎么做的(DIY一个超大号的数字时钟)(18)

设计图

数字时钟是怎么做的(DIY一个超大号的数字时钟)(19)

微型人体感应模块

数字时钟是怎么做的(DIY一个超大号的数字时钟)(20)

人体感应模块

数字时钟是怎么做的(DIY一个超大号的数字时钟)(21)

装饰用正六边形

  • 超大号数码管和主控都准备好后就开始连线了。我是用直径1mm的漆包线作为74HC595和数码管之间的导线,同时也起支撑作用。但是要想做的比较好看就比较困难了,最好是用细点的线做造型,再用一块大的底板固定各个部分。人体感应模块连接到arduino的D10,作为装饰的LED直接连接到D9用arduino直接驱动应该没啥问题。

数字时钟是怎么做的(DIY一个超大号的数字时钟)(22)

各模块间的连线

  • 线连好后在超大号数码管面上蒙上一层白纸,这样LED点亮的时候看到的就是一块白色发光块,不然只能看到一堆LED灯珠晃花了眼。

数字时钟是怎么做的(DIY一个超大号的数字时钟)(23)

给超大号数码管贴膜

  • 最后说一下电源部分,电源进入主控电路后分成两路,一路带arduino,一路驱动74HC595,DS1307由arduino的5v输出驱动。我家门口刚好可以从视频监控引一路18v的直流电,所以我加了一块DC-DC的变压模块。大家可以直接用手机充电器作为电源适配器用。
arduino软件部分
  • 本来想用两个小的正六边形模块做成触摸开关用来调整时间。但不知道是啥原因,arduino的外部中断始终不能触发,所以就先把软件部分分成了两部分,一个用来设置时间,一个用来显示时间,先凑合着用,等有空了再研究研究代码的问题。

设置时间代码

//先上传这部分代码,给DS1307设置好时间 #include <Wire.h> #include <RTClib.h> // A4 -> SDA,A5 -> SCL int latchPin = 6; //ST-CP int clockPin = 5; //SH-CP int dataPin = 4; //DS RTC_DS1307 RTC; int Hour = 12; int Minute = 34; void setup () { pinMode(latchPin,OUTPUT); pinMode(clockPin,OUTPUT); pinMode(dataPin,OUTPUT); //让三个脚都是输出状态 digitalWrite(latchPin,LOW); digitalWrite(clockPin,LOW); digitalWrite(dataPin,LOW); Serial.begin(9600); Wire.begin(); RTC.begin(); RTC.adjust(DateTime(__DATE__, __TIME__)); //将电脑当前时间作为参数写进DS1307 } void loop(){}

显示时间代码

#include <Wire.h> #include <RTClib.h> // A4 -> SDA,A5 -> SCL int latchPin = 6; //ST-CP int clockPin = 5; //SH-CP int dataPin = 4; //DS int bg_led = 9; // 背景LED控制端口 int body_induction = 10; //人体感应输入端口 int show_switch = 11; //显示控制端口,接595的OE口 RTC_DS1307 RTC; int Hour = 12; int Minute = 34; void setup () { pinMode(latchPin,OUTPUT); pinMode(clockPin,OUTPUT); pinMode(dataPin,OUTPUT); //让三个脚都是输出状态 pinMode(hour_button,INPUT); pinMode(minute_button,INPUT); pinMode(bg_led,OUTPUT); //背景灯 pinMode(body_induction,INPUT); //人体感应 pinMode(show_switch,OUTPUT); //595OE口,控制显示 digitalWrite(latchPin,LOW); digitalWrite(clockPin,LOW); digitalWrite(dataPin,LOW); digitalWrite(bg_led,LOW); digitalWrite(show_switch,HIGH); Serial.begin(9600); Wire.begin(); RTC.begin(); } void loop() { DateTime now = RTC.now(); //读取时间 Hour = now.hour(); Minute = now.minute(); if(digitalRead(body_induction) == 1){ //如果人体感应模块感应到人接近就控制显示时 间和装饰用LED digitalWrite(show_switch,LOW); show_time(Hour, Minute); digitalWrite(bg_led,HIGH); delay(5000); } else{ digitalWrite(show_switch,HIGH); digitalWrite(bg_led,LOW); } delay(1000); } void show_time(int hour_v, int minute_v){ int arry[] = {63,6,91,79,102,109,125,7,127,111}; int first_H_num = floor(hour_v/10); int second_H_num = hour_v - (first_H_num * 10); int first_M_num = floor(minute_v/10); int second_M_num = minute_v - (first_M_num * 10); digitalWrite(latchPin,LOW); //将ST_CP口上面加低电平让芯片准备好接收数据 //这个就是用MSBFIRST参数让0-7个针脚以高电平输出(LSBFIRST 低电平)是dataPin的参数 //小时和分钟为个位数时,十位的数码管不显示 shiftOut(dataPin,clockPin,MSBFIRST,arry[second_M_num]);//先输出分钟的个位 if(first_M_num == 0){ //判断十位是否为0,再输出分钟的十位数字 shiftOut(dataPin,clockPin,MSBFIRST,0); } else{ shiftOut(dataPin,clockPin,MSBFIRST,arry[first_M_num]); } if(first_H_num == 0){ //我把小时的个位和十位接反了,所以只有改代码的输出顺序,先输出小时的十位 shiftOut(dataPin,clockPin,MSBFIRST,0); } else{ shiftOut(dataPin,clockPin,MSBFIRST,arry[first_H_num]); } shiftOut(dataPin,clockPin,MSBFIRST,arry[second_H_num]); //再输出小时的个位 digitalWrite(latchPin,HIGH); //将ST_CP这个针脚恢复到高电平,此时数码管才显示时间 }

需要代码中的DS1307库文件请私信“DS1307库文件

结束语

前前后后断断续续做了差不多2个月,主要是硬件部分太费时间了。特别是焊接漆包线的时候,铜丝传热非常快,焊锡还没化,热量就被铜线吸走了。建议不要用太粗的铜线,估计0.5mm左右的漆包线就可以了。最终好歹是完成了,和设计的样子相差不大,至少作为一个钟的功能是没有问题的,不完善的地方留待有空再说吧。这里把制作过程记录一下留作回忆,顺便计划一下那个备用的六边形可以搞点啥玩意。

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页