tft每日頭條

 > 生活

 > 數字時鐘是怎麼做的

數字時鐘是怎麼做的

生活 更新时间:2024-09-10 01:23:05

數字時鐘是怎麼做的(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左右的漆包線就可以了。最終好歹是完成了,和設計的樣子相差不大,至少作為一個鐘的功能是沒有問題的,不完善的地方留待有空再說吧。這裡把制作過程記錄一下留作回憶,順便計劃一下那個備用的六邊形可以搞點啥玩意。

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved