3 // minutes of "dawn" before alarm
7 // "dawn" + "daylight" + blue blinding light
10 // number of available alarms; max 10 for storage in the DS1307 ram
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
33 digitalWrite(RPIN,255);
37 // if the RTC is already running read alarms and status
38 Wire.beginTransmission(DS1307_ADDRESS);
40 Wire.endTransmission();
42 Wire.requestFrom(DS1307_ADDRESS, 1);
43 char running = Wire.receive();
44 running = !(running>>7);
47 Wire.requestFrom(DS1307_ADDRESS, 12 + NALARMS * 5);
48 for (int i = 0; i < 8 ; i ++ ) {
53 cmin = Wire.receive();
54 for ( int i = 0; i < NALARMS ; i ++ ) {
55 for ( int j = 0; j < 5 ; j ++ ) {
56 alarms[i][j] = Wire.receive();
60 for ( int i = 0 ; i < NALARMS ; i ++ ) {
61 for ( int j = 0; j < 5 ; j ++ ) {
67 // DEBUG: we don't want to set the time until we receive
68 // it from serial, but serial is not implemented yet
69 set_time(11,9,2,5,0,0,0);
76 // read commands from serial
78 // read time, check alarms
82 // act on status: LEDs and buzzer
87 // wait about till the next second
93 // Set the current time
94 void set_time(int y,int m,int d, int w, int hh, int mm, int ss) {
95 Wire.beginTransmission(DS1307_ADDRESS);
97 Wire.send(bin2bcd(ss));
98 Wire.send(bin2bcd(mm));
99 Wire.send(bin2bcd(hh));
101 Wire.send(bin2bcd(d));
102 Wire.send(bin2bcd(m));
103 Wire.send(bin2bcd(y));
105 Wire.endTransmission();
109 Wire.beginTransmission(DS1307_ADDRESS);
111 Wire.endTransmission();
113 Wire.requestFrom(DS1307_ADDRESS, 6);
115 int mm = bcd2bin(Wire.receive());
116 int hour = bcd2bin(Wire.receive());
117 int wday = Wire.receive();
118 int day = bcd2bin(Wire.receive());
119 int month = bcd2bin(Wire.receive());
122 for ( int i = 0; i < NALARMS ; i ++ ) {
124 if ( ( alarms[i][0] & ( 1 << (wday - 1) ) ) ||
125 (month == alarms[i][1] && day == alarms[i][2]) ) {
126 // this is alarm day!
127 if ( hour == alarms[i][3] && mm == alarms[i][4]) {
128 // this is alarm hour!
132 if ( ( alarms[i][0] & 128 ) == 0 ) {
133 // this alarm won't be repeated
134 alarms[i] = { 0,0,0,0,0 };
150 if ( st > 0 && st <= TIN) {
151 int y = int(float(st*255)/TIN);
155 } else if ( st > TIN && st < TDAY ) {
157 analogWrite(YPIN,255);
159 }else if (st >= TDAY) {
162 analogWrite(BPIN,255);
163 } else if (st == TOUT) {
167 analogWrite(RPIN,255);
173 // BCD helper functions from adafruit-RTClib
174 static uint8_t bcd2bin (uint8_t val) { return val - 6 * (val >> 4); }
175 static uint8_t bin2bcd (uint8_t val) { return val + 6 * (val / 10); }
177 // vim: set filetype=c: