1 | // during an alarm the INT pin of the RTC is pulled low
|
2 | //
|
3 | // this is handy for minimizing power consumption for sensor-like devices,
|
4 | // since they can be started up by this pin on given time intervals.
|
5 |
|
6 | #include <Wire.h>
|
7 | #include "ds3231.h"
|
8 |
|
9 | #define BUFF_MAX 256
|
10 |
|
11 | // time when to wake up
|
12 | uint8_t wake_HOUR = 15;
|
13 | uint8_t wake_MINUTE = 49;
|
14 | uint8_t wake_SECOND = 9;
|
15 |
|
16 | // how often to refresh the info on stdout (ms)
|
17 | unsigned long prev = 5000, interval = 5000;
|
18 |
|
19 | void set_alarm(void)
|
20 | {
|
21 |
|
22 | // flags define what calendar component to be checked against the current time in order
|
23 | // to trigger the alarm - see datasheet
|
24 | // A1M1 (seconds) (0 to enable, 1 to disable)
|
25 | // A1M2 (minutes) (0 to enable, 1 to disable)
|
26 | // A1M3 (hour) (0 to enable, 1 to disable)
|
27 | // A1M4 (day) (0 to enable, 1 to disable)
|
28 | // DY/DT (dayofweek == 1/dayofmonth == 0)
|
29 | uint8_t flags[5] = { 0, 0, 0, 1, 1 };
|
30 |
|
31 | // set Alarm1
|
32 | DS3231_set_a1(wake_SECOND, wake_MINUTE, wake_HOUR, 0, flags);
|
33 |
|
34 | // activate Alarm1
|
35 | DS3231_set_creg(DS3231_INTCN | DS3231_A1IE);
|
36 | }
|
37 |
|
38 | void setup()
|
39 | {
|
40 | Serial.begin(9600);
|
41 | Wire.begin();
|
42 | DS3231_init(DS3231_INTCN);
|
43 | DS3231_clear_a1f();
|
44 | set_alarm();
|
45 |
|
46 | }
|
47 |
|
48 | void loop()
|
49 | {
|
50 | char buff[BUFF_MAX];
|
51 | unsigned long now = millis();
|
52 | struct ts t;
|
53 |
|
54 | // once a while show what is going on
|
55 | if ((now - prev > interval) && (Serial.available() <= 0)) {
|
56 | DS3231_get(&t);
|
57 |
|
58 | // display current time
|
59 | snprintf(buff, BUFF_MAX, "%d.%02d.%02d %02d:%02d:%02d", t.year,
|
60 | t.mon, t.mday, t.hour, t.min, t.sec);
|
61 | Serial.println(buff);
|
62 |
|
63 | // display a1 debug info
|
64 | DS3231_get_a1(&buff[0], 59);
|
65 | Serial.println(buff);
|
66 |
|
67 | if (DS3231_triggered_a1()) {
|
68 | // INT has been pulled low
|
69 | Serial.println(" -> alarm1 has been triggered");
|
70 | // clear a1 alarm flag and let INT go into hi-z
|
71 | DS3231_clear_a1f();
|
72 | }
|
73 | prev = now;
|
74 | }
|
75 | }
|