Arduino sketch with the DS1307
[fuzzy_alarm_clock.git] / ds1307 / arduino_sketch / fuzzy_alarm_clock_ds1307.pde
blob394e5378f442968852165e1bd6d9b771ad694ae1
1 #include <Wire.h>
3 // minutes of "dawn" before alarm
4 #define TIN 30
5 // minutes of "dawn" + minutes of blue blinding light
6 #define TOUT 45
8 // number of available alarms
9 #define NALARMS 4
11 #define RPIN 3
12 #define YPIN 5
13 #define BPIN 6
15 #define DS1307_ADDRESS 0x68
17 int st = 0; // alarm status (minutes from alarm - TIN)
18 char alarms[NALARMS][5];
19 char cmin; // current minute
20 int a = -1; // current alarm
22 void setup () {
23     Serial.begin(57600);
24     Wire.begin();
25     
26     set_time(11,9,2,5,0,0,0);
28     pinMode(RPIN,OUTPUT);
29     pinMode(YPIN,OUTPUT);
30     pinMode(BPIN,OUTPUT);
32     digitalWrite(RPIN,255);
33     digitalWrite(YPIN,0);
34     digitalWrite(BPIN,0);
35     
36     // read alarms from storage
37     for ( int i = 0 ; i < NALARMS ; i ++ ) {
38         alarms[i][0] = 0;
39     }
42 void loop () {
43   
44   // read commands from serial
45   
46   // read time, check alarms
47   
48   check_time();
49   Serial.println(st);
51   
52   // act on status: LEDs and buzzer
53   if ( st > 0 ) {
54       set_leds();
55   }
56   
57   // wait about till the next second
58   
59   delay(1000);
60   
63 // Set the current time
64 void set_time(int y,int m,int d, int w, int hh, int mm, int ss) {
65     Wire.beginTransmission(DS1307_ADDRESS);
66     Wire.send(0);
67     Wire.send(bin2bcd(ss));
68     Wire.send(bin2bcd(mm));
69     Wire.send(bin2bcd(hh));
70     Wire.send(w);
71     Wire.send(bin2bcd(d));
72     Wire.send(bin2bcd(m));
73     Wire.send(bin2bcd(y));
74     Wire.send(0);
75     Wire.endTransmission();
78 void check_time() {
79     Wire.beginTransmission(DS1307_ADDRESS);
80     Wire.send(0);
81     Wire.endTransmission();
83     Wire.requestFrom(DS1307_ADDRESS, 6);
84     Wire.receive();
85     int mm = bcd2bin(Wire.receive());
86     int hour = bcd2bin(Wire.receive());
87     int wday = Wire.receive();
88     int day = bcd2bin(Wire.receive());
89     int month = bcd2bin(Wire.receive());
91     if ( a < 0 ) {
92         for ( int i = 0; i < NALARMS ; i ++ ) {
93             // check alarm i
94             if ( ( alarms[i][0] & ( 1 << (wday - 1) ) ) || 
95                     (month == alarms[i][1] && day == alarms[i][2]) ) {
96                 // this is alarm day!
97                 if ( hour == alarms[i][3] && mm == alarms[i][4]) {
98                     // this is alarm hour!
99                     a = i;
100                     st = 0;
101                     cmin = mm;
102                     if ( ( alarms[i][0] & 128 ) == 0 ) {
103                         // this alarm won't be repeated
104                         alarms[i] = { 0,0,0,0,0 };
105                     }
106                     break;
107                 }
108             } 
109         }
110     } else {
111         if ( cmin < mm ) {
112             cmin = mm;
113             st++;
114         }
115     }
119 void set_leds() {
120   if ( st > 0 && st < TIN) {
121       int y = int(float(st*255)/TIN);
122       int r = 255 - y;
123       analogWrite(RPIN,r);
124       analogWrite(YPIN,y);
125   } else if (st == TIN) {
126       analogWrite(RPIN,0);
127       analogWrite(YPIN,0);
128       analogWrite(BPIN,255);
129   } else if (st == TOUT) {
130       // reset stuff
131       st = 0;
132       a = -1;
133       analogWrite(RPIN,255);
134       analogWrite(YPIN,0);
135       analogWrite(BPIN,0);
136   }
139 // BCD helper functions from adafruit-RTClib
140 static uint8_t bcd2bin (uint8_t val) { return val - 6 * (val >> 4); }
141 static uint8_t bin2bcd (uint8_t val) { return val + 6 * (val / 10); }
143 // vim: set filetype=c: