為了脫離爆肝病奄奄大學生的稱號,
以效法農業時代日出而作,日落而息的精神,
就來做一個能夠告訴自己每個時間該做什麼事情的鬧鐘吧。
一天二十四小時三等分,
每天能睡上八小時絕對是件幸福的事情了吧。
而為了對應日光的腳步,
正午就該是一天當中生產過程的中點。
於是原型機就出現了。
簡單說就是24小時制的指針時鐘。
零時在三角形的下邊正中央,
正午12點在三角形的上方頂點。
下邊顯示20點到清晨4點,這段時間該睡覺休息。
左邊顯示4點到12點,表示上午的時間,
右邊顯示12點到20點,亦即下午的時間。
而分鐘表示就跟普通時鐘一樣了,
但是60分無法被24整除,因此每跳一格代表2.5分鐘。
24個LED圍成的三角形中間有兩樣東西,
分別是蜂鳴器以及光敏電阻。
蜂鳴器用來擔任鬧鐘響鈴的工作,
五伏的蜂鳴器就可以吵死人了。
而光敏電阻則是用來自動調整LED亮度,
否則晚上睡覺的時候會非常刺眼。
實際影片:
顯示順序依序為:時-位置標旗-分
所以影片所顯示的就是晚上九點半,
位置標旗是為了在昏暗環境下也可以容易的讀出時間。
現場看比影片明顯很多。
位置標旗
訓練耐心的電路呵呵。
--------------------------------------
健康鬧鐘程式碼
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <DS1307RTC.h> | |
#include <Time.h> | |
#include <Wire.h> | |
#define ClockPin 3 //595's clock | |
#define LatchPin 4 //595's latch | |
#define enablePin 5 //595's output enable (control the brightness of LEDs) | |
#define DataPin 6 //595's data input | |
#define buzzerPin 7 //buzzer | |
tmElements_t tm; | |
void setup() { | |
Serial.begin(9600); | |
pinMode(DataPin, OUTPUT); | |
pinMode(LatchPin, OUTPUT); | |
pinMode(ClockPin, OUTPUT); | |
pinMode(enablePin, OUTPUT); | |
pinMode(buzzerPin, OUTPUT); | |
digitalWrite(buzzerPin,HIGH); | |
analogWrite(enablePin,245); | |
onAll(); | |
delay(300); | |
offAll(); | |
delay(300); | |
onAll(); | |
delay(300); | |
offAll(); | |
delay(300); | |
} | |
void loop() { | |
byte brightness; | |
brightness=map(analogRead(A3),320,1024,230,254); //check the environment brightness | |
analogWrite(5,brightness); | |
RTC.read(tm); | |
/* | |
Serial.print(" "); | |
Serial.print(tm.Hour); | |
Serial.print(" "); | |
Serial.print(tm.Minute); | |
Serial.print(" "); | |
Serial.println(tm.Second); | |
*/ | |
onHour(); | |
delay(794); | |
onFlag(); | |
delay(5); | |
onMinute(); | |
delay(200); | |
//check when to turn on the buzzer | |
if(tm.Hour==7&&tm.Minute<20){ | |
digitalWrite(7,LOW); | |
delay(100); | |
digitalWrite(7,HIGH); | |
} | |
} | |
//trun on all LED | |
void onAll(){ | |
digitalWrite(LatchPin, LOW); | |
shiftOut(DataPin, ClockPin, MSBFIRST, 0b11111111); | |
shiftOut(DataPin, ClockPin, MSBFIRST, 0b11111111); | |
shiftOut(DataPin, ClockPin, MSBFIRST, 0b11111111); | |
digitalWrite(LatchPin, HIGH); | |
} | |
//trun off all LED | |
void offAll(){ | |
digitalWrite(LatchPin, LOW); | |
shiftOut(DataPin, ClockPin, MSBFIRST, 0b00000000); | |
shiftOut(DataPin, ClockPin, MSBFIRST, 0b00000000); | |
shiftOut(DataPin, ClockPin, MSBFIRST, 0b00000000); | |
digitalWrite(LatchPin, HIGH); | |
} | |
//turn on the flags | |
void onFlag(){ | |
digitalWrite(LatchPin, LOW); | |
shiftOut(DataPin, ClockPin, MSBFIRST, 0b00010001); | |
shiftOut(DataPin, ClockPin, MSBFIRST, 0b00010001); | |
shiftOut(DataPin, ClockPin, MSBFIRST, 0b00010001); | |
digitalWrite(LatchPin, HIGH); | |
} | |
void onHour(){ | |
byte H=0; | |
bitSet(H,tm.Hour%8); | |
digitalWrite(LatchPin, LOW); | |
if(tm.Hour/8==0){ | |
shiftOut(DataPin, ClockPin, MSBFIRST, 0b00000000); | |
shiftOut(DataPin, ClockPin, MSBFIRST, 0b00000000); | |
shiftOut(DataPin, ClockPin, MSBFIRST, H); | |
} | |
else if(tm.Hour/8==1){ | |
shiftOut(DataPin, ClockPin, MSBFIRST, 0b00000000); | |
shiftOut(DataPin, ClockPin, MSBFIRST, H); | |
shiftOut(DataPin, ClockPin, MSBFIRST, 0b00000000); | |
} | |
else if(tm.Hour/8==2){ | |
shiftOut(DataPin, ClockPin, MSBFIRST, H); | |
shiftOut(DataPin, ClockPin, MSBFIRST, 0b00000000); | |
shiftOut(DataPin, ClockPin, MSBFIRST, 0b00000000); | |
} | |
digitalWrite(LatchPin, HIGH); | |
} | |
void onMinute(){ | |
byte M=0; | |
byte a=tm.Minute; | |
a*=2; | |
a/=5; | |
digitalWrite(LatchPin, LOW); | |
if(a<4){ | |
bitSet(M,a+4); | |
shiftOut(DataPin, ClockPin, MSBFIRST, 0b00000000); | |
shiftOut(DataPin, ClockPin, MSBFIRST, M); | |
shiftOut(DataPin, ClockPin, MSBFIRST, 0b00000000); | |
} | |
else if(a>=4&&a<12){ | |
bitSet(M,a-4); | |
shiftOut(DataPin, ClockPin, MSBFIRST, M); | |
shiftOut(DataPin, ClockPin, MSBFIRST, 0b00000000); | |
shiftOut(DataPin, ClockPin, MSBFIRST, 0b00000000); | |
} | |
else if(a>=12&&a<20){ | |
bitSet(M,a-12); | |
shiftOut(DataPin, ClockPin, MSBFIRST, 0b00000000); | |
shiftOut(DataPin, ClockPin, MSBFIRST, 0b00000000); | |
shiftOut(DataPin, ClockPin, MSBFIRST, M); | |
} | |
else if(a>=20&&a<24){ | |
bitSet(M,a-20); | |
shiftOut(DataPin, ClockPin, MSBFIRST, 0b00000000); | |
shiftOut(DataPin, ClockPin, MSBFIRST, M); | |
shiftOut(DataPin, ClockPin, MSBFIRST, 0b00000000); | |
} | |
digitalWrite(LatchPin, HIGH); | |
} |
LED------------------------------2元/顆
100ohm電阻--------------------1元/個
74595-----------------------------5元/個
光敏電阻------------------------3元/個
電磁蜂鳴器---------------------6元/個
RTC 模組(DS1307)---115元/組
參考資料:
--------------------
74595:
Coopermaa-使用兩顆74595控制16顆LED
葉難-霹靂車燈
74595 dtasheet
-------------------
RTC(DS1307):
葉難-即時時鐘DS1307
DS1307 Arduino Library
DS1307 datasheet
-------------------
下一版要做成掛壁鐘,全部用IC拼,模組掰掰。
沒有留言:
張貼留言