diff options
Diffstat (limited to 'ds1307')
| -rw-r--r-- | ds1307/arduino_sketch/fuzzy_alarm_clock_ds1307.pde | 143 | 
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: | 
