Introduction: Arduino: an Easier Way to Work With Seven Segment Displays

About: All of my life I have been interested in learning the way things work. It was always hard for me to use something and just accept that it works without taking it apart and seeing what makes it tick. Due to thi…
Ever have trouble programming code for seven segment displays? Well they made the 4511 to make things a whole lot easier. What the 4511 does is takes a 4 digit binary input value (ones and zeros), and converts it to a decimal value on a seven segment display, it's a really handy chip. In this instructable I'll show you how to use them with the arduino.

Step 1: Materials

Parts:

1.) Arduino
 
2.) 4511 binary seven segment decoder
 
3.) Breadboard/jumper wires
 
4.) Breadboard of some sort (I used a protoshield from Adafruit)
 
5.) 470 ohm resistor

 6.) A to B programming cable

 7.) CDS photocell
 
 8.) 10K resistor

 Tools:

 1.) Computer

 2.) A brain :)

Step 2: How the 4511 Works

The 4511 takes a four-bit binary input on pins 1,2,6, and 7. Then translates it to a decimal output when connected to a seven segment display, which means that instead of programming 7 individual pins each time the display changes digits, you only have to program four. Also, instead of finding the exact led's to turn on for each digit, you just enter a binary value, which leads us to the next step:



Step 3: A Thing About Binary

For those of you who already are fluent in binary, move on to the next step.

Binary is used in pretty much all mainstream electronics today. It is based on a four digit lines consisting of ones and zeros (each digit is called a bit, each line is called a byte). The first digit in the sequence is equal to one, the second is equal to two, the third is equal to four, and the fourth is equal to eight. So the byte 1001 would be equal to nine (one plus 8). To make it simpler:

Binary:    Decimal:
0000   =   0
0001   =   1
0010   =   2
0011   =   3
0100   =   4
0101   =   5
0110   =   6
0111   =   7
1000   =   8
1001   =   9
and so on... (This is as far as the 4511 will go, since it only has one digit capability, it cannot print 10 or up)

Step 4: A Simple Timer

The first thing to do is to build a simple proof of concept circuit, a count up timer, and then go from there, for this, you'll need to have everything exept the CDS photocell and the 10K resistor.

Step 5: Insert the Chip

Insert the chip into the board, make sure to note which way the chip is facing ( where the little notch is o the chip)

Step 6: Add the Binary Inputs

An easy way to do this is just to use some tiny jumper wires for this, so that you don't have them in your way when you insert other components.

Digital Pin 8 of the Arduino connected to: pin 1 of 4511 (Binary pin 2)

Digital Pin 9 of the Arduino connected to: pin 2 of 4511 (Binary pin 3)

Digital Pin 11 of the Arduino connected to: pin 6 of 4511 (Binary pin 4)

Digital Pin 12 of the Arduino connected to: pin 7 of 4511 (Binary pin 1)

Step 7: Power the Chip

Pins 3, 16, and 4 are connected to +5v. Pins 8 and 5 are connected to ground.

Step 8: Connect to the Display

The 4511 works with common cathode (ground) displays only, but most seven segment displays are, so most of the time, you don't have to worry.
  
   A connected to: pin 13 of 4511
  
   B connected to: pin 12 of 4511
  
   C connected to: pin 11 of 4511
  
   D connected to: pin 10 of 4511
  
   E connected to: pin 9 of 4511
  
   F connected to: pin 15 of 4511
  
   G connected to: pin 14 of 4511

   Ground pin of the display connected to the ground of Arduino with a 470 to 1K resistor to prevent
   overloading the display.

Step 9: The Code:

Alright, now for the fun part!

Here's the code, just copy and paste after this line.

/* Code written and designs made by Kyle Hovey (aka Speleomaniac on www.instructables.com)

   For this code, a 4511 binary to seven-segment display decoder is used to make
   writing code for displays a whole lot easier (if you happen to have a 4511
   lying around somwhere)
  
   Seven segment display:
   A connected to: pin 13 of 4511 (the 4511 chip is a 16 prong chip for all wondering)
   B connected to: pin 12 of 4511
   C connected to: pin 11 of 4511
   D connected to: pin 10 of 4511
   E connected to: pin 9 of 4511
   F connected to: pin 15 of 4511
   G connected to: pin 14 of 4511
  
   Arduino to 4511:
   Digital Pin 8 connected to: pin 1 of 4511 (Binary pin 2)
   Digital Pin 9 connected to: pin 2 of 4511 (Binary pin 3)
   Digital Pin 11 connected to: pin 6 of 4511 (Binary pin 4)
   Digital Pin 12 connected to: pin 7 of 4511 (Binary pin 1)
  
   Binary:
   B:   DEC:
   0000: 1
   1000: 2
   0100: 3
   1100: 4
   0010: 5
   1010: 6
   0110: 7
   1110: 8
   0001: 9 (the 4511 only accepts digits up to nine, the seven segment display
   1001: 10 cannot display two-digit numbers unless you have two displays and two chips)
   0101: 11
   1101: 12
   0011: 13
   0111: 14
   1111: 15
  
   The code for a simple count-up timer:
*/
  
const int Bin1 = 12; //These are all identifying the binary inputs of
const int Bin2 = 8; //the 4511 Seven Segment Decoder
const int Bin3 = 9;
const int Bin4 = 11;

void setup() //Enters the setup phase
{
  pinMode(Bin1, OUTPUT); // sets up binary output one as a digital output
  pinMode(Bin2, OUTPUT); //and so on...
  pinMode(Bin3, OUTPUT);
  pinMode(Bin4, OUTPUT);
}

void loop() // Pretty much just saying "loop whatever code is after this line"
{
  digitalWrite(Bin1, B0); //Write "0" to the display
  digitalWrite(Bin2, B0);
  digitalWrite(Bin3, B0);
  digitalWrite(Bin4, B0);
  delay(500);
  digitalWrite(Bin1, B1); //Write "1" to the display
  digitalWrite(Bin2, B0);
  digitalWrite(Bin3, B0);
  digitalWrite(Bin4, B0);
  delay(500); //Wait for half of a second (or else the numbers would be a blur)
  digitalWrite(Bin1, B0); //Write "2" to the display
  digitalWrite(Bin2, B1);
  digitalWrite(Bin3, B0);
  digitalWrite(Bin4, B0);
  delay(500); //Wait for half of a second
  digitalWrite(Bin1, B1); //Write "3" to the display
  digitalWrite(Bin2, B1);
  digitalWrite(Bin3, B0);
  digitalWrite(Bin4, B0);
  delay(500); //Wait for half of a second
  digitalWrite(Bin1, B0); //Write "4" to the display
  digitalWrite(Bin2, B0);
  digitalWrite(Bin3, B1);
  digitalWrite(Bin4, B0);
  delay(500); //Wait for half of a second
  digitalWrite(Bin1, B1); //Write "5" to the display
  digitalWrite(Bin2, B0);
  digitalWrite(Bin3, B1);
  digitalWrite(Bin4, B0);
  delay(500); //Wait for half of a second
  digitalWrite(Bin1, B0); //Write "6" to the display
  digitalWrite(Bin2, B1);
  digitalWrite(Bin3, B1);
  digitalWrite(Bin4, B0);
  delay(500); //Wait for half of a second
  digitalWrite(Bin1, B1); //Write "7" to the display
  digitalWrite(Bin2, B1);
  digitalWrite(Bin3, B1);
  digitalWrite(Bin4, B0);
  delay(500); //Wait for half of a second
  digitalWrite(Bin1, B0); //Write "8" to the display
  digitalWrite(Bin2, B0);
  digitalWrite(Bin3, B0);
  digitalWrite(Bin4, B1);
  delay(500); //Wait for half of a second
  digitalWrite(Bin1, B1); //Write "9" to the display
  digitalWrite(Bin2, B0);
  digitalWrite(Bin3, B0);
  digitalWrite(Bin4, B1);
  delay(500); //Wait for half of a second
}

Step 10: A Light Meter

I thought it would be cool to take the code from the count up timer, and modify it into a light meter, this is how to do it:

Step 11: Add the CDS Photocell

Try bending the leads to the photocell so that it is directed away from the Arduino and display to prevent unwanted light.

Step 12: Power the Photocell

A  resistor is attached to one lead of the photocell to ground. A wire goes from that same lead to analog input 0 of the Arduino. The other lead of the photocell goes to +5v.

Step 13: The Code

Alright, here's the code, just copy and paste:

/* Code written and designs made by Kyle Hovey (aka Speleomaniac on www.instructables.com)

   For this code, a 4511 binary to seven-segment display decoder is used to make
   writing code for displays a whole lot easier.
  
   Seven segment display:
   A connected to: pin 13 of 4511 (the 4511 chip is a 16 prong chip for all wondering)
   B connected to: pin 12 of 4511
   C connected to: pin 11 of 4511
   D connected to: pin 10 of 4511
   E connected to: pin 9 of 4511
   F connected to: pin 15 of 4511
   G connected to: pin 14 of 4511
  
   Arduino to 4511:
   Digital Pin 8 connected to: pin 1 of 4511 (Binary pin 2)
   Digital Pin 9 connected to: pin 2 of 4511 (Binary pin 3)
   Digital Pin 11 connected to: pin 6 of 4511 (Binary pin 4)
   Digital Pin 12 connected to: pin 7 of 4511 (Binary pin 1)
  
   CDF to arduino:
   10K resistor attatched to ground and  analog out wire from one pin
   of the CDF, other pin of CDF cell is attatched to +5v.
     
   Binary:
   B:   DEC:
   0000: 0
   1000: 2
   0100: 3
   1100: 4
   0010: 5
   1010: 6
   0110: 7
   1110: 8
   0001: 9 (the 4511 only accepts digits up to nine, the seven segment display
   1001: 10 cannot display two-digit numbers unless you have two displays and two chips)
   0101: 11
   1101: 12
   0011: 13
   0111: 14
   1111: 15
  
   The code for a digital light meter on a seven segment display.
*/
  
const int Bin1 = 12; //These are all identifying the binary inputs of
const int Bin2 = 8; //the 4511 Seven Segment Decoder
const int Bin3 = 9;
const int Bin4 = 11;
int val = 0;
int CDSpin = 0;

void setup() //Enters the setup phase
{
  pinMode(Bin1, OUTPUT); // sets up binary output one as a digital output
  pinMode(Bin2, OUTPUT); //and so on...
  pinMode(Bin3, OUTPUT);
  pinMode(Bin4, OUTPUT);
  Serial.begin(9600);
}

void loop() // Pretty much just saying "loop whatever code is after this line"
{
  val = analogRead(CDSpin); //Sets the analog value "val" to the ambient light level.
  val = map(val, 0, 1029, 0, 100); //Scale down the value from 1029-max to 100-max
  Serial.println(val, DEC);
  delay(10); //Wait for arduino to catch up
  if (val == 0 || val == 1) //if the value is at minimum:
  {
   digitalWrite(Bin1, B0); //Write "0" to the display
   digitalWrite(Bin2, B0);
   digitalWrite(Bin3, B0);
   digitalWrite(Bin4, B0);
  }
  if (val > 1 && val <= 10) //if the value is between one and ten:
  {
   digitalWrite(Bin1, B1); //Write "1" to the display
   digitalWrite(Bin2, B0);
   digitalWrite(Bin3, B0);
   digitalWrite(Bin4, B0);
  }
  if (val > 10 && val <= 20) //if the value is between ten and twenty:
  {
   digitalWrite(Bin1, B0); //Write "2" to the display
   digitalWrite(Bin2, B1);
   digitalWrite(Bin3, B0);
   digitalWrite(Bin4, B0);
  }
  if (val > 20 && val <= 30) //if the value is between twenty and thirty:
  {
   digitalWrite(Bin1, B1); //Write "3" to the display
   digitalWrite(Bin2, B1);
   digitalWrite(Bin3, B0);
   digitalWrite(Bin4, B0);
  }
  if (val > 30 && val <= 40) //if the value is between thirty and fourty:
  {
   digitalWrite(Bin1, B0); //Write "4" to the display
   digitalWrite(Bin2, B0);
   digitalWrite(Bin3, B1);
   digitalWrite(Bin4, B0);
  }
  if (val > 40 && val <= 50) //if the value is between fourty and fifty:
  {
   digitalWrite(Bin1, B1); //Write "5" to the display
   digitalWrite(Bin2, B0);
   digitalWrite(Bin3, B1);
   digitalWrite(Bin4, B0);
  }
  if (val > 50 && val <= 60) //if the value is between fifty and sixty:
  {
   digitalWrite(Bin1, B0); //Write "6" to the display
   digitalWrite(Bin2, B1);
   digitalWrite(Bin3, B1);
   digitalWrite(Bin4, B0);
  }
  if (val > 70 && val <= 80) //if the value is between sixty and seventy:
  {
   digitalWrite(Bin1, B1); //Write "7" to the display
   digitalWrite(Bin2, B1);
   digitalWrite(Bin3, B1);
   digitalWrite(Bin4, B0);
  }
  if (val > 80 && val <= 90) //if the value is between eighty and ninety:
  {
   digitalWrite(Bin1, B0); //Write "8" to the display
   digitalWrite(Bin2, B0);
   digitalWrite(Bin3, B0);
   digitalWrite(Bin4, B1);
  }
  if (val > 90 && val <= 100) //if the value is between ninety and wne hundred;
  {
   digitalWrite(Bin1, B1); //Write "9" to the display
   digitalWrite(Bin2, B0);
   digitalWrite(Bin3, B0);
   digitalWrite(Bin4, B1);
  }
}

Step 14: Thanks for Viewing!

Any questions, comments or ideas, feel free to comment, happy experimenting!