//-------------------------------------- //file :say_ck.ino //Arduino 說出現在時間 //author:Victor Chen //web :www.vic8051.com //-------------------------------------- #include "SevenSegmentTM1637.h" int PIN_CLK = 4; // define CLK pin (any digital pin) int PIN_DIO = 5; // define DIO pin (any digital pin) SevenSegmentTM1637 display(PIN_CLK, PIN_DIO); int led =13; int tr =11; int k1 =7; int k2 =9; int bz=8; int gnd=19; //設定地線控制腳位 int v5=18; //設定5v控制腳位 int ck=14;int sd=15; int rdy=16; int rst=17; //設定語音合成控制腳位 int hh=0, mm=29, ss=50; unsigned long ti=0; char mess[]="1234"; //-------------------------------------- void setup() { Serial.begin(9600); pinMode(led, OUTPUT); display.begin(); display.setBacklight(100); pinMode(tr, INPUT); digitalWrite(tr, HIGH); pinMode(k1, INPUT) ; digitalWrite(k1, HIGH) ; pinMode(k2, INPUT); digitalWrite(k2, LOW); pinMode(v5, OUTPUT); pinMode(gnd, OUTPUT); digitalWrite(v5, HIGH); digitalWrite(gnd, LOW); delay(1000); pinMode(ck, OUTPUT); pinMode(rdy, INPUT); digitalWrite(rdy, HIGH); pinMode(sd, OUTPUT); pinMode(rst, OUTPUT); digitalWrite(rst, HIGH); digitalWrite(ck, HIGH); } //---------------------------------- void led_bl() { int i; for(i=0; i<2; i++) { digitalWrite(led, HIGH); delay(50); digitalWrite(led, LOW); delay(50); } } /-------------- void be() { int i; for(i=0; i<100; i++) { digitalWrite(bz, HIGH); delay(1); digitalWrite(bz, LOW); delay(1); } delay(10); } //--------------------------------------- void show_ck() { int d; display.clear(); d=hh/10; mess[0]=d+0x30; d=hh%10; mess[1]=d+0x30; d=mm/10; mess[2]=d+0x30; d=mm%10; mess[3]=d+0x30; display.print(mess); digitalWrite(led, HIGH); delay(50); digitalWrite(led, LOW); delay(50); } //-------------------------------------------------------------- void op(unsigned char c) //輸出語音合成控制碼 { unsigned char i,tb; while(1) // if(RDY==0) break; if( digitalRead(rdy)==0) break; digitalWrite(ck, 0); tb=0x80; for(i=0; i<8; i++) { // send data bit bit 7 first o/p if((c&tb)==tb) digitalWrite(sd, 1); else digitalWrite(sd, 0); tb>>=1; // clk low digitalWrite(ck, 0); delay(10); digitalWrite(ck, 1); } } /*-----------------------------------------------*/ void say(unsigned char *c) //將字串內容輸出到語音合成模組 { unsigned char c1; do{ c1=*c; op(c1); c++; } while(*c!='\0'); } /*-----------------------*/ void reset()//重置語音合成模組 { digitalWrite(rst,0); delay(50); digitalWrite(rst, 1); } //現在時間 byte mtime[]={0xB2, 0x7B, 0xA6, 0x62, 0xAE, 0xC9, 0xB6, 0xA1, 0}; //點 byte mhr[]={0xC2, 0x49, 0}; //分 byte mmin[]={0xA4, 0xC0, 0}; //秒 byte msec[]={0xAC, 0xED, 0}; //--------------------------------------------------- void say_time() { int c; say(mtime); c=hh/10; if(c!=0) op(c+0x30); c=hh%10; op(c+0x30); say(mhr); delay(300); c=mm/10; if(c!=0) op(c+0x30); c=mm%10; op(c+0x30); say(mmin); delay(300); c=ss/10; if(c!=0) op(c+0x30); c=ss%10; op(c+0x30); say(msec); } //-------------------------------- void loop() { led_bl();be(); reset(); led_bl(); show_ck(); say(mtime); while(1) { //----------------------------------- if( millis()-ti>=1000 ) { ti=millis(); ss=ss+1; if(ss==60) {mm++; ss=0;} if(mm==60) {hh++; mm=0;} if(hh==24) hh=0; show_ck(); if( mm==30 && ss==1 ) say_time(); if( mm==0 && ss==1 ) say_time(); } if( digitalRead(tr)==0 ) say_time(); // set hh, mm if(digitalRead(k1)==0) { led_bl(); delay(100); be(); be(); set_hh();} if(digitalRead(k2)==1) { led_bl(); delay(100); be(); set_mm();} } } //---------------------------- void set_hh() { while(1) { if(digitalRead(k1)==0) { delay(300); /*hold key*/ if(digitalRead(k1)==0) { be(); be(); be(); delay(600); ss=0; show_ck(); break; } else { if(hh==24) { hh=0; be(); be(); } else { hh++; be(); } show_ck(); } } if(digitalRead(k2)==1) { if(hh==0) { hh=0; be(); be(); } else { hh--; be(); } show_ck(); } }/* loop */ } void set_mm() { while(1) { if(digitalRead(k1)==0) { delay(300); /*hold key*/ if(digitalRead(k1)==0) { be(); be(); be(); delay(600); ss=0; show_ck(); break; } else { if(mm==60) { mm=0; be(); be(); } else { mm++; be(); } show_ck(); } } if(digitalRead(k2)==1) { if(mm==0) { mm=0; be(); be(); } else { mm--; be(); } show_ck(); } }/* loop */ }