Go Down

Topic: 4 Digit Seven Segment Display Countdown Timer - Minutes to (Read 16 times) previous topic - next topic

CrossRoads

#15
Sep 07, 2012, 03:19 pm Last Edit: Sep 07, 2012, 03:27 pm by CrossRoads Reason: 1
Preprogramming is one way to go.
I find it a lot easier to plug one of these on, download, and pull it off again.
No chance to damage pins that way.

http://www.gravitech.us/arliandpropr.html
Designing & building electrical circuits for over 25 years. Check out the ATMega1284P based Bobuino and other '328P & '1284P creations & offerings at  www.crossroadsfencing.com/BobuinoRev17.
Arduino for Teens available at Amazon.com.

Boffin1

#16
Sep 08, 2012, 08:03 am Last Edit: Sep 08, 2012, 08:22 am by Boffin1 Reason: 1
I made up a little pcb  that I use for 7 seg displays, it is stand alone ( program the 328 on your arduino, then plug it in the board)
I have put some 10 pin idc headers on it, 4 for the first 4 digits ( as in a clock ), and one on the right of the board to carry on to more numbers if needed ( each digit has a TPIC6B595  high power latch driver that can drive massive digits )
The headers have 7 pins for segments a-g, and 3 pins for the LED supply.

There is another header on the left for gen purpose I/O to some of the pins of the micro. I use these for connecting to wireless / push buttons/ GPS / whatever.

There is also provision for a couple of power fets for switching other LEDs, horn , motor etc.

The board has its own 5v regulator, I generally supply 12v ( depending on the number of LEDs in series for each segment )



I can post the gerber files if anyone wants to make these, or I could perhaps supply the boards if anyone is interested.

I have a  a simple sketch for the countdown bomb, with a couple of push buttons to preset the start time, and a run/pause button.

With my mobile phone I can call people and talk to them -  how smart can you get ?

Boffin1

Sorry Crossroads,

I didnt see the pic of your one, its a lot more versatile than my simple one !    I will probably buy some boards from you next time ( I have just ordered another load of mine )

With my mobile phone I can call people and talk to them -  how smart can you get ?

Wirral_guy

Looks good Boffin. I was going to have separate boards (arduino plus driver board) but it looks like you both have good single board options whihc is much neater.

I'd love a copy of the countdown sketch as that is exactly what I am looking to do (will save me many hours of programming\head-scratching  XD ).

Dave

Boffin1

#19
Sep 09, 2012, 07:23 am Last Edit: Sep 09, 2012, 07:29 am by Boffin1 Reason: 1
Heres a v22 sketch for the " Bollywood Bomb " that I have scratched up from another project of mine.  I havn't tested this version, I dont have time to connect up the switches and display at the moment, but it should basically work, but if you try it we can debug any problems.

You could swap the pin numbers to work on Crossroads allsinging serial board.

For some reason it won't compile without the VirtualWire library , so I left it in.

Connect four pushbuttons to negative for the run pause plus and minus setting buttons.

It drives 4   x  TPIC6B595 serial register/drivers using shiftout,  I have made comments about which pins go to which LED segments.
the " spare" output of the TPIC for minutes units connects to the two dots between the mins and secs, which stays on while counting down, and flashes when paused ( you could swap it round if you ant the opposite effect.)
I have put in a " bombPin " output that you could drive an LED to light for 2 seconds ( or a sounderwhatever ) when countdown reaches zero.

Code: [Select]



// Boffin1's  countdown " bomb " timer with preset up down run and pause
//   connect dots  to spare TPIC output on minute units chip, on when counting down, flash when paused
#include <VirtualWire.h>
#define latchPin 19  // rck
#define clockPin 18  // sck
#define dataPin 16   // ser in

int tile [4];
//  bitmap for which leds segements ( TPIC pins ) are lit for numbers 0 - 9, first bit for dots
// this pattern will depend on how the segments are wired up
//       this pattern is for  sequence   =   dots,  e,  d,  c,  g,  b,  f,  a
const byte digitTable [10] = {
 B01110111, B00010100, B01101101, B00111101, B00011110, B00111011, B01111011, B00010101, B01111111,B00111111 }
;  

const byte blanked = B00000000;
int dotState;
int pause = HIGH;
int blank = HIGH;
int mintens = 0;
int minunits = 0;
int sectens = 0;
int secunits = 0;
int timeleft = 0;              
unsigned long previousdotMillis = 0;  
unsigned long previousMillis = 0;    
int mintendisp;
int minunitsdisp;
int sectensdisp;
int secunitsdisp;  
int plusPin = 4;
int minusPin = 5;
int runPin = 6;
int pausePin = 7;
int running;
int bombPin = 8;

//******************************************************        
void setup()
{
 Serial.begin(9600);
 blank == HIGH;
 Serial.println("setup");
 pinMode ( latchPin, OUTPUT);
 pinMode ( clockPin, OUTPUT);
 pinMode ( dataPin, OUTPUT);
 pinMode ( plusPin, INPUT);
 digitalWrite(plusPin, HIGH); // set pullups
 pinMode ( minusPin, INPUT);
 digitalWrite(minusPin, HIGH);
 pinMode ( runPin, INPUT);
 digitalWrite (runPin, HIGH);
 pinMode ( pausePin, INPUT);
 digitalWrite(pausePin, HIGH);

 digitalWrite(latchPin, LOW);      // blanking all displays
 for ( int k=0; k<=3; k++ ){
   shiftOut(dataPin, clockPin, LSBFIRST, blank);
   delay (5);
 }
 digitalWrite(latchPin, HIGH);  
 pinMode ( bombPin, INPUT);
 digitalWrite(bombPin, LOW);
}
//********************************************************************
void loop ()
{  

 checktime();

 if ( mintens + minunits + sectens + secunits  >= 1 ){
   timeleft = HIGH;
 }    // check again after countdown
 else
 {
   timeleft = LOW ;
   pause = HIGH;  
 }     //  flashing dots
 unsigned long currentdotMillis = millis();
 if(currentdotMillis - previousdotMillis > 500) {
   previousdotMillis = currentdotMillis;    
   if (dotState == LOW)
   {
     dotState = HIGH;
   }    
   else     {
     dotState = LOW;
   }  
   showtime ();
 }
 if ( pause == LOW ) {
   dotState = HIGH ;
 }

 

 checkbutton ();    


}//  end of loop


void checktime () {
 if ( mintens + minunits + sectens + secunits  >= 1 )  //  if time still left on countdown
 {
   timeleft = HIGH;
 }
 else {
   timeleft = LOW ;
   pause = HIGH;
 }

 if (timeleft == HIGH ) {
   if ( pause == LOW ) {  //  which means its counting down   i.e. not paused in countdown          
     static unsigned long previousMillis;
     if(millis() > previousMillis)
     {
       previousMillis = millis() + 1000;
       secunits -- ;             // countdown 1 sec
       if ( secunits  < 0 ){
         secunits = 9;  
         sectens -- ;
       }
       if ( sectens   < 0 ){
         sectens = 5;  
         minunits -- ;
       }
       if ( minunits  < 0 ){
         minunits = 9;  
         mintens -- ;
       }
       // mintens cant get to -1 or it would have to have been 0000 and paused
       Serial.print(mintens);  
       Serial.print(minunits);  
       Serial.print(" : ");
       Serial.print(sectens);  
       Serial.println(secunits);
       showtime ();

       if ( mintens + minunits + sectens + secunits  >= 1 ){
         timeleft = HIGH;
       }
       else {
         digitalWrite( bombPin, HIGH ) ;
         timeleft = LOW ;
         pause = HIGH ;
                // milliseconds bombPin goes high
         delay ( 2000 );
       }
       digitalWrite( bombPin, LOW );

     }
     dotState = HIGH;
   } // keeps dots on while countdown
   else
     if ( blank == LOW ) {
     flashdots ();
   }

 }
} // END OF CHECKTIME

void checkbutton ()
{  
 int plus = digitalRead( plusPin );
 if ( plus == LOW ) {    
   secunits ++;  
 }  

 if ( secunits > 9 ){      
   secunits = 0 ;      
   sectens ++;    
 }
 if ( sectens >5 ) {      
   sectens = 0;      
   minunits ++;    
 }
 if ( minunits > 9 ){      
   minunits=0;      
   mintens ++;    
 }
 if ( mintens >5 ){      
   mintens = 0 ;    
 }  

 int minus = digitalRead( minusPin );
 if ( minus == LOW ) {  
   secunits --;
 }

 if ( secunits  < 0 ){      
   secunits = 9;        
   sectens -- ;    
 }
 if ( sectens   < 0 ){      
   sectens = 5;      
   minunits -- ;    
 }
 if ( minunits  < 0 ){      
   minunits = 9;        
   mintens -- ;    
 }  
 if ( mintens < 0 ){        
   mintens =5 ;    
 }

 //  CHANGE THIS DELAY TO SET COUNTSPEED WHEN + or - BUTTON HELD IN
 if ( plus || minus == LOW ){  
   delay ( 100 ) ;    
   showtime ();      
 }  


 // when run button pressed release pause
 int runbutton = digitalRead( runPin );
 if ( runbutton == LOW ) {
   pause = LOW ;
 }


 // when pause button pressed  set pause
 int pausebutton  = digitalRead( pausePin );  
 if ( pausebutton == LOW ) {
   pause = HIGH ;
 }



}  // end of checkbutton function

void flashdots () {
 unsigned long currentdotMillis = millis();
 if(currentdotMillis - previousdotMillis > 500) {
   previousdotMillis = currentdotMillis;    
   if (dotState == LOW)
   {
     dotState = HIGH;
   }
   else  {
     dotState = LOW;
   }    
   showtime ();  
 }
 if ( pause == LOW ) {
   dotState = HIGH ;
 }  
} //  end of flashdots routins

void showtime ()   //  DISPLAY ROUTINE
{  
 int mintendisp = (mintens) ? digitTable [ mintens ] : 0;  //  zero blanking tens minutes
 int minunitsdisp = digitTable [ minunits ];
 int sectensdisp = digitTable [ sectens ];
 int secunitsdisp = digitTable [ secunits ];
 if ( dotState == HIGH ){

   minunitsdisp = minunitsdisp|10000000 ;
 }      //   adds msb to minunit to light dots when dotState high

 digitalWrite(latchPin, LOW);

 shiftOut(dataPin, clockPin, LSBFIRST, mintendisp);
 shiftOut(dataPin, clockPin, LSBFIRST, minunitsdisp);
 shiftOut(dataPin, clockPin, LSBFIRST, sectensdisp);
 shiftOut(dataPin, clockPin, LSBFIRST, secunitsdisp);

 digitalWrite(latchPin, HIGH);
}


With my mobile phone I can call people and talk to them -  how smart can you get ?

Go Up