Make a 7 segment display show changing numbers

Hello

I have been trying (and learning) with my Arduino Duemilanove and a 4 digit 7 segment 16 pin display for a few days (weeks) now and when i manage to understand one thing there is something new around the corner which totally throws me.

I would like the display to show numbers, which will change from 1 to 9999 while the arduino is running. My question is, how can I convert for example 267 in to instructions for the 7 segment display to turn on and off certatin segments?

the sketch i have so far..

int segmentPins[7] = {2,3,4,5,6,7,8};
int digitPins[4] = {9,10,11,12};
int digit[4];
int escalated_number = 1;
int instruction_for_display;

void setup()
{
  Serial.begin(9600);
  for(int i=0; i<7; i++)
  {
    pinMode(segmentPins[i], OUTPUT);
    digitalWrite(segmentPins[i], HIGH);
  }
  
  for (int i=0; i<4; i++)
  {
    pinMode(digitPins[i], OUTPUT);
    digitalWrite(digitPins[i], LOW);
  }

}

void loop()
{
  Count();
  Convert();
  Displaynumber();
  delay(1000);
}


void Count()
{
  escalated_number++;
  Serial.println(escalated_number);
  if (escalated_number>10000)
  {
    End();
  }
  
}
  
void Convert()
{
//this should convert the escalated_number value to instructions for each digit on the display
}
  
void Displaynumber()
//i think this bit needs to be completely changed, but it would depend on how the Convert() function works out.
{
  int number[4];
  number[0] = 1;
  number[1] = 4;
  number[2] = 4;
  number[3] = 1;

  if (number[0] == 0)
  {
  digitalWrite(digitPins[0], HIGH);
  digitalWrite(segmentPins[0], LOW);
  digitalWrite(segmentPins[1], LOW);
  digitalWrite(segmentPins[2], LOW);
  digitalWrite(segmentPins[3], LOW);
  digitalWrite(segmentPins[4], LOW);
  digitalWrite(segmentPins[5], LOW);
  digitalWrite(segmentPins[6], HIGH);
  }
  else if (number[0] == 1)
  {
  digitalWrite(digitPins[0], HIGH);
  digitalWrite(segmentPins[0], HIGH);
  digitalWrite(segmentPins[1], LOW);
  digitalWrite(segmentPins[2], LOW);
  digitalWrite(segmentPins[3], HIGH);
  digitalWrite(segmentPins[4], HIGH);
  digitalWrite(segmentPins[5], HIGH);
  digitalWrite(segmentPins[6], HIGH);
  }
  else if (number[0] == 2)
  {
  digitalWrite(digitPins[0], HIGH);
  digitalWrite(segmentPins[0], LOW);
  digitalWrite(segmentPins[1], LOW);
  digitalWrite(segmentPins[2], HIGH);
  digitalWrite(segmentPins[3], LOW);
  digitalWrite(segmentPins[4], LOW);
  digitalWrite(segmentPins[5], HIGH);
  digitalWrite(segmentPins[6], LOW);
  }
  else if (number[0] == 3)
  {
  digitalWrite(digitPins[0], HIGH);
  digitalWrite(segmentPins[0], LOW);
  digitalWrite(segmentPins[1], LOW);
  digitalWrite(segmentPins[2], LOW);
  digitalWrite(segmentPins[3], LOW);
  digitalWrite(segmentPins[4], HIGH);
  digitalWrite(segmentPins[5], HIGH);
  digitalWrite(segmentPins[6], LOW);
  }
  else if (number[0] == 4)
  {
  digitalWrite(digitPins[0], HIGH);
  digitalWrite(segmentPins[0], HIGH);
  digitalWrite(segmentPins[1], LOW);
  digitalWrite(segmentPins[2], LOW);
  digitalWrite(segmentPins[3], HIGH);
  digitalWrite(segmentPins[4], HIGH);
  digitalWrite(segmentPins[5], LOW);
  digitalWrite(segmentPins[6], LOW);
  }
  else if (number[0] == 5)
  {
  digitalWrite(digitPins[0], HIGH);
  digitalWrite(segmentPins[0], LOW);
  digitalWrite(segmentPins[1], HIGH);
  digitalWrite(segmentPins[2], LOW);
  digitalWrite(segmentPins[3], LOW);
  digitalWrite(segmentPins[4], HIGH);
  digitalWrite(segmentPins[5], LOW);
  digitalWrite(segmentPins[6], LOW);
  }
  else if (number[0] == 6)
  {
  digitalWrite(digitPins[0], HIGH);
  digitalWrite(segmentPins[0], LOW);
  digitalWrite(segmentPins[1], HIGH);
  digitalWrite(segmentPins[2], LOW);
  digitalWrite(segmentPins[3], LOW);
  digitalWrite(segmentPins[4], LOW);
  digitalWrite(segmentPins[5], LOW);
  digitalWrite(segmentPins[6], LOW);
  }
  else if (number[0] == 7)
  {
  digitalWrite(digitPins[0], HIGH);
  digitalWrite(segmentPins[0], LOW);
  digitalWrite(segmentPins[1], LOW);
  digitalWrite(segmentPins[2], LOW);
  digitalWrite(segmentPins[3], HIGH);
  digitalWrite(segmentPins[4], HIGH);
  digitalWrite(segmentPins[5], HIGH);
  digitalWrite(segmentPins[6], HIGH);
  }
  else if (number[0] == 8)
  {
  digitalWrite(digitPins[0], HIGH);
  digitalWrite(segmentPins[0], LOW);
  digitalWrite(segmentPins[1], LOW);
  digitalWrite(segmentPins[2], LOW);
  digitalWrite(segmentPins[3], LOW);
  digitalWrite(segmentPins[4], LOW);
  digitalWrite(segmentPins[5], LOW);
  digitalWrite(segmentPins[6], LOW);
  }
  else if (number[0] == 9);
  {
  digitalWrite(digitPins[0], HIGH);
  digitalWrite(segmentPins[0], LOW);
  digitalWrite(segmentPins[1], LOW);
  digitalWrite(segmentPins[2], LOW);
  digitalWrite(segmentPins[3], HIGH);
  digitalWrite(segmentPins[4], HIGH);
  digitalWrite(segmentPins[5], LOW);
  digitalWrite(segmentPins[6], LOW);
  }
  //etc.
  
}

void End()
{
  //when the counting reaches over 9999, a different message should be displayed and the process should start again.
}

And here is an image of my inexperiences wiring, as for some reason the segment instructions have been turned around. When I say LOW, the bar is lit. When I say HIGH the bar is unlit...

how can I convert for example 267

Divide by 1000, which here will give you zero, then divide by 100, then 10.
Don't forget to subtract each decimal digit, so 267 / 100 = 2, so then multiply 2 by 100 and subtract that from 267 (= 67), then do the divide by 10.

as for some reason the segment instructions have been turned around.

Your display device is probably common anode, so you're sinking current into the pin, rather than sourcing it as you would for a common cathode.

Thank you! So simple but I would not have thought about it myself.

Thanks again :slight_smile:

as for some reason the segment instructions have been turned around. When I say LOW, the bar is lit.

That is because the arduino is sinking the current from the segments. That is it is connecting the cathode to ground. So a logic LOW will turn it on. This is the normal way things work.

Now I don't seem to be able to make different numbers show on the different digits.. any idea why this would be?

int segmentPins[7] = {2,3,4,5,6,7,8};
int digitPins[4] = {9,10,11,12};
int escalated_number = 1;
int digit1;
int digit2;
int digit3;
int digit4;

void setup()
{
  Serial.begin(9600);
  for(int i=0; i<7; i++)
  {
    pinMode(segmentPins[i], OUTPUT);
    digitalWrite(segmentPins[i], LOW); //is this needed?
  }
  
  for (int i=0; i<4; i++)
  {
    pinMode(digitPins[i], OUTPUT);
    digitalWrite(digitPins[i], HIGH); //is this needed?
  }

}

void loop()
{
  Count();
  Convert();
  Displaynumber();
  delay(3000);
}


void Count()
{
  if (escalated_number == 1)
  {
    Serial.println(escalated_number);
  }
  escalated_number++;
  Serial.println(escalated_number);
  if (escalated_number>10000)
  {
    End();
  }
  
}
  
void Convert()
{
  //this will break out the 4 different digits from the whole number
  int digit1a;
  int digit2a;
  int digit3a;
  digit1 = escalated_number/1000;
  digit1a = (escalated_number-(digit1*1000));
  digit2 = digit1a/100;
  digit2a = (digit1a-(digit2*100)); 
  digit3 = digit2a/10;
  digit3a = (digit2a-(digit3*10));
  digit4 = digit3a/1;
  //test to ensure that the correct values has been assigned
  Serial.println(digit1);
  Serial.println(digit2);
  Serial.println(digit3);
  Serial.println(digit4);
}
  
void Displaynumber()
//this should instruct the digits of the display what segments to light when what value is assigned to the digits.
{
 Digit1();
 Digit2();
 Digit3();
 Digit4();
}
  
void Digit1() 
{
  switch(digit1)
 {
   case 0 : 
     digitalWrite(digitPins[0], HIGH); 
     digitalWrite(segmentPins[0], LOW); 
     digitalWrite(segmentPins[1], LOW); 
     digitalWrite(segmentPins[2], LOW); 
     digitalWrite(segmentPins[3], LOW); 
     digitalWrite(segmentPins[4], LOW); 
     digitalWrite(segmentPins[5], LOW); 
     digitalWrite(segmentPins[6], HIGH);
     break;
     
   case 1 : 
    digitalWrite(digitPins[0], HIGH);
    digitalWrite(segmentPins[0], HIGH);
    digitalWrite(segmentPins[1], LOW);
    digitalWrite(segmentPins[2], LOW);
    digitalWrite(segmentPins[3], HIGH);
    digitalWrite(segmentPins[4], HIGH);
    digitalWrite(segmentPins[5], HIGH);
    digitalWrite(segmentPins[6], HIGH);
    break;

  case 2 :    
    digitalWrite(digitPins[0], HIGH);
    digitalWrite(segmentPins[0], LOW);
    digitalWrite(segmentPins[1], LOW);
    digitalWrite(segmentPins[2], HIGH);
    digitalWrite(segmentPins[3], LOW);
    digitalWrite(segmentPins[4], LOW);
    digitalWrite(segmentPins[5], HIGH);
    digitalWrite(segmentPins[6], LOW);
    break;
    
  case 3 :
    digitalWrite(digitPins[0], HIGH);
    digitalWrite(segmentPins[0], LOW);
    digitalWrite(segmentPins[1], LOW);
    digitalWrite(segmentPins[2], LOW);
    digitalWrite(segmentPins[3], LOW);
    digitalWrite(segmentPins[4], HIGH);
    digitalWrite(segmentPins[5], HIGH);
    digitalWrite(segmentPins[6], LOW);
    break;
    
  case 4 :
    digitalWrite(digitPins[0], HIGH);
    digitalWrite(segmentPins[0], HIGH);
    digitalWrite(segmentPins[1], LOW);
    digitalWrite(segmentPins[2], LOW);
    digitalWrite(segmentPins[3], HIGH);
    digitalWrite(segmentPins[4], HIGH);
    digitalWrite(segmentPins[5], LOW);
    digitalWrite(segmentPins[6], LOW);
    break;
    
  case 5 :
    digitalWrite(digitPins[0], HIGH);
    digitalWrite(segmentPins[0], LOW);
    digitalWrite(segmentPins[1], HIGH);
    digitalWrite(segmentPins[2], LOW);
    digitalWrite(segmentPins[3], LOW);
    digitalWrite(segmentPins[4], HIGH);
    digitalWrite(segmentPins[5], LOW);
    digitalWrite(segmentPins[6], LOW);
    break;
    
  case 6 :
    digitalWrite(digitPins[0], HIGH);
    digitalWrite(segmentPins[0], LOW);
    digitalWrite(segmentPins[1], HIGH);
    digitalWrite(segmentPins[2], LOW);
    digitalWrite(segmentPins[3], LOW);
    digitalWrite(segmentPins[4], LOW);
    digitalWrite(segmentPins[5], LOW);
    digitalWrite(segmentPins[6], LOW);
    break;
    
  case 7 :
    digitalWrite(digitPins[0], HIGH);
    digitalWrite(segmentPins[0], LOW);
    digitalWrite(segmentPins[1], LOW);
    digitalWrite(segmentPins[2], LOW);
    digitalWrite(segmentPins[3], HIGH);
    digitalWrite(segmentPins[4], HIGH);
    digitalWrite(segmentPins[5], HIGH);
    digitalWrite(segmentPins[6], HIGH);
    break;
    
  case 8 :
    digitalWrite(digitPins[0], HIGH);
    digitalWrite(segmentPins[0], LOW);
    digitalWrite(segmentPins[1], LOW);
    digitalWrite(segmentPins[2], LOW);
    digitalWrite(segmentPins[3], LOW);
    digitalWrite(segmentPins[4], LOW);
    digitalWrite(segmentPins[5], LOW);
    digitalWrite(segmentPins[6], LOW);
    break;
    
  case 9 :
    digitalWrite(digitPins[0], HIGH);
    digitalWrite(segmentPins[0], LOW);
    digitalWrite(segmentPins[1], LOW);
    digitalWrite(segmentPins[2], LOW);
    digitalWrite(segmentPins[3], HIGH);
    digitalWrite(segmentPins[4], HIGH);
    digitalWrite(segmentPins[5], LOW);
    digitalWrite(segmentPins[6], LOW);
    break;
 }
}

my code is to long, but after void Digit1() there are three more identical for Digit2(), Digit3() and Digit4()

The main error is most likely that you never reset any of the digit pins to LOW.....

What you are doing is called multiplexing: You are addressing one digit after the other and tell it what to show. But it will not remember! So you have to switch it off before you turn to the next digit...

Can you also think of another methode to display the segments? Hint: You are "decoding" the pattern 0 to 9 into a more complex pattern 0..127. How can you do this in a more concise way? Think of arrays.....

and you don't need resistors at the digit side when you have some at the segment side...