Ok, I have been lurking for awhile and I finally have an arduino to play with and join in on the fun. I started working with the shift register that came with my kit and I just kept going down the rabbit hole of fun.... which led me to where I am now.
This is probably a total mess, but it works all the way up until 20 secs each minute. It blinks the minute (not set up to go past 9 minutes yet), then the seconds. At the current rate it flashes 0-1, 0-6, 1-2, 1-8, and then 1-2-4 (instead of 2-4) and does the same in the 30's 1-2-3-then single digit.
The bulk of the code is based on the arduino Time library example, with some shift register cobbling, array cobbling, and a few hail mary's.
counting to 9 was a victory for me, but going past that has proved a bit out of my current range. So any help is appreciated, both fixes to the current code and code the way that it should be done are appreciated.
#include <Time.h>
#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 data = 2;
int clock = 3;
int latch = 4;
int ledclear = B00000000;
int number0 = B10110111;
int number1 = B00010100;
int number2 = B10101101;
int number3 = B10011101;
int number4 = B00011110;
int number5 = B10011011;
int number6 = B10111010;
int number7 = B00010101;
int number8 = B10111111;
int number9 = B00011111;
int value[10];
void setup() {
pinMode(data, OUTPUT);
pinMode(clock, OUTPUT);
pinMode(latch, OUTPUT);
value[0] = number0;
value[1] = number1;
value[2] = number2;
value[3] = number3;
value[4] = number4;
value[5] = number5;
value[6] = number6;
value[7] = number7;
value[8] = number8;
value[9] = number9;
Serial.begin(9600);
setSyncProvider( requestSync); //set function to call when sync required
Serial.println(" for sync message");
}
void loop(){
if(Serial.available() )
{
processSyncMessage();
}
if(timeStatus()!= timeNotSet)
{
digitalWrite(13,timeStatus() == timeSet); // on if synced, off if needs refresh
digitalClockDisplay();
}
delay(3000);
}
void digitalClockDisplay(){
// digital clock display of the time
Serial.print(hour());
printDigits(minute());
int k = minute();
if( k < 10 )
{
digitalWrite(latch, LOW);
shiftOut(data, clock, MSBFIRST, value[0]);
digitalWrite(latch, HIGH);
delay(400);
digitalWrite(latch, LOW);
shiftOut(data, clock, MSBFIRST, ledclear);
digitalWrite(latch, HIGH);
delay(200);
digitalWrite(latch, LOW);
shiftOut(data, clock, MSBFIRST, value[k]);
digitalWrite(latch, HIGH);
}
delay(400);
digitalWrite(latch, LOW);
shiftOut(data, clock, MSBFIRST, ledclear);
digitalWrite(latch, HIGH);
delay(200);
printDigits(second());
int val = second();
int units = val;
if( units < 10 )
{
digitalWrite(latch, LOW);
shiftOut(data, clock, MSBFIRST, value[0]);
digitalWrite(latch, HIGH);
delay(400);
digitalWrite(latch, LOW);
shiftOut(data, clock, MSBFIRST, ledclear);
digitalWrite(latch, HIGH);
delay(150);
digitalWrite(latch, LOW);
shiftOut(data, clock, MSBFIRST, value[val]);
digitalWrite(latch, HIGH);
}
else
while(units >= 10){
int tens = tens + 1;
units = units - 10;
digitalWrite(latch, LOW);
shiftOut(data, clock, MSBFIRST, value[tens]);
digitalWrite(latch, HIGH);
delay(400);
digitalWrite(latch, LOW);
shiftOut(data, clock, MSBFIRST, ledclear);
digitalWrite(latch, HIGH);
delay(150);
digitalWrite(latch, LOW);
shiftOut(data, clock, MSBFIRST, value[units]);
digitalWrite(latch, HIGH);
}
delay(400);
digitalWrite(latch, LOW);
shiftOut(data, clock, MSBFIRST, ledclear);
digitalWrite(latch, HIGH);
delay(400);
Serial.print(" ");
Serial.print(day());
Serial.print(" ");
Serial.print(month());
Serial.print(" ");
Serial.print(year());
Serial.println();
}
void printDigits(int digits){
// utility function for digital clock display: prints preceding colon and leading 0
Serial.print(":");
if(digits < 10)
Serial.print('0');
Serial.print(digits);
}
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);
return 0; // the time will be sent later in response to serial mesg
}