10 second countdown

Im trying to make a countdown timer using a module with 4 7 seg displays. I have it counting down in seconds now I want to populate the other 3 digits with incrementally faster countdowns (first counts in seconds then second is tens of seconds then 100's of seconds etc). I have tried a few things and cant get it to work

#include <Arduino.h>


int pinA = 11;
int pinB = 7;
int pinC = 4;
int pinD = 2;
int pinE = 1;
int pinF = 10;
int pinG = 5;
int pinDP = 3;

int D1 = 12;
int D2 = 9;
int D3 = 8;
int D4 = 6;

void setup() {//set all segments & digits as outputs
pinMode(pinA, OUTPUT);
pinMode(pinB, OUTPUT);
pinMode(pinC, OUTPUT);
pinMode(pinD, OUTPUT);
pinMode(pinE, OUTPUT);
pinMode(pinF, OUTPUT);
pinMode(pinG, OUTPUT);
pinMode(pinDP, OUTPUT);
pinMode(D1, OUTPUT);
pinMode(D2, OUTPUT);
pinMode(D3, OUTPUT);
pinMode(D4, OUTPUT);
}














//functions representing numbers 0-9
void zero(){
  digitalWrite(pinA, LOW);
  digitalWrite(pinB, LOW);
  digitalWrite(pinC, LOW);
  digitalWrite(pinD, LOW);
  digitalWrite(pinE, LOW);
  digitalWrite(pinF, LOW);
  digitalWrite(pinG, HIGH);
}

void one(){
  digitalWrite(pinA, HIGH);
  digitalWrite(pinB, LOW);
  digitalWrite(pinC, LOW);
  digitalWrite(pinD, HIGH);
  digitalWrite(pinE, HIGH);
  digitalWrite(pinF, HIGH);
  digitalWrite(pinG, HIGH);
}

void two(){
  digitalWrite(pinA, LOW);
  digitalWrite(pinB, LOW);
  digitalWrite(pinC, HIGH);
  digitalWrite(pinD, LOW);
  digitalWrite(pinE, LOW);
  digitalWrite(pinF, HIGH);
  digitalWrite(pinG, LOW);
}

void three(){
  digitalWrite(pinA, LOW);
  digitalWrite(pinB, LOW);
  digitalWrite(pinC, LOW);
  digitalWrite(pinD, LOW);
  digitalWrite(pinE, HIGH);
  digitalWrite(pinF, HIGH);
  digitalWrite(pinG, LOW);
}

void four(){
  digitalWrite(pinA, HIGH);
  digitalWrite(pinB, LOW);
  digitalWrite(pinC, LOW);
  digitalWrite(pinD, HIGH);
  digitalWrite(pinE, HIGH);
  digitalWrite(pinF, LOW);
  digitalWrite(pinG, LOW);
}

void five(){
  digitalWrite(pinA, LOW);
  digitalWrite(pinB, HIGH);
  digitalWrite(pinC, LOW);
  digitalWrite(pinD, LOW);
  digitalWrite(pinE, HIGH);
  digitalWrite(pinF, LOW);
  digitalWrite(pinG, LOW);
}

void six(){
  digitalWrite(pinA, LOW);
  digitalWrite(pinB, HIGH);
  digitalWrite(pinC, LOW);
  digitalWrite(pinD, LOW);
  digitalWrite(pinE, LOW);
  digitalWrite(pinF, LOW);
  digitalWrite(pinG, LOW);
}

void seven(){
  digitalWrite(pinA, LOW);
  digitalWrite(pinB, LOW);
  digitalWrite(pinC, LOW);
  digitalWrite(pinD, HIGH);
  digitalWrite(pinE, HIGH);
  digitalWrite(pinF, HIGH);
  digitalWrite(pinG, HIGH);
}

void eight(){
  digitalWrite(pinA, LOW);
  digitalWrite(pinB, LOW);
  digitalWrite(pinC, LOW);
  digitalWrite(pinD, LOW);
  digitalWrite(pinE, LOW);
  digitalWrite(pinF, LOW);
  digitalWrite(pinG, LOW);
}

void nine(){
  digitalWrite(pinA, LOW);
  digitalWrite(pinB, LOW);
  digitalWrite(pinC, LOW);
  digitalWrite(pinD, HIGH);
  digitalWrite(pinE, HIGH);
  digitalWrite(pinF, LOW);
  digitalWrite(pinG, LOW);
}

void turnOffAllSegments(){
  digitalWrite(pinA, LOW);
  digitalWrite(pinB, LOW);
  digitalWrite(pinC, LOW);
  digitalWrite(pinD, LOW);
  digitalWrite(pinE, LOW);
  digitalWrite(pinF, LOW);
  digitalWrite(pinG, LOW);
}


//functions to select individual digits on the display
void digit1(){
  digitalWrite(D1, HIGH);
  digitalWrite(D2, LOW);
  digitalWrite(D3, LOW);
  digitalWrite(D4, LOW);
}

void digit2(){
  digitalWrite(D1, LOW);
  digitalWrite(D2, HIGH);
  digitalWrite(D3, LOW);
  digitalWrite(D4, LOW);
}

void digit3(){
  digitalWrite(D1, LOW);
  digitalWrite(D2, LOW);
  digitalWrite(D3, HIGH);
  digitalWrite(D4, LOW);
}

void digit4(){
  digitalWrite(D1, LOW);
  digitalWrite(D2, LOW);
  digitalWrite(D3, LOW);
  digitalWrite(D4, HIGH);
}

void all4Digits(){
  digitalWrite(D1, HIGH);
  digitalWrite(D2, HIGH);
  digitalWrite(D3, HIGH);
  digitalWrite(D4, HIGH);
}

void loop() {
//digit 1
  digit1();
  one();
  delay(1000);

  digit1();
  nine();
  delay(1000);

  digit1();
  eight();
  delay(1000);

  digit1();
  seven();
  delay(1000);

  digit1();
  six();
  delay(1000);

  digit1();
  five();
  delay(1000);

  digit1();
  four();
  delay(1000);

  digit1();
  three();
  delay(1000);

  digit1();
  two();
  delay(1000);

  digit1();
  one();
  delay(1000);

  digit1();
  zero();
  delay(1000);

pls help...

don't use delay, use millis()

➜ For extra information and examples look at Using millis() for timing. A beginners guide and Several things at the same time

(also don't use pin 0 and 1, keep the Serial port for debug)

You can't use delay for this... you need to use millis() for your timing.

Also your code could be greatly simplified through the use of arrays.

+1 with regards to the millis() function.

How about using a library? The library "SevSeg" is in the Arduino IDE in the Library Manager: https://github.com/DeanIsMe/SevSeg

using non-blocking timing based on millis() is the better approach.

though with still using delay() the delay() must be reduced to that timeintervall that is the shortest one.
In your case 1/100 second which is the same as 10 milliseconds.
once every 10 milliseconds a counter for the 1/100 seconds is decremented by 1
every time the 1/100 digit rolls over from 0 to 9 decrement the 1/10 digit by 1
every time the 1/10 digit rolls over from 0 to 9 decrement the seconds by 1

The effect of reducing the delay down to 0,01 seconds is similar as to use non-blocking timing based on function millis().

With using delay() the coundown would not be accurate as you use delay(10) which would be 10 milliseconds and all the code for decrementing and switching IO-pins adds up to the 10 milliseconds
using 9 milliseconds might be too fast.

Then you could use delayMicroseconds()
and then adapt the delaymicroseconds() to a value that matches 10 milliseconds including code-execution-time

With non-blocking timing based on function millis() or better function micros() the time-intervalls can be programmed in a way that keep as much precision as possible automatically.

best regards Stefan

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.