-
Notifications
You must be signed in to change notification settings - Fork 2
/
SimpleClockLCD.ino
116 lines (99 loc) · 2.75 KB
/
SimpleClockLCD.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
/**
* @file SimpleClockLCD.ino
* This a simple clock application using the RTC Nanoshield and the LCD Nanoshield.
*
* Copyright (c) 2013 Circuitar
* This software is released under the MIT license. See the attached LICENSE file for details.
*/
#include <Wire.h>
#include <stdio.h>
#include "Nanoshield_RTC.h"
#include "Nanoshield_LCD.h"
Nanoshield_RTC rtc;
Nanoshield_LCD lcd;
#define BUFFER_SIZE 50
char buf[BUFFER_SIZE];
char date[11];
char time[9];
void setup()
{
Serial.begin(9600);
Serial.println("----------------------");
Serial.println(" Nanoshield LCD Clock");
Serial.println("----------------------");
Serial.println("");
// Initialize LCD
lcd.begin();
lcd.clear();
lcd.print("Initializing...");
// Initialize RTC
if (!rtc.begin()) {
Serial.println("Failed starting RTC");
lcd.clear();
lcd.print("Cannot start RTC");
while(true);
};
// Print current time and ask for the new time
Serial.print("Current time: ");
rtc.read();
sprintf(date, "%04d-%02d-%02d", rtc.getYear(), rtc.getMonth(), rtc.getDay());
sprintf(time, "%02d:%02d:%02d", rtc.getHours(), rtc.getMinutes(), rtc.getSeconds());
Serial.print(date);
Serial.print(" ");
Serial.println(time);
Serial.println("Press Enter to adjust the time");
Serial.setTimeout(3000);
if (Serial.find("\n")) {
Serial.setTimeout(99999);
Serial.println("Type the new time in the format above and press Enter");
Serial.println("Press only Enter if you want to keep the same time");
buf[0] = '\0';
if (Serial.readBytesUntil('\n', buf, BUFFER_SIZE) > 0) {
setTime(rtc, buf);
}
}
lcd.clear();
}
void loop()
{
// Read time from RTC
rtc.read();
// Print time in the serial port
sprintf(date, "%04d-%02d-%02d", rtc.getYear(), rtc.getMonth(), rtc.getDay());
sprintf(time, "%02d:%02d:%02d", rtc.getHours(), rtc.getMinutes(), rtc.getSeconds());
Serial.print(date);
Serial.print(" ");
Serial.println(time);
// Print time in the LCD
lcd.setCursor(0, 0);
lcd.print(date);
lcd.setCursor(0, 1);
lcd.print(time);
// Wait for next second
delay(1000);
}
void setTime(Nanoshield_RTC& rtc, char* time) {
char *p = time;
char *tok;
int year, mon, day, hour, min, sec;
tok = strtok_r(p, "-", &p);
year = atoi(tok);
tok = strtok_r(p, "-", &p);
mon = atoi(tok);
tok = strtok_r(p, " ", &p);
day = atoi(tok);
tok = strtok_r(p, ":", &p);
hour = atoi(tok);
tok = strtok_r(p, ":", &p);
min = atoi(tok);
tok = strtok_r(p, "\n", &p);
sec = atoi(tok);
sprintf(buf, "New time: %04d-%02d-%02d %02d:%02d:%02d", year, mon, day, hour, min, sec);
Serial.println(buf);
rtc.writeYear(year);
rtc.writeMonth(mon);
rtc.writeDay(day);
rtc.writeHours(hour);
rtc.writeMinutes(min);
rtc.writeSeconds(sec);
}