Pages: [1]   Go Down
Author Topic: 3 digit 7 segment display Tutorial  (Read 4402 times)
0 Members and 2 Guests are viewing this topic.
0
Offline Offline
Sr. Member
****
Karma: 4
Posts: 310
Posts: 40382
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I took a 3 digit 7 segment display off a bathroom scale.  I'll use it for a temperature display:



Here's how it works:  
There are 10 pins on it, I call them 1-10 starting on the left.  I connected each one to arduino digital pins 1-10 in order.
There are three pins that determine which digit is selected, the first second or third.  Those pins are 4,5, and 9.  If pin 4 is LOW and the other two are HIGH then the first digit is selected.  If pin 5 is LOW, then the middle one is selected, and 9 is the third.  

 digit 1              digit 2               digit 3
 4= LOW           4=HIGH           4=HIGH
 5=HIGH           5=LOW            5=HIGH
 9=HIGH           9=HIGH           9=LOW

Now there are 7 pins left, one for each of the 7 segments.  Turning one HIGH will turn on that segment.  

             Pin 7
          _______
         |            |
Pin 6 |            | Pin 8
         |_______|
         |     3     |
Pin 2 |            | Pin 1
         |_______|
              10

writing the code:
For my code example you type in a digit for the letterfunction() and it will light up the necessary segments.
For making your own symbols, the general outline is: select a digit by putting 4,5, or 9 LOW, then
After you set all the segments HIGH that you want, put a delay(5); after it.  Then turn them LOW and go on to the next one.  

Code:

int i=0;
int degree=25;
int nothing=100;
void setup()   {                
pinMode(1, OUTPUT);    
pinMode(2, OUTPUT);  
pinMode(3, OUTPUT);  
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6, OUTPUT);  
pinMode(7, OUTPUT);  
pinMode(8, OUTPUT);  
pinMode(9,OUTPUT);
pinMode(10, OUTPUT);  
// Using Serial.begin(9600) makes pin 1 stay HIGH for some reason
}

//
//

void loop()                    
{
  //NUMERAL PINS ARE 4, 5, and 9
//   4 LOW = FIRST NUMERAL
//   5 LOW = SECOND NUMERAL
//   9 LOW = THIRD NUMERAL


  //FIRST NUMERAL ON THE DISPLAY
digitalWrite(4,LOW);
digitalWrite(5,HIGH);
digitalWrite(9,HIGH);

letterfunction (7); // type 0-9 in the parenthesis or
                   //type (degree) for the degree symbol
                   // or type (nothing) for nothing

   //NUMERAL 2
digitalWrite(4,HIGH);
digitalWrite(5,LOW);
digitalWrite(9,HIGH);

letterfunction(7);


   //NUMERAL 3
digitalWrite(4,HIGH);
digitalWrite(5,HIGH);
digitalWrite(9,LOW);

letterfunction(degree); // the degree symbol

}

//------------------------------------------------------------
// THIS FUNCTION HAS THE DIFFERENT NUMBERS
// AND THE DEGREE SYMBOL
void letterfunction(unsigned char var){
if (var==1){
digitalWrite(6,HIGH);  //pins 6 and 2 are the leftmost vertical lines
digitalWrite(2,HIGH);
delay(5);
for(i=1;i<11;i++){
digitalWrite(i,LOW);
}
}

if (var==2){
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(3,HIGH);
digitalWrite(2,HIGH);
digitalWrite(10,HIGH);
delay(5);
for(i=1;i<11;i++){
digitalWrite(i,LOW);
}
}

if (var==3){
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(3,HIGH);
digitalWrite(1,HIGH);
digitalWrite(10,HIGH);
delay(5);
for(i=1;i<11;i++){
digitalWrite(i,LOW);
}
}

if (var==4){
digitalWrite(6,HIGH);
digitalWrite(8,HIGH);
digitalWrite(3,HIGH);
digitalWrite(1,HIGH);

delay(5);
for(i=1;i<11;i++){
digitalWrite(i,LOW);
}
}

if (var==5){
digitalWrite(7,HIGH);
digitalWrite(6,HIGH);
digitalWrite(3,HIGH);
digitalWrite(1,HIGH);
digitalWrite(10,HIGH);
delay(5);
for(i=1;i<11;i++){
digitalWrite(i,LOW);
}
}

if (var==6){
digitalWrite(6,HIGH);
digitalWrite(7,HIGH);
digitalWrite(3,HIGH);
digitalWrite(2,HIGH);
digitalWrite(1,HIGH);
digitalWrite(10,HIGH);
delay(5);

digitalWrite(6,LOW);
digitalWrite(7,LOW);
digitalWrite(3,LOW);
digitalWrite(2,LOW);
digitalWrite(1,LOW);
digitalWrite(10,LOW);

}

if (var==7){
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(1,HIGH);
delay(5);
for(i=1;i<11;i++){
digitalWrite(i,LOW);
}
}

if (var==8){
digitalWrite(1,HIGH);
digitalWrite(2,HIGH);
digitalWrite(3,HIGH);
digitalWrite(6,HIGH);
digitalWrite(10,HIGH);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
delay(5);
for(i=1;i<11;i++){
digitalWrite(i,LOW);
}
}

if (var==9){
digitalWrite(7,HIGH);
digitalWrite(6,HIGH);
digitalWrite(3,HIGH);
digitalWrite(8,HIGH);
digitalWrite(1,HIGH);
delay(5);
for(i=1;i<11;i++){
digitalWrite(i,LOW);
}
}

if (var==0){
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(1,HIGH);
digitalWrite(2,HIGH);
digitalWrite(10,HIGH);
digitalWrite(6,HIGH);
delay(5);
for(i=1;i<11;i++){
digitalWrite(i,LOW);
}
}

if (var==degree){    //the degree symbol
digitalWrite(6,HIGH);
digitalWrite(3,HIGH);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
delay(5);
for(i=1;i<11;i++){
digitalWrite(i,LOW);
}
}

}



If you want to hook up a temperature sensor you can connect it to Analog pin 5 and use this code:
Code:
// temperature data on Analog 5
// LED display on pins 1-10
int i=0;
int degree=25;
int nothing=100;
float tempC;
float tempF;
float voltage;
int reading;
int num=11;
int digitOne;
int digitTwo;
unsigned long now;
unsigned long then;
void setup()   {                
pinMode(1, OUTPUT);    
pinMode(2, OUTPUT);  
pinMode(3, OUTPUT);  
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6, OUTPUT);  
pinMode(7, OUTPUT);  
pinMode(8, OUTPUT);  
pinMode(9,OUTPUT);
pinMode(10, OUTPUT);  
// Using Serial.begin(9600) makes pin 1 stay HIGH for some reason
}


void loop()                    
{
  now=millis();
  if (now-then > 30000 || millis()<100){  // take a sample every 30 seconds
  reading=analogRead(5);
  voltage = reading*(5.0/1024);  //convert reading to voltage (in V), for 5V input
  tempC = (voltage-0.5)*100;   //convert voltage to temperature
  tempF = ((tempC*9/5)+32); //convert C temperature to F
  num=tempF;  // num takes off the decimal point
  then=now;  
}

digitOne=num/10;            //so, to get digitOne you divide by 10
                          // a number like 49 magically becomes 4, all decimals disappear
digitTwo=num - (digitOne * 10);  //then to get digit2 (9)you multiply digitOne by 10 to get 40
                             // and subtract it from the original 49 to get 9

  //NUMERAL PINS ARE 4, 5, and 9
//   4 LOW = FIRST NUMERAL
//   5 LOW = SECOND NUMERAL
//   9 LOW = THIRD NUMERAL

//FIRST NUMERAL ON THE DISPLAY

digitalWrite(4,LOW);
digitalWrite(5,HIGH);
digitalWrite(9,HIGH);

letterfunction (digitOne); // type 0-9 in the parenthesis or
                   //type (degree) for the degree symbol
                   // or type (nothing) for nothing

//NUMERAL 2

digitalWrite(4,HIGH);
digitalWrite(5,LOW);
digitalWrite(9,HIGH);

letterfunction(digitTwo);


//NUMERAL 3

digitalWrite(4,HIGH);
digitalWrite(5,HIGH);
digitalWrite(9,LOW);

letterfunction(degree);

}
// THIS FUNCTION HAS THE DIFFERENT NUMBERS
// AND THE DEGREE SYMBOL
void letterfunction(unsigned char var){
if (var==1){
digitalWrite(6,HIGH);  //pins 6 and 2 are the leftmost vertical lines
digitalWrite(2,HIGH);
digitalWrite(1,LOW);
delay(5);
for(i=1;i<11;i++){
digitalWrite(i,LOW);
}
}

else if (var==2){
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(3,HIGH);
digitalWrite(2,HIGH);
digitalWrite(10,HIGH);
delay(5);
for(i=1;i<11;i++){
digitalWrite(i,LOW);
}
}

else if (var==3){
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(3,HIGH);
digitalWrite(1,HIGH);
digitalWrite(10,HIGH);
delay(5);
for(i=1;i<11;i++){
digitalWrite(i,LOW);
}
}

else if (var==4){
digitalWrite(6,HIGH);
digitalWrite(8,HIGH);
digitalWrite(3,HIGH);
digitalWrite(1,HIGH);

delay(5);
for(i=1;i<11;i++){
digitalWrite(i,LOW);
}
}

else if (var==5){
digitalWrite(7,HIGH);
digitalWrite(6,HIGH);
digitalWrite(3,HIGH);
digitalWrite(1,HIGH);
digitalWrite(10,HIGH);
delay(5);
for(i=1;i<11;i++){
digitalWrite(i,LOW);
}
}

else if (var==6){
digitalWrite(6,HIGH);
digitalWrite(7,HIGH);
digitalWrite(3,HIGH);
digitalWrite(2,HIGH);
digitalWrite(1,HIGH);
digitalWrite(10,HIGH);
delay(5);

digitalWrite(6,LOW);
digitalWrite(7,LOW);
digitalWrite(3,LOW);
digitalWrite(2,LOW);
digitalWrite(1,LOW);
digitalWrite(10,LOW);

}

else if (var==7){
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(1,HIGH);
delay(5);
for(i=1;i<11;i++){
digitalWrite(i,LOW);
}
}

else if (var==8){
digitalWrite(1,HIGH);
digitalWrite(2,HIGH);
digitalWrite(3,HIGH);
digitalWrite(6,HIGH);
digitalWrite(10,HIGH);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
delay(5);
for(i=1;i<11;i++){
digitalWrite(i,LOW);
}
}else if (var==9){
digitalWrite(7,HIGH);
digitalWrite(6,HIGH);
digitalWrite(3,HIGH);
digitalWrite(8,HIGH);
digitalWrite(1,HIGH);
delay(5);
for(i=1;i<11;i++){
digitalWrite(i,LOW);
}
}

else if (var==0){
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(1,HIGH);
digitalWrite(2,HIGH);
digitalWrite(10,HIGH);
digitalWrite(6,HIGH);
delay(5);
for(i=1;i<11;i++){
digitalWrite(i,LOW);
}
}

else if (var==degree){    //the degree symbol
digitalWrite(6,HIGH);
digitalWrite(3,HIGH);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
delay(5);
for(i=1;i<11;i++){
digitalWrite(i,LOW);
}
}

}

« Last Edit: November 06, 2010, 09:21:17 pm by Big_Oil » Logged

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

Nice work Oil!
Logged

Pages: [1]   Go Up
Jump to: