Go Down

Topic: 3 digit 7 segment display Tutorial (Read 6081 times) previous topic - next topic

Big Oil

Nov 07, 2010, 03:09 am Last Edit: Nov 07, 2010, 03:21 am by Big_Oil Reason: 1
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: [Select]


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: [Select]

// 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);
}
}

}



Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy