-
Notifications
You must be signed in to change notification settings - Fork 5
/
LedFlasher.ino
166 lines (143 loc) · 4.89 KB
/
LedFlasher.ino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
//============================================================================
// Filename: SparsnasLedBlinker.ino
// Purpose: Provide a configurable led blinking pulse as a help for decoding
// the transmitted packet data.
//============================================================================
//----------------------------------------------------------------------------
//------------------------------- Include Files ------------------------------
//----------------------------------------------------------------------------
#include <Button.h>
#include <Wire.h>
#include <RtcDS3231.h>
#include "U8glib.h"
//----------------------------------------------------------------------------
//----------------------------- Global variables -----------------------------
//----------------------------------------------------------------------------
Button IncButton(7);
Button DecButton(8);
U8GLIB_SSD1306_128X64 oled(U8G_I2C_OPT_NONE);
RtcDS3231<TwoWire> rtcObject(Wire);
const byte wakePin = 2;
const byte ledPin = 3;
byte hours = 0;
byte minutes = 0;
byte seconds = 0;
byte blinkDelay = 1;
byte secondCnt = 0;
volatile bool alarmFlag = false;
//----------------------------------------------------------------------------
// updateTime
//----------------------------------------------------------------------------
void updateTime()
{
RtcDateTime now = rtcObject.GetDateTime();
hours = now.Hour();
minutes = now.Minute();
seconds = now.Second();
}
//----------------------------------------------------------------------------
// updateDisplay
//----------------------------------------------------------------------------
void updateDisplay()
{
char timeString[32];
oled.setFont(u8g_font_helvB10);
sprintf(timeString, "Time: %02u:%02u:%02u", hours, minutes, seconds);
oled.setPrintPos(0, 20);
oled.print(timeString);
sprintf(timeString, "BlinkDelay: %u", blinkDelay);
oled.setPrintPos(0, 45);
oled.print(timeString);
}
//----------------------------------------------------------------------------
// handleRtcAlarm
//----------------------------------------------------------------------------
void handleRtcAlarm()
{
alarmFlag = false;
rtcObject.LatchAlarmsTriggeredFlags();
secondCnt++;
if (blinkDelay == 0) {
secondCnt = 0;
}
if (blinkDelay > 0)
{
if (secondCnt == blinkDelay)
{
secondCnt = 0;
digitalWrite(ledPin, HIGH); // flash the led
delay(100); // wait a little bit
digitalWrite(ledPin, LOW); // turn off led
}
}
}
//----------------------------------------------------------------------------
// handleInterrupt
//----------------------------------------------------------------------------
void handleInterrupt()
{
// Try to do as little as possible in this ISR
alarmFlag = true;
}
//----------------------------------------------------------------------------
// setup
//----------------------------------------------------------------------------
void setup()
{
// Initialize global variables
blinkDelay = 1;
secondCnt = 0;
// Initialize push buttons
IncButton.begin();
DecButton.begin();
// Initialize pins
pinMode(ledPin, OUTPUT); //
pinMode(wakePin, INPUT); //
// Initialize the RTC and the alarm associated with it.
DS3231AlarmOne alarm1(0,0,0,0,DS3231AlarmOneControl_OncePerSecond);
rtcObject.Begin();
if (!rtcObject.GetIsRunning())
{
Serial.println(F("WARNING: RTC was not actively running, starting it now."));
rtcObject.SetIsRunning(true);
}
rtcObject.Enable32kHzPin(false);
rtcObject.SetSquareWavePin(DS3231SquareWavePin_ModeAlarmOne);
rtcObject.SetAlarmOne(alarm1);
rtcObject.LatchAlarmsTriggeredFlags();
// Uncomment this if you want to set the current time
//Wire.begin();
//RtcDateTime compileTime = RtcDateTime(__DATE__, __TIME__);
//rtcModule.SetDateTime(compileTime);
// Enable the interrupthandler to trigger when wakePin is signaled by the
// RTC-hardware; see the board layout image for details.
// Note that the interrupt mode is FALLING because the alarm interrupt in
// the DS3231 is active-low.
attachInterrupt(digitalPinToInterrupt(wakePin), handleInterrupt, FALLING);
}
//----------------------------------------------------------------------------
// loop
//----------------------------------------------------------------------------
void loop()
{
// Check buttons
if (IncButton.pressed()) {
blinkDelay++;
}
if (DecButton.pressed()) {
blinkDelay--;
}
// Check if the RTC alarm has been triggered
if (alarmFlag == true) {
handleRtcAlarm();
}
// Update time values
updateTime();
// Update the display
oled.firstPage();
do {
updateDisplay();
} while (oled.nextPage());
// Take a small break and relax
delay(20);
}