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
20 int st = 0; // alarm status (minutes from alarm - TIN)
21 char alarms[NALARMS][5]; // alarm settings
22 char cmin; // current minute
23 int a = -1; // current alarm
24 char dbg = 0; // print debug informations
34 digitalWrite(RPIN,255);
35 digitalWrite(YPIN,255);
38 // DEBUG: we want to read the setup messages
43 // if the RTC is already running read alarms and status,
44 // otherwise set everything to the default
45 if ( RTC.readData(0x00) >> 7 ) {
46 Serial.println("Setup the clock");
47 for ( int i = 0 ; i < NALARMS ; i ++ ) {
48 for ( int j = 0; j < 5 ; j ++ ) {
55 st = RTC.readData(0x08);
56 a = RTC.readData(0x09);
57 cmin = RTC.readData(0x0a);
58 // FIXME: we want to update st to the time passed
59 // since the data was saved
60 for ( int i = 0; i < NALARMS ; i ++ ) {
61 for ( int j = 0; j < 5 ; j ++ ) {
62 alarms[i][j] = RTC.readData(0x0b + i*5 + j);
71 // read commands from serial
74 // read time, check alarms
81 Serial.print(", a: ");
83 Serial.print(", cmin: ");
84 Serial.println(cmin,DEC);
87 // act on status: LEDs and buzzer
92 // wait about till the next second
98 // ****** Serial interface management *************************************** //
100 void check_serial() {
101 int rec = Serial.read();
125 int i = s_read_dig();
126 for ( int j = 0; j < 5 ; j++) {
127 alarms[i][j] = s_read_2hex();
129 for ( int j = 0; j < 5 ; j++ ) {
130 RTC.writeData(0x0b + i*5 + j,alarms[i][j]);
132 Serial.print("Alarm ");
134 Serial.println(" set.");
138 RTC.setYear(s_read_2dig());
139 RTC.setMonth(s_read_2dig());
140 RTC.setDate(s_read_2dig());
141 RTC.setDayOfWeek(s_read_dig());
142 RTC.setHours(s_read_2dig());
143 RTC.setMinutes(s_read_2dig());
144 RTC.setSeconds(s_read_2dig());
146 Serial.print("Time set: ");
153 while ( rec == -1 ) {
161 n = s_read_dig() * 10;
162 n = n + s_read_dig();
169 while ( rec == -1 ) {
172 if ( rec >= 48 && rec < 58 ) {
174 } else if ( rec >= 65 && rec < 71 ) {
176 } else if ( rec > 97 && rec < 102 ) {
185 n = s_read_hex() * 16;
186 n = n + s_read_hex();
190 void s_print_alarms() {
191 for ( int i = 0; i < NALARMS ; i++) {
194 for ( int j = 0; j < 5 ; j++) {
195 Serial.print(alarms[i][j],DEC);
202 void s_print_time() {
204 Serial.print(RTC.getYear(),DEC);
206 Serial.print(RTC.getMonth(),DEC);
208 Serial.print(RTC.getDate(),DEC);
210 Serial.print(RTC.getDayOfWeek(),DEC);
212 Serial.print(RTC.getHours(),DEC);
214 Serial.print(RTC.getMinutes(),DEC);
216 Serial.println(RTC.getSeconds(),DEC);
219 void s_toggle_debug() {
227 void s_print_help() {
229 Serial.println(" a<s> - set an alarm");
230 Serial.println(" <s> is");
231 Serial.println(" s<s> - set the clock");
232 Serial.println(" <s> is yymmgguHHMMSS");
233 Serial.println(" p - print the alarms");
234 Serial.println(" t - print the clock");
235 Serial.println(" d - toggle printing of debug informations");
236 Serial.println(" h - print this help");
239 // ****** Time management *************************************************** //
241 // Set the current time
242 void set_time(int y,int m,int d, int w, int hh, int mm, int ss) {
257 int mm = RTC.getMinutes();
258 int hour = RTC.getHours();
259 int wday = RTC.getDayOfWeek();
260 int day = RTC.getDate();
261 int month = RTC.getMonth();
264 for ( int i = 0; i < NALARMS ; i ++ ) {
266 if ( ( alarms[i][0] & ( 1 << (wday - 1) ) ) ||
267 (month == alarms[i][1] && day == alarms[i][2]) ) {
268 // this is alarm day!
269 if ( hour == alarms[i][3] && mm == alarms[i][4]) {
270 // this is alarm hour!
274 if ( ( alarms[i][0] & 128 ) == 0 ) {
275 // this alarm won't be repeated
276 alarms[i] = { 0,0,0,0,0 };
277 for ( int j = 0; j < 5 ; j++ ) {
278 RTC.writeData(0x0b + i*5 + j,0);
294 // ****** LED management **************************************************** //
297 if ( st > 0 && st <= TIN) {
298 int y = int(float(st*255)/TIN);
302 } else if ( st > TIN && st < TDAY ) {
304 analogWrite(YPIN,255);
306 } else if (st >= TDAY && st < TOUT) {
309 analogWrite(BPIN,255);
310 } else if (st == TOUT) {
314 analogWrite(RPIN,255);
320 // vim: set filetype=c: