2013年6月1日 星期六

[Arduino]日出而作日落而息健康鬧鐘(一)


為了脫離爆肝病奄奄大學生的稱號,

以效法農業時代日出而作,日落而息的精神,

就來做一個能夠告訴自己每個時間該做什麼事情的鬧鐘吧。


一天二十四小時三等分,

每天能睡上八小時絕對是件幸福的事情了吧。

而為了對應日光的腳步,

正午就該是一天當中生產過程的中點。

於是原型機就出現了。




顯示方式跟一般的時鐘不同,

簡單說就是24小時制的指針時鐘。

零時在三角形的下邊正中央,

正午12點在三角形的上方頂點。

下邊顯示20點到清晨4點,這段時間該睡覺休息。

左邊顯示4點到12點,表示上午的時間,

右邊顯示12點到20點,亦即下午的時間。

而分鐘表示就跟普通時鐘一樣了,

但是60分無法被24整除,因此每跳一格代表2.5分鐘。



24個LED圍成的三角形中間有兩樣東西,

分別是蜂鳴器以及光敏電阻。

蜂鳴器用來擔任鬧鐘響鈴的工作,

五伏的蜂鳴器就可以吵死人了。

而光敏電阻則是用來自動調整LED亮度,

否則晚上睡覺的時候會非常刺眼。

實際影片:


顯示順序依序為:時-位置標旗-分

所以影片所顯示的就是晚上九點半,

位置標旗是為了在昏暗環境下也可以容易的讀出時間。

現場看比影片明顯很多。


位置標旗

























訓練耐心的電路呵呵。

--------------------------------------

健康鬧鐘程式碼

#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拼,模組掰掰。