#include #define TIME_MSG_LEN 11 // time sync to PC is HEADER followed by unix time_t as ten ascii digits #define TIME_HEADER 'T' // Header tag for serial time sync message #define TIME_REQUEST 7 // ASCII bell character requests a time sync message int dataPin = 11; int latchPin = 12; int clockPin = 13; int ledPins[] = {10,9,8,7,6,5,4,3,2}; boolean ledStatus[9]; byte data = 0; void setup() { for(int i=2;i<=13;i++) pinMode(i, OUTPUT); pinMode(0, INPUT); pinMode(1, INPUT); Serial.begin(57600); set(0, false); setSyncProvider(requestSync); } void loop() { if(Serial.available()) processSyncMessage(); if(timeStatus()!= timeNotSet) showTime(); dimmer(); } void showTime() { time_t t = now(); for(int i=0;i<=4;i++) set(10-i, hour(t) & (1 << i)); for(int i=0;i<=5;i++) set(16-i, minute(t) & (1 << i)); for(int i=0;i<=5;i++) set(5-i, second(t) & (1 << i)); } void dimmer() { for(int i=0;i<50;i++) { turnAll(); turnProper(); delay(20); } } void turnAll() { digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, 255); digitalWrite(latchPin, HIGH); for(int i=0;i<9;i++) digitalWrite(ledPins[i], HIGH); } void turnProper() { for(int i=0;i<9;i++) digitalWrite(ledPins[i], ledStatus[i]); digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, data); digitalWrite(latchPin, HIGH); } void set(int i, boolean s) { if(i >= 8) { digitalWrite(ledPins[i-8], s ? HIGH : LOW); ledStatus[i-8] = s; } else { digitalWrite(latchPin, LOW); if(s) data = data | (1 << i); else data = data & (255 - 1 << i); shiftOut(dataPin, clockPin, MSBFIRST, data); digitalWrite(latchPin, HIGH); } } // taken from the Time library example void processSyncMessage() { // if time sync available from serial port, update time and return true while(Serial.available() >= TIME_MSG_LEN ){ // time message consists of a header and ten ascii digits char c = Serial.read() ; Serial.print(c); if( c == TIME_HEADER ) { time_t pctime = 0; for(int i=0; i < TIME_MSG_LEN -1; i++){ c = Serial.read(); if( c >= '0' && c <= '9'){ pctime = (10 * pctime) + (c - '0') ; // convert digits to a number } } setTime(pctime); // Sync Arduino clock to the time received on the serial port } } } time_t requestSync() { Serial.print(TIME_REQUEST,BYTE); return 0; // the time will be sent later in response to serial mesg }