3 #include <RealTimeClockDS1307.h>
5 // minutes of "dawn" before alarm
9 // "dawn" + "daylight" + blue blinding light
12 // number of available alarms; max 10 for storage in the DS1307 ram
23 int st = 0; // alarm status (minutes from alarm - TIN)
24 char alarms[NALARMS][5]; // alarm settings
25 char cmin; // current minute
26 int a = -1; // current alarm
27 char dbg = 0; // print debug informations
28 bool ringing = false; // sound the alarm
31 int freq[] = { 255, 192, 128, 96, 64, 96, 128, 192, 255 }; // frequencies for the alarm
43 TCCR2A = _BV(COM2A0) | _BV(COM2B1) | _BV(WGM20);
44 TCCR2B = _BV(WGM22) | _BV(CS22);
46 digitalWrite(RPIN,255);
47 digitalWrite(YPIN,255);
50 // if the RTC is already running read alarms and status,
51 // otherwise set everything to a sane default
52 if ( RTC.readData(0x00) >> 7 ) {
53 for ( int i = 0 ; i < NALARMS ; i ++ ) {
54 for ( int j = 0; j < 5 ; j ++ ) {
62 st = RTC.readData(0x08);
63 a = RTC.readData(0x09);
64 cmin = RTC.readData(0x0a);
65 // This only works if the arduino had no power for a
66 // "short" time. This is by design. :D
68 st = st + (RTC.getMinutes() - cmin) % 60;
69 cmin = RTC.getMinutes();
71 for ( int i = 0; i < NALARMS ; i ++ ) {
72 for ( int j = 0; j < 5 ; j ++ ) {
73 alarms[i][j] = RTC.readData(0x0b + i*5 + j);
82 // read commands from serial
85 // read time, check alarms
92 Serial.print(", a: ");
94 Serial.print(", cmin: ");
95 Serial.println(cmin,DEC);
98 // act on status: LEDs and buzzer
110 // wait about till the next second
117 RTC.writeData(0x08,st);
118 RTC.writeData(0x09,a);
119 RTC.writeData(0x0a,cmin);
122 // ****** Serial interface management *************************************** //
124 void check_serial() {
125 int rec = Serial.read();
149 int i = s_read_dig();
150 for ( int j = 0; j < 5 ; j++) {
151 alarms[i][j] = s_read_2hex();
153 for ( int j = 0; j < 5 ; j++ ) {
154 RTC.writeData(0x0b + i*5 + j,alarms[i][j]);
156 Serial.print("Alarm ");
158 Serial.println(" set.");
163 RTC.setYear(s_read_2dig());
164 RTC.setMonth(s_read_2dig());
165 RTC.setDate(s_read_2dig());
166 RTC.setDayOfWeek(s_read_dig());
167 RTC.setHours(s_read_2dig());
168 RTC.setMinutes(s_read_2dig());
169 RTC.setSeconds(s_read_2dig());
171 Serial.print("Time set: ");
178 while ( rec == -1 ) {
186 n = s_read_dig() * 10;
187 n = n + s_read_dig();
194 while ( rec == -1 ) {
197 if ( rec >= 48 && rec < 58 ) {
199 } else if ( rec >= 65 && rec < 71 ) {
201 } else if ( rec >= 97 && rec < 102 ) {
210 n = s_read_hex() * 16;
211 n = n + s_read_hex();
215 void s_print_alarms() {
216 for ( int i = 0; i < NALARMS ; i++) {
219 for ( int j = 0; j < 5 ; j++) {
220 Serial.print(alarms[i][j],DEC);
227 void s_print_time() {
229 Serial.print(RTC.getYear(),DEC);
231 Serial.print(RTC.getMonth(),DEC);
233 Serial.print(RTC.getDate(),DEC);
235 Serial.print(RTC.getDayOfWeek(),DEC);
237 Serial.print(RTC.getHours(),DEC);
239 Serial.print(RTC.getMinutes(),DEC);
241 Serial.println(RTC.getSeconds(),DEC);
244 void s_toggle_debug() {
252 void s_print_help() {
254 Serial.println(" a<s> - set an alarm");
255 Serial.println(" <s> is nhhhhhhhhhh");
256 Serial.println(" alarm ID");
257 Serial.println(" one bit (in hex) for day of week");
258 Serial.println(" hex values for month, day");
259 Serial.println(" hex values for hour, minutes");
260 Serial.println(" (relative to start-of-dawn time)");
261 Serial.println(" s<s> - set the clock");
262 Serial.println(" <s> is yymmgguHHMMSS");
263 Serial.println(" p - print the alarms");
264 Serial.println(" t - print the clock");
265 Serial.println(" d - toggle printing of debug informations");
266 Serial.println(" h - print this help");
269 // ****** Time management *************************************************** //
271 // Set the current time
272 void set_time(int y,int m,int d, int w, int hh, int mm, int ss) {
287 int mm = RTC.getMinutes();
288 int hour = RTC.getHours();
289 int wday = RTC.getDayOfWeek();
290 int day = RTC.getDate();
291 int month = RTC.getMonth();
294 for ( int i = 0; i < NALARMS ; i ++ ) {
296 if ( ( alarms[i][0] & ( 1 << (wday - 1) ) ) ||
297 (month == alarms[i][1] && day == alarms[i][2]) ) {
298 // this is alarm day!
299 if ( hour == alarms[i][3] && mm == alarms[i][4]) {
300 // this is alarm hour!
305 if ( ( alarms[i][0] & 128 ) == 0 ) {
306 // this alarm won't be repeated
307 alarms[i] = { 0,0,0,0,0 };
308 for ( int j = 0; j < 5 ; j++ ) {
309 RTC.writeData(0x0b + i*5 + j,0);
326 // ****** LED management **************************************************** //
329 if ( st > 0 && st <= TIN) {
330 int y = int(float(st*255)/TIN);
334 } else if ( st > TIN && st < TDAY ) {
336 analogWrite(YPIN,255);
338 } else if (st >= TDAY && st < TOUT) {
341 analogWrite(BPIN,255);
342 } else if (st == TOUT) {
347 analogWrite(RPIN,255);
357 pinMode(APIN1,OUTPUT);
358 for (int i=0; i<NFREQ ; i++) {
362 pinMode(APIN1,INPUT);
366 // vim: set filetype=c: