aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ds1307/arduino_sketch/fuzzy_alarm_clock_ds1307.pde143
1 files changed, 143 insertions, 0 deletions
diff --git a/ds1307/arduino_sketch/fuzzy_alarm_clock_ds1307.pde b/ds1307/arduino_sketch/fuzzy_alarm_clock_ds1307.pde
new file mode 100644
index 0000000..394e537
--- /dev/null
+++ b/ds1307/arduino_sketch/fuzzy_alarm_clock_ds1307.pde
@@ -0,0 +1,143 @@
+#include <Wire.h>
+
+// minutes of "dawn" before alarm
+#define TIN 30
+// minutes of "dawn" + minutes of blue blinding light
+#define TOUT 45
+
+// number of available alarms
+#define NALARMS 4
+
+#define RPIN 3
+#define YPIN 5
+#define BPIN 6
+
+#define DS1307_ADDRESS 0x68
+
+int st = 0; // alarm status (minutes from alarm - TIN)
+char alarms[NALARMS][5];
+char cmin; // current minute
+int a = -1; // current alarm
+
+void setup () {
+ Serial.begin(57600);
+ Wire.begin();
+
+ set_time(11,9,2,5,0,0,0);
+
+ pinMode(RPIN,OUTPUT);
+ pinMode(YPIN,OUTPUT);
+ pinMode(BPIN,OUTPUT);
+
+ digitalWrite(RPIN,255);
+ digitalWrite(YPIN,0);
+ digitalWrite(BPIN,0);
+
+ // read alarms from storage
+ for ( int i = 0 ; i < NALARMS ; i ++ ) {
+ alarms[i][0] = 0;
+ }
+}
+
+void loop () {
+
+ // read commands from serial
+
+ // read time, check alarms
+
+ check_time();
+ Serial.println(st);
+
+
+ // act on status: LEDs and buzzer
+ if ( st > 0 ) {
+ set_leds();
+ }
+
+ // wait about till the next second
+
+ delay(1000);
+
+}
+
+// Set the current time
+void set_time(int y,int m,int d, int w, int hh, int mm, int ss) {
+ Wire.beginTransmission(DS1307_ADDRESS);
+ Wire.send(0);
+ Wire.send(bin2bcd(ss));
+ Wire.send(bin2bcd(mm));
+ Wire.send(bin2bcd(hh));
+ Wire.send(w);
+ Wire.send(bin2bcd(d));
+ Wire.send(bin2bcd(m));
+ Wire.send(bin2bcd(y));
+ Wire.send(0);
+ Wire.endTransmission();
+}
+
+void check_time() {
+ Wire.beginTransmission(DS1307_ADDRESS);
+ Wire.send(0);
+ Wire.endTransmission();
+
+ Wire.requestFrom(DS1307_ADDRESS, 6);
+ Wire.receive();
+ int mm = bcd2bin(Wire.receive());
+ int hour = bcd2bin(Wire.receive());
+ int wday = Wire.receive();
+ int day = bcd2bin(Wire.receive());
+ int month = bcd2bin(Wire.receive());
+
+ if ( a < 0 ) {
+ for ( int i = 0; i < NALARMS ; i ++ ) {
+ // check alarm i
+ if ( ( alarms[i][0] & ( 1 << (wday - 1) ) ) ||
+ (month == alarms[i][1] && day == alarms[i][2]) ) {
+ // this is alarm day!
+ if ( hour == alarms[i][3] && mm == alarms[i][4]) {
+ // this is alarm hour!
+ a = i;
+ st = 0;
+ cmin = mm;
+ if ( ( alarms[i][0] & 128 ) == 0 ) {
+ // this alarm won't be repeated
+ alarms[i] = { 0,0,0,0,0 };
+ }
+ break;
+ }
+ }
+ }
+ } else {
+ if ( cmin < mm ) {
+ cmin = mm;
+ st++;
+ }
+ }
+
+}
+
+void set_leds() {
+ if ( st > 0 && st < TIN) {
+ int y = int(float(st*255)/TIN);
+ int r = 255 - y;
+ analogWrite(RPIN,r);
+ analogWrite(YPIN,y);
+ } else if (st == TIN) {
+ analogWrite(RPIN,0);
+ analogWrite(YPIN,0);
+ analogWrite(BPIN,255);
+ } else if (st == TOUT) {
+ // reset stuff
+ st = 0;
+ a = -1;
+ analogWrite(RPIN,255);
+ analogWrite(YPIN,0);
+ analogWrite(BPIN,0);
+ }
+}
+
+// BCD helper functions from adafruit-RTClib
+static uint8_t bcd2bin (uint8_t val) { return val - 6 * (val >> 4); }
+static uint8_t bin2bcd (uint8_t val) { return val + 6 * (val / 10); }
+
+// vim: set filetype=c: