Introduction: Using a 4 Digit & 7 Segment Display, With Arduino
In this tutorial I will be showing you how to use a 7 segment display with 4 digits using arduino. Some basic things I would like to point out is that this takes up almost all of the digital pins on the arduino uno, leonardo, the boards with 13 digital pins. Most displays have 12 breakout pins that connect either directly to the arduino, or through a resistor. Also, I would like to point out that these displays have no need for Ground, 5V, or 3.3V to be connected. So, let's get started...
Step 1: Materials
Using a display of this kind requires almost no materials.
- 4 x 330Ω resistors
- 12 x Male to male jumper wires
- 1 x Arduino
- 1 x breadboard of any size (they don't need the power rails)
No tools are required in order to make a prototype of this design. However, a soldering iron and a pcb board would be needed for a more permanent use.
Step 2: Breadboard Layout
Just to give you some context i will explain the usage of each pin. 8 out of the 12 pins on the display are used for the 8 segments. There are 7 segments used to form any digit while one controls the decimal point. The other 4 out of the 12 pins control each of the 4 digits on the display. Any pin that has a resistor on it is one of the 4 digit pins, otherwise they are the segment pins.
The above design I created from fritzing in order to show the connection between the display and the arduino. Note the placement of where the resistors are because if you connect the resistor to the wrong pin on the display, either that digit will not work or that segment will not work, FOREVER...
***IMPORTANT NOTE***
When setting up the circuit switch the yellow and the purple wires (I messed up my circuit diagram).
Step 3: Installing the Library
The library linked below is from the arduino website for easily controlling a display. The link goes to github. If you have never been on github listen carefully, if you have read the next paragraph. When you get onto the website look at the right side of the window and look down until you see, "Download Zip". Click that button and watch it appear in your downloads.
Now you have to load the previously installed library into your libraries folder. If you now how to do this then skip to the next step, otherwise keep on reading. First go into finder and locate the "documents" folder, and open it. Then, locate the "arduino" folder, and open it. Then, locate the libraries folder, and open it. Finally drag and drop the installed library into the just opened libraries folder.
IMPORTANT. If your arduino application was opened and running while you where putting the library into the libraries folder, the arduino won't recognize the library. You just have to quit the application and open it again.
Step 4: The Code
The code for actually displaying something is listed below.
#include "SevSeg.h" SevSeg sevseg; //Initiate a seven segment controller object void setup() { byte numDigits = 4; byte digitPins[] = {2, 3, 4, 5}; byte segmentPins[] = {6, 7, 8, 9, 10, 11, 12, 13}; bool resistorsOnSegments = 0; // variable above indicates that 4 resistors were placed on the digit pins. // set variable to 1 if you want to use 8 resistors on the segment pins. sevseg.begin(COMMON_CATHODE, numDigits, digitPins, segmentPins, resistorsOnSegments); sevseg.setBrightness(90); } void loop() { sevseg.setNumber(3141, 3); sevseg.refreshDisplay(); // Must run repeatedly
Step 5: The Result
If you connected the display correctly, uploaded the code correctly, and copied the coded just right, then your display should be displaying pi (only 3.141).
If not then, read step six for whatever is happening wrong.
If you did get it right, then I suggest reading going further in step seven.
Step 6: Troubleshooting
Here i have listed two possible things that could have happend to your display that could have messed it up. Sadly only one of the two is fixable.
- Your display is displaying 8888
Do not worry this is the problem that is fixable, just follow these steps
1. Locate in the code " sevseg.begin(COMMON_CATHODE, numDigits, digitPins, segmentPins); "
2. Change "COMMON CATHODE" to "COMMON ANODE"
3. Upload the code again
- Your display is displaying 3. 41 or .141 or 3.1 1 or 3.14 without the other 1
Sadly, this problem can either be fixable or not :.(... (thats my crying face)
1. Check your connections and make sure everything IS plugged in and not hanging out
2. Check the schematic again, because you most likely plugged it in wrong
3. Locate the line in void loop where it says to display (3.141, 3) and change 3.141 to 8888 and see if one of the 8 are missing
4. If so one of the wires might have not had a resistor when it should have had one meaning that one of the digits had burned out. You can check this by looking at the back of the display. If you see any black near one of the pins you did overpower one of the digit places. Sadly this IS NOT fixable and you would want to buy another display.
5. If you do not see a black mark anywhere than you switched up wires that can't get overpowered so check the schematic and plug then in correctly and change the code back from 8888 to 3.141.
Step 7: Going Further
One method of using a few pins on the arduino to control multiple LEDs that would otherwise require alot of pin is a tri-state 8 pin shift-register. So instead of directly connecting the 8 segment pins to arduino you can plug them into the shift register and figure out how to do that.
It is just an idea that I came up with but I do not know how to do or if it is even possible with the arduino and the display's library, but hey, food for thought for the curious.
Have fun with your display and i hope you liked this instructable because it is the first that i have actually finished out of the many i have in my drafts.
85 Comments
Question 1 year ago
I have an error this is the error code : Arduino: 1.8.19 (Windows Store 1.8.57.0) (Windows 10), Board: "Arduino Uno"
sketch_jan02a:1:10: fatal error: SevSeg.h: No such file or directory
#include "SevSeg.h"
^~~~~~~~~~
compilation terminated.
exit status 1
SevSeg.h: No such file or directory
This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.
Answer 1 year ago
Check your installation. Do you have the last version ?
Might be that you did not select the right bootloader.
Reply 1 year ago
You can also make sure you have the right library !
Question 2 years ago
I am getting this error
no matching function for call to 'SevSeg::SevSeg()'
Answer 1 year ago
I am getting the same error
maybe the 4 digit 7 segment display value is wrong like the code here is given for ATA8041AB. but i am using SH5461AS.
1 year ago
Hi I using 7 segment 4 digit with load cell and hx711 how i can make it (weight values) show on 7 segment without blinking...it's keep blinking and i can not read the values on display
my code right now is 👇🏻
#include "HX711.h"
#include "SevSeg.h"
#define calibration_factor -1115000
#define DOUT PA0
#define CLK PA12
int sensorValues = 0;
SevSeg sevseg;
HX711 scale(DOUT, CLK);
void setup() {
pinMode(PA1,OUTPUT); pinMode(PA2,OUTPUT); pinMode(PA3,OUTPUT); pinMode(PA4,OUTPUT);
pinMode(PA5,OUTPUT); pinMode(PA6,OUTPUT); pinMode(PA7,OUTPUT); pinMode(PA8,OUTPUT);
pinMode(PB0,OUTPUT); pinMode(PB1,OUTPUT); pinMode(PB5,OUTPUT); pinMode(PB6,OUTPUT);
Serial.begin(9600);
Serial.println("ArduinoAll Calibrating...");
scale.set_scale(calibration_factor); // ปรับค่า calibration factor
scale.tare();
Serial.println("OK Start :");
byte numDigits = 4;
byte digitPins[] = {PB0,PB1,PB5,PB6};
byte segmentPins[] = {PA1, PA2, PA3, PA4, PA5, PA6, PA7, PA8};
boolean resistorsOnSegments = true;
boolean updateWithDelaysIn = true;
boolean leadingZeros = true;
byte hardwareConfig = COMMON_CATHODE;
sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments,updateWithDelaysIn,leadingZeros);
sevseg.setBrightness(90);
}
void loop() {
Serial.print("Reading: ");
Serial.print(scale.get_units(), 3); //
Serial.println(" kg");
sevseg.setNumber(scale.get_units(), 3);
sevseg.refreshDisplay();
}
3 years ago
Do NOT follow this tutorial. There should be one resistor per LED in one segment (as you will be multiplexing) so 8 resistors in total. The way this guy has done it is totally wrong.
Reply 3 years ago
Convince me why a resistor per segment is better than a resistor per digit and I will edit. The instructions so far work and don’t burn out any LEDs so perhaps your solution will save some power?? I think both solutions accomplish the same thing because the internal wiring in the segment (a multiplexing setup) has all of the connections between connected LEDs in series so it shouldn’t matter where you put the resistors, as long as every LED has one in either of its respective series’ (the series where all of the X-segments are connected or the series where all of the segments in the Y-digit are connected). I opted for putting resistor on the digit pins because it would require less resistors (I.e less $, less work, more organized breadboard). The only evidence I’m getting to put them on the segments is “multiplexing” and “this guy has done it totally wrong.” Expand and let’s see if we could get to the bottom of which one is better...
Reply 3 years ago
Actually, you are both wrong; about different things.
TheArduinoGuy:
The library, takes into account whether the use will put resistors in
the segment or digits; based on a paramter called 'resistorsOnSegments'
As is, the library turns on a single segment but all affected digits.
depending on the refresh rate, the display would look terrible.
chickeneater:
The sketch you published is missing 'resistorsOnSegments' parameter, and others.
sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins,
resistorsOnSegments, updateWithDelays, leadingZeros, disableDecPoint);
The code happens to work, because the compiler /defaults/ that parameter to 0.
This POOR practice, and in some compilers this would appear as an ERROR/WARNING.
TheArduinoGuy & chickeneater:
If the library had defaulted to 'resistorsOnSegments =1' then resistors should
have beem used. They are necessary to limit (and balance) the current to each
digit segment.
Reply 3 years ago
Hey nice catch! I just went through the library and in the definition for the begin() function I see the parameter "bool resOnSegmentsIn=0" you were talking about.
I'm glad you found this, and further along in the library it is clear that this parameter affects how the display updates its value and if assigned a value inconsistent with the electrical schematic used, then some LEDs would be powered unequally and some would perhaps completely burn out. However, I'm not sure how this would throw an Error if the parameter has been assigned to a default parameter of 0 though? The whole point of default parameters is that the compiler won't throw an Error if a parameter is not assigned a value when the function is called.
In any case, I will update the code and add a comment to indicate to users that if they want to deviate from the schematic and use 8 resistors on the 8 segment pins they would have to change the code.
Thanks you both for starting and finishing this inquiry.
Reply 3 years ago
> I see the parameter "bool resOnSegmentsIn=0" you were talking about.
I missed that in the *.h file, so I didn't realize it had a default.
Reply 3 years ago
Actually, you are both wrong; about different things.
TheArduinoGuy:
The library, takes into account whether the use will put resistors in
the segment or digits; based on a paramter called 'resistorsOnSegments'
As is, the library turns on a single segment but all affected digits.
depending on the refresh rate, the display would look terrible.
chickeneater:
The sketch you published is missing 'resistorsOnSegments' parameter, and others.
sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins,
resistorsOnSegments, updateWithDelays, leadingZeros, disableDecPoint);
The code happens to work, because the compiler /defaults/ that parameter to 0.
This POOR practice, and in some compilers this would appear as an ERROR/WARNING.
TheArduinoGuy & chickeneater:
If the library had defaulted to 'resistorsOnSegments =1' then resistors should
have beem used. They are necessary to limit (and balance) the current to each
digit segment.
3 years ago on Step 3
You should get a shift register chip to reduce the amount digital pins that you use.
3 years ago
VERY VERY THANK YOU
4 years ago
Thanks! It works well. I had the 11 and 12 wires switched the wrong way (I accidentally overlooked your warning ;) ) but after switching the two numbers in the code, it works.
Question 4 years ago on Step 2
What if i want to make it into a clock? i have an RTC module
4 years ago
Thanks! It Works!!!!!!!
Question 4 years ago on Step 7
HI, I am mega new to this but have tried adapting the code for my 3digit display. I have got it working bar 1 issue! Digit 1 always displays segment a. any ideas also is there any way I can edit the library???? really interested in its layout and learning to make adaptions. cheers
Question 5 years ago on Introduction
(Sorry for the long post)
Hi. I know this is 3 years after but, does anyone have a fix for this?
Arduino: 1.8.4 (Windows 10), Board: "Arduino/Genuino Uno"
C:\Users\(myName)\AppData\Local\Temp\cc6Op89S.ltrans0.ltrans.o: In function `setup':
C:\Users\(myName)\Documents\Arduino\Seven_Segment_four_digit_displayer/Seven_Segment_four_digit_displayer.ino:9: undefined reference to `SevSeg::begin(unsigned char, unsigned char, unsigned char*, unsigned char*, bool, bool, bool)'
C:\Users\(myName)\Documents\Arduino\Seven_Segment_four_digit_displayer/Seven_Segment_four_digit_displayer.ino:10: undefined reference to `SevSeg::setBrightness(int)'
C:\Users\(myName)\AppData\Local\Temp\cc6Op89S.ltrans0.ltrans.o: In function `loop':
C:\Users\(myName)\Documents\Arduino\Seven_Segment_four_digit_displayer/Seven_Segment_four_digit_displayer.ino:14: undefined reference to `SevSeg::setNumber(int, char, bool)'
C:\Users\(myName)\Documents\Arduino\Seven_Segment_four_digit_displayer/Seven_Segment_four_digit_displayer.ino:15: undefined reference to `SevSeg::refreshDisplay()'
C:\Users\(myName)\AppData\Local\Temp\cc6Op89S.ltrans0.ltrans.o: In function `_GLOBAL__sub_I_sevseg':
C:\Users\(myName)\Documents\Arduino\Seven_Segment_four_digit_displayer/Seven_Segment_four_digit_displayer.ino:3: undefined reference to `SevSeg::SevSeg()'
collect2.exe: error: ld returned 1 exit status
exit status 1
Fehler beim Kompilieren für das Board Arduino/Genuino Uno. (Error Whilst compiling for the Arduino/Genuino Uno)
I even tried this for the library error(I had a library error):
(I know the file name's weird but I had to give it a name for the checking and uploading).
Question 5 years ago
to make a regressive counter from the number shown on the display, how could it be?