3 // minutes of "dawn" before alarm
7 // "dawn" + "daylight" + blue blinding light
10 // number of available alarms
17 #define DS1307_ADDRESS 0x68
19 int st = 0; // alarm status (minutes from alarm - TIN)
20 char alarms[NALARMS][5];
21 char cmin; // current minute
22 int a = -1; // current alarm
28 set_time(11,9,2,5,0,0,0);
34 digitalWrite(RPIN,255);
38 // read alarms from storage
39 for ( int i = 0 ; i < NALARMS ; i ++ ) {
46 // read commands from serial
48 // read time, check alarms
54 // act on status: LEDs and buzzer
59 // wait about till the next second
65 // Set the current time
66 void set_time(int y,int m,int d, int w, int hh, int mm, int ss) {
67 Wire.beginTransmission(DS1307_ADDRESS);
69 Wire.send(bin2bcd(ss));
70 Wire.send(bin2bcd(mm));
71 Wire.send(bin2bcd(hh));
73 Wire.send(bin2bcd(d));
74 Wire.send(bin2bcd(m));
75 Wire.send(bin2bcd(y));
77 Wire.endTransmission();
81 Wire.beginTransmission(DS1307_ADDRESS);
83 Wire.endTransmission();
85 Wire.requestFrom(DS1307_ADDRESS, 6);
87 int mm = bcd2bin(Wire.receive());
88 int hour = bcd2bin(Wire.receive());
89 int wday = Wire.receive();
90 int day = bcd2bin(Wire.receive());
91 int month = bcd2bin(Wire.receive());
94 for ( int i = 0; i < NALARMS ; i ++ ) {
96 if ( ( alarms[i][0] & ( 1 << (wday - 1) ) ) ||
97 (month == alarms[i][1] && day == alarms[i][2]) ) {
99 if ( hour == alarms[i][3] && mm == alarms[i][4]) {
100 // this is alarm hour!
104 if ( ( alarms[i][0] & 128 ) == 0 ) {
105 // this alarm won't be repeated
106 alarms[i] = { 0,0,0,0,0 };
122 if ( st > 0 && st <= TIN) {
123 int y = int(float(st*255)/TIN);
127 } else if ( st > TIN && st < TDAY ) {
129 analogWrite(YPIN,255);
131 }else if (st >= TDAY) {
134 analogWrite(BPIN,255);
135 } else if (st == TOUT) {
139 analogWrite(RPIN,255);
145 // BCD helper functions from adafruit-RTClib
146 static uint8_t bcd2bin (uint8_t val) { return val - 6 * (val >> 4); }
147 static uint8_t bin2bcd (uint8_t val) { return val + 6 * (val / 10); }
149 // vim: set filetype=c: