超大号數碼管時鐘
最近發現家裡居然沒有鐘,看時間還得先找手機,買一個又太貴還不夠有創意,為了彰顯個性(其實是窮),所以決定自己做一個。
準備的工具和材料:本來是準備用大号的數碼管顯示時間,上網一看,不但不夠大而且還貴。轉念一想,反正數碼管也是LED做的,正好最近買了一盤LED燈帶,自己來做超大号的LED算了。
超大号數碼管的制作
1cm寬的長條
正六邊形邊框
7段數碼管要準備7個邊框
7段數碼管框架
粘上LED燈帶
鑽孔
标上字母,連接所有燈帶負極
設計圖手稿
4位數碼管出線位置不一樣
4位數碼管完工
主控電路和外殼
主控電路圖
74HC595
DS1307模塊
主控模塊正面
主控模塊背面
設計圖
微型人體感應模塊
人體感應模塊
裝飾用正六邊形
各模塊間的連線
給超大号數碼管貼膜
設置時間代碼
//先上傳這部分代碼,給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每日頭條,我们将持续为您更新最新资讯!