视频加载中...
超大号数码管时钟
最近发现家里居然没有钟,看时间还得先找手机,买一个又太贵还不够有创意,为了彰显个性(其实是穷),所以决定自己做一个。
准备的工具和材料:arduino pro miniDS1307模块LED灯带74HC595人体感应模块小刀、电烙铁、胶水、网线、漆包线、纸板若干本来是准备用大号的数码管显示时间,上网一看,不但不够大而且还贵。转念一想,反正数码管也是LED做的,正好最近买了一盘LED灯带,自己来做超大号的LED算了。
超大号数码管的制作把硬纸板切成1cm宽的长条,用来做每一段数码管的边框。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左右的漆包线就可以了。最终好歹是完成了,和设计的样子相差不大,至少作为一个钟的功能是没有问题的,不完善的地方留待有空再说吧。这里把制作过程记录一下留作回忆,顺便计划一下那个备用的六边形可以搞点啥玩意。
家里有以前买的2个电子表,长时间不带了,最近拿出来一看电没有了。好像电池能撑个2年吧。
以前换过1次,去外面钟表维修店换个电池开价80元。2个手表都换的话起码150元。
这次尝试一下自己换电池。马上可以省下百元大钞啊!(工具+电池成本才20元不到啊)
其实换电池最难的是打开后盖,经过自己动手换后就知道了几种后盖方式:
1,一种是卡西欧那样的,后盖用螺丝固定的
2,一种是DW那样的,是压盖型的
3,剩下一种,是旋转式的,需要用到专用的开盖器
几种工具大概介绍一下。
1,就是一个扁平的小工具(最右边的),用来敲开手表普通压盖型的后盖,用最右面的先敲个一个小缝,然后用工具1把整个后盖打开。
2,第2个工具就是用来旋转式的后盖。
下面 我附上换电池全过程的照片给大家看,估计就比较好理解了。
第一个手表家里的第一个手表就属于第一个类型的,用最右面的先敲个一个小缝,然后用工具1把整个后盖打开。整个更换过程也比较简单,这里就不多说了。
第二个MK手表刚开始以为和第一个手表一样的,怎么都敲不开,尝试了多次直接放弃了,只能某宝另外买个工具2。
第一步,为了方便拆迁,需要把表带拆开,就是一个顶针。
第二步,用工具2逆旋转打开后盖。对准后盖的小缺口,把工具调节到位,然后拧紧,多次逆旋转慢慢打开后盖。
第三步,更换电池。
打开后就是这样的,小心取下塑料圆环,轻轻拨开电池上小弹片,取下旧电池,更换上新买的纽扣新电池。
第四步,收尾。同样的方法按顺时针方向慢慢拧紧后盖,直至肉眼看不到缝隙。
调整时间和日期,手表满血复活。
装回后盖需要注意的一点,就是后盖的防水胶圈一定要放好!!!
红色箭头指着的地方黑色的胶圈,手表上有一个凹槽,是用来固定防水胶圈的,放好后才能盖上后盖。不然防水胶圈就会被压变形,手表就不防水了!!!
一个字一个字的码真的累,喜欢的话收藏一下,下次就可以自己动手更换手表电池!
马上可以省下百元大钞啊!(工具+电池成本才20元不到啊)