超大号数码管时钟
最近创造家里居然没有钟,看韶光还得先找手机,买一个又太贵还不足有创意,为了彰显个性(实在是穷),以是决定自己做一个。
本来是准备用大号的数码管显示韶光,上网一看,不但不足大而且还贵。转念一想,反正数码管也是LED做的,恰好最近买了一盘LED灯带,自己来做超大号的LED算了。

1cm宽的长条
把纸条围成一个六边形,自己做了一个固定用的框架用来给六边形的纸条定型。尺寸根据自己的LED灯带来做,我的边框可以装下3颗LED灯珠,最长的那条边是55mm。接头的地方抹上白胶,想要干得快可以用热风枪或者电吹风吹一下。正六边形边框
我做的是7段数码管,以是每位数码管要准备7个边框7段数码管要准备7个边框
准备一块底板,按7段数码管的位置用胶粘好,大小根据自己的边框来准备7段数码管框架
边框准备好了,把LED灯带剪成3个一组粘到底板上粘上LED灯带
在每段灯带焊脚上钻2个孔,用来穿线焊接导线钻孔
我准备做成共阴型数码管。把准备好的网线剥开,取一种颜色用来连接所有负极。在底板背面每一段的位置标上字母,方便识别。标上字母,连接所有灯带负极
每一段的正极接一根线,我的LED灯带每颗灯珠自带了电阻,以是我就直接接线了。没有电阻的须要自己焊接电阻哟小时和分钟各两位,一共须要4个这样的超大号数码管。根据设计,须要一个从b段位置出线、一个从c段位置出线、两个从a段位置出线,以是要把正负极的线引到相应的位置,只管即便多留一点,长了可以剪掉,短了就呵呵了设计图手稿
4位数码管出线位置不一样
4位数码管落成
主控电路和外壳电路事理比较大略,由arduino读取DS1307的韶光,掌握74HC595驱动我们低廉甜头的超大号数码管显示韶光。由于数码管太大了,LED灯带在晚上会非常亮,完备可以当灯用了,以是我增加了一个人体感应模块,没有人的时候就掌握数码管不显示,侦测到人时显示韶光5秒钟。我买的人体感应模块如果感应到人体会自动刷新延时时间,以是如果有人一贯在钟前移动的话,钟会一贯显示韶光直到人走开。主控电路图
电路部分轻微解释一下。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。74HC595
DS1307是一款低功耗,具有56字节非失落性RAM的全BCD码时钟日历实时时钟芯片,利用I2C通信。外围电路比较大略,可以自己搭建,体积更小。我用的是成品模块。DS1307模块
主控模块外壳同样利用硬纸板制作,用1cm宽的硬纸条围成一个边长43mm的正六边形粘在一块同样大小的底板上,再做一个大一圈的正六边形做盖子。将arduino和74HC595插在底板上固定,用网线按电路图连接各个模块的端口。各模块一定要共地。线有点多有点密,焊接的时候一定要方案好,先接最下面层的线,再依次接上面的线。DS1307的I2C接的arduino的A4、A5,图中因此前接的。实际该当接哪个位置该当根据你用的DS1307库来确定。主控模块正面
主控模块背面
根据设计,主控周围还有六个大小不等的正六边形作为装饰,个中一个可以装进一个微型人体感应模块,我选择最左边边长14mm的正六边形装人体感应模块。设计图中的模块位置和尺寸供大家参考。个中两个边长21mm的模块和主控模块准备装一到两颗LED,用arduino掌握和数码管同时亮灭,以作为装饰。最右边边长33mm的正六边形模块引入电源正负极和串口作为备用。设计图
微型人体感应模块
人体感应模块
装饰用正六边形
超大号数码管和主控都准备好后就开始连线了。我是用直径1mm的漆包线作为74HC595和数码管之间的导线,同时也起支撑浸染。但是要想做的比较好看就比较困难了,最好是用细点的线做造型,再用一块大的底板固定各个部分。人体感应模块连接到arduino的D10,作为装饰的LED直接连接到D9用arduino直接驱动该当没啥问题。各模块间的连线
线连好后在超大号数码管面上蒙上一层白纸,这样LED点亮的时候看到的便是一块白色发光块,不然只能看到一堆LED灯珠晃花了眼。给超大号数码管贴膜
末了说一下电源部分,电源进入主控电路后分成两路,一起带arduino,一起驱动74HC595,DS1307由arduino的5v输出驱动。我家门口刚好可以从视频监控引一起18v的直流电,以是我加了一块DC-DC的变压模块。大家可以直接用手机充电器作为电源适配器用。arduino软件部分本来想用两个小的正六边形模块做成触摸开关用来调度韶光。但不知道是啥缘故原由,arduino的外部中断始终不能触发,以是就先把软件部分分成了两部分,一个用来设置韶光,一个用来显示韶光,先凑合着用,等有空了再研究研究代码的问题。设置韶光代码
//先上传这部分代码,给DS1307设置好韶光#include <Wire.h>#include <RTClib.h> // A4 -> SDA,A5 -> SCLint latchPin = 6; //ST-CPint clockPin = 5; //SH-CPint dataPin = 4; //DSRTC_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 -> SCLint latchPin = 6; //ST-CPint clockPin = 5; //SH-CPint dataPin = 4; //DSint 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){ //如果人体感应模块感应到人靠近就掌握显示时 间和装饰用LEDdigitalWrite(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旁边的漆包线就可以了。终极好歹是完成了,和设计的样子相差不大,至少作为一个钟的功能是没有问题的,不完善的地方留待有空再说吧。这里把制作过程记录一下留作回顾,顺便操持一下那个备用的六边形可以搞点啥玩意。