Pages: [1]   Go Down
Author Topic: I made a clock.  (Read 1351 times)
0 Members and 1 Guest are viewing this topic.
Wales, UK
Offline Offline
Newbie
*
Karma: 0
Posts: 39
Dabbling
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I've had a large 3" 7 segment display so took the opportunity of being snowed in for almost a week to turn it into a clock. It took about 3 long evenings to to the bulk of it and a lazy morning to get the bugs out of the sketch.


A bit scratched but still functional.


The segments are multiplexed and limiting resistors are iniluded on the PCB. But I got there in the end.




Even though the clock will be Arduino based I built a custom PCB rather than permanently use a useful Ardhuno board.


I used Eagle and it was a challenge to get all the components within the limited spade of the free version.



This is the resulting PCB with most of the components soldered in place.




The main PCB plugs straight onto the LED PCB.


This is the finished clock.

Code:

#include <Time.h>  

byte number[] = {  B01111110,  //0 Segments dp, a, b, c, d, e, f, g
                   B00110000,  //1
                   B01101101,  //2
                   B01111001,  //3
                   B00110011,  //4
                   B01011011,  //5
                   B00011111,  //6
                   B01110010,  //7
                   B01111111,  //8
                   B01110011,  //9
                   B01110111,  //A
                   //60,   //C
                   // 71,   //F
                   //103,   //E                    
  };
byte segments[8]={9,10,11,12,13,14,15,16}; //dp, a, b, c, d, e, f, g
byte buttons[4]={1,2,3,4} ;//Control buttons 1=Hours inc, 2=hours dec, 3=mins inc, 4=minsdec
byte digit[4]={17,18,19,0} ;// Digit to display.
byte secs,secs1, secs10 ,mins,mins1,  mins10, hours, hours1, hours10 =0;
unsigned long timestamp;
#define multiplexDelay 5500 //microseconds.
#define buttonDelay 500 //delay between button scans.
unsigned long buttonStamp=0;
unsigned long dotStamp;
#define dotDelay 250
byte dot=0;
byte disp=0; //LED digit active.
//#define

void setup() {                
     pinMode(5, OUTPUT);
  

  for (int n=0;n<=7;n++){
     pinMode(segments[n], OUTPUT);
  }
 for (int n=0;n<=3;n++){
     pinMode(buttons[n], OUTPUT);
     pinMode(digit[n],OUTPUT);
  }
    timestamp=micros()+multiplexDelay;
    buttonStamp=millis()+buttonDelay;
    dotStamp=millis()+dotDelay;
}



void loop() {
  secs=second ();
//  secs1=secs % 10; //Remainder = seconds.
//  secs10=secs / 10; //Remainder = 10s seconds.
    mins=minute ();
    mins1=mins % 10; //Remainder = minutes.
    mins10=mins / 10; //Remainder = 10s minutes.

    hours=hour ();
    hours1=hours % 10; //Remainder = hours.
    hours10=hours / 10; //Remainder = 10s hours.

 if (micros()>timestamp){
    switch(disp){
      case (0):
        Display(0,mins1);
        break;
  
      case (1):
        Display(1,mins10);
        break;
  
      case (2):
        Display(2,hours1);
        break;
  
      case (3):
        Display(3,hours10);
        break;
    }
    timestamp=micros()+multiplexDelay;
 }  
 DispAdjust();
 
}

void DispAdjust(){      // setTime(hr,min,sec,day,month,yr); // another way to set the time
int adjust=0;
  if (millis()>buttonStamp){
    secs=0;
    if (digitalRead(buttons[0])==HIGH){
      adjust=hours+1;
      if (adjust==24) adjust=0;      
      setTime(adjust,mins,secs,1,1,1990); // another way to set the time
    }

    if (digitalRead (buttons[1])==HIGH){
      adjust=hours-1;
      if (adjust==-1) adjust=23;
      setTime(adjust,mins,secs,1,1,1990); // another way to set the time
    }
    
    if (digitalRead(buttons[2])==HIGH){
      adjust=mins+1;
      if (adjust==61) adjust=0;      
      setTime(hours,adjust,secs,1,1,1990); // another way to set the time
    }

    if (digitalRead (buttons[3])==HIGH){
      adjust=mins-1;
      if (adjust==-1) adjust=59;
      setTime(hours,adjust,secs,1,1,1990); // another way to set the time
    }
    
    buttonStamp=millis()+buttonDelay;


  }
  
  
}

void Display(byte segment,byte num){
 for (int n=0;n<=3;n++){
      digitalWrite (digit[n],LOW);
  }
      
  
  digitalWrite (digit[segment],HIGH);

  for (int n=0;n<=7;n++){
      if( (number[num] & (128>>n)) !=0){
        digitalWrite (segments[n], HIGH);}
      else  {
        digitalWrite (segments[n], LOW);}
  }

  if (millis()>dotStamp){
    dotStamp=millis()+dotDelay;
    dot++;
    if (dot==4) dot=0;
  }  

  if (dot==(3-segment)){
    digitalWrite (segments[0], HIGH);}
  else{
    digitalWrite (segments[0], LOW);
  }

  disp++;
  if (disp>3) disp=0;

}



The Sketch uses the Time library which was easier to use then I first thought  ;)

This is a short video of it working.


Debugging was a bit tedious as I had to unplug and the Arduino chip and plug it into the Arduino board to reprogram it.

Its crrently hanging in the kitchen as is but when I get chance I'll get two sheets of rose tinted perspex to sandwich it between.
Logged

0
Offline Offline
Newbie
*
Karma: 2
Posts: 34
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Nice! I'd like to do a large LED clock at some point too!   smiley-grin
Logged

Netherlands
Offline Offline
Full Member
***
Karma: 0
Posts: 132
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Very nice smiley. Looks like a cool project. A few nights work sounds better then weeks work smiley-wink.

You could look at Ponoko and design your own custom enclosure. Probably a bit pricy though. Never used them myself but the example products look really nice, www.ponoko.com smiley.
Logged

0
Offline Offline
Sr. Member
****
Karma: 0
Posts: 269
Fzzt! pop Bang!
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

How did you transfer the design onto the copper board? Photo resist, toner transfer or milled?
Logged

Wales, UK
Offline Offline
Newbie
*
Karma: 0
Posts: 39
Dabbling
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Milled on a converted Proxxon MF70. This is the just about the first serious PCB I've done since the conversion.
Logged

0
Offline Offline
Sr. Member
****
Karma: 0
Posts: 269
Fzzt! pop Bang!
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I thought it looked milled. I have just started doing this myself, with mixed results. Some success some failures all due to the cutting depth being too much or too little, and the flatness of the pcb on the milling table. I need more practice.
Logged

Pages: [1]   Go Up
Jump to: