Internet Clock
Purpose:
Design a clock to automatically sync with NTP server time.windows.com. Make where timezone can be changed. Timezone is a hardcoded variable. I set up using EST time. Also I added timer to clock.
Components:
Push Buttons
mbed chip
solderless breaboard
LCD Display
Ethernet Connection



Code:
#include "mbed.h"
#include "EthernetNetIf.h"
#include "NTPClient.h"
#include "TextLCD.h"
#include "string.h"
#include "stdlib.h"
EthernetNetIf eth;
NTPClient ntp;
TextLCD lcd(p10, p12, p15, p16, p29, p30); // rs, e, d0-d3
InterruptIn switch1(p17);
InterruptIn switch2(p18);
DigitalOut led(LED1);
time_t ctTime;
int start = 0;
int dh = 0;
int h = 0;
int m = 0;
int s = 0;
int start_time_h =0;
int start_time_m =0;
int start_time_s = 0;
int old_time_h = 0;
int old_time_m = 0;
int old_time_s =0;
int stop_time_h =0;
int stop_time_m = 0;
int stop_time_s = 0;
int timer_h = 0;
int timer_m =0;
int timer_s =0;
int time_diff =0;
char buffer [80];
char hour [2];
char mins [4];
char sec [6];
struct tm * current_time;
void start_stop() {
if (start == 1){
start = 0;
}
else
start = 1;
start_time_h = h;
start_time_m = m;
start_time_s = s;
}
void reset() {
timer_h = 0;
timer_m = 0;
timer_s = 0;
old_time_h = 0;
old_time_m = 0;
old_time_s = 0;
}
int main() {
switch1.rise(&start_stop);
switch2.rise(&reset);
// Setup NTP connection
lcd.printf("Setting up...\n");
EthernetErr ethErr = eth.setup();
if (ethErr) {
lcd.printf("Error %d in setup.\n", ethErr);
return -1;
}
lcd.printf("Setup OK\r\n");
//EST
time_diff = -4;
//connect to NTP pool server
Host server(IpAddr(), 123, "0.north-america.pool.ntp.org");
ntp.setTime(server);
while (1) {
ctTime = time(NULL);
current_time = localtime(&ctTime);
//change due to daylight saving time
strcpy (hour,"");
strftime (hour,2,"%H",current_time);
h = atoi(hour);
strcpy (mins,"");
strftime(mins,4,"%M",current_time);
m = atoi(mins);
strcpy (sec,"");
strftime (sec,6,"%S",current_time);
s = atoi(sec);
//Timer
if (start == 1) {
stop_time_s = s - start_time_s;
if (s == 0)
old_time_s += 1;
}
//if timer is reset
else{
old_time_s += stop_time_s;
stop_time_s = 0;
}
//add to actual timer
timer_h = stop_time_h + old_time_h;
timer_m = stop_time_m + old_time_m;
timer_s = stop_time_s + old_time_s;
//reset count if timer and add
if (timer_s == 59){
old_time_m += 1;
old_time_s = 0;
start_time_s = s;
}
if (timer_m == 59){
old_time_h += 1;
old_time_m = 0;
start_time_m = m;
}
//reset start timer to 0 if actual time is 0
if (s == 59){
start_time_s = 0;
old_time_s += stop_time_s;
}
if (m == 59){
start_time_m = 0;
old_time_m += stop_time_m;
}
//timezone change
dh = h;
if (dh > 12 - time_diff)
dh+=-12 + time_diff;
else if (h <= -time_diff)
dh += 12 + time_diff;
else
dh += time_diff;
//rest of clock
strftime (buffer,80,":%M:%S",current_time);
//Print
lcd.printf("UTC%d:%d%s ",time_diff,dh,buffer);
lcd.printf("TIMER:%d:%d:%d \n",timer_h,timer_m,timer_s);
wait(1);
}
}
Resources:
http://mbed.org/cookbook/Text-LCD
http://mbed.org/cookbook/NTP-Client
1 comment
You need to log in to post a comment

This may be a silly question. I've written many programs for embedded controllers but never needed anything but standard libraries. I have never worked with Ethernet, so I'm trying to find out more about it by first playing with cloks. The program above states that the clock "automatically sync with NTP server". Does it mean it will sync once when it's powered up or will it continue to sync at some interval? If not, how do I make it sync, say, every 12 hours? I tried a few things but always ended up with the code in never never land. Where do I find details of how the Ethernet libraries work other than trying to figure out the source code? I find the mbed server a bit frustrating when trying to find data as a novice in this particular area while, reasonably competent, I would contend, C++ programmer.
Thanks for any guidance.
George