How Seven Segment Display Works & Interface it with Arduino
Hoe vaak heb je een film gezien waarin iemand een bom moet deactiveren? De held kijkt naar het scherm terwijl de tijd voorbij tikt, elke seconde kostbaarder dan de vorige. Nou, als het je opvalt, al die bommen in films hebben zeven-segment displays. Dat moet wel! Hoe kan een held anders weten hoeveel tijd hij nog heeft?
Misschien zijn zeven-segment displays niet modern genoeg voor u, maar ze zijn de meest praktische manier om getallen weer te geven. Ze zijn gemakkelijk te gebruiken, kosteneffectief en zeer goed leesbaar, zowel bij weinig licht als bij fel zonlicht.
Een voorbeeld uit de echte wereld waarin zeven-segmenten displays worden gebruikt, is de beroemde aftelklok op Cape Canaveral, Florida, die de NASA gebruikte voor de Apollo-landing.
Hardware-overzicht
Laten we kort de kenmerken en functionaliteit van het 7-segment display bespreken voordat we het op een Arduino aansluiten.
De 7-segment displays zijn eigenlijk gewoon zeven LED’s die in een bepaald patroon zijn opgesteld. In dit geval, de nummer ‘8’ vorm die we allemaal kennen. Elk van de zeven LED’s wordt een segment genoemd omdat het segment, wanneer verlicht, een deel vormt van een numeriek cijfer (zowel Decimaal als Hex) dat moet worden weergegeven. Een extra 8e LED wordt soms gebruikt voor de aanduiding van een decimaalteken.
Elke van de zeven LED’s in het display krijgt een positioneel segment waarbij een van de aansluitpinnen recht uit het rechthoekige plastic pakket wordt gebracht. Deze individuele LED-pennen zijn gelabeld van a tot en met g, wat staat voor elke individuele LED. De andere LED pinnen zijn met elkaar verbonden en vormen een gemeenschappelijke pin.
Om een bepaald deel van het display aan en uit te zetten, zet je de betreffende pin HOOG of LAAG, net zoals je met een gewone LED zou doen. Zodat sommige segmenten licht worden en andere donker, zodat het gewenste karakterpatroon van het getal op het display kan worden gegenereerd. Dit stelt ons in staat om de tien decimale cijfers 0 tot en met 9 op hetzelfde 7-segment display weer te geven.
7 Segment Display Pinout
Nu gaan we het hebben over de segment configuratie zodat we weten welke pinnen welke segmenten oplichten. De pinout voor het 7-segment display is als volgt.
a-g & DP Van de 10, de 8 pinnen i.D.w.z. a, b, c, d, e, f, g en DP segment (decimaalpunt) zijn verbonden met digitale pinnen van Arduino. Door elke LED op het aangesloten segment aan te sturen, kunnen getallen worden weergegeven.
COM De pinnen 3 en 8 zijn intern verbonden om een gemeenschappelijke pin te vormen. Deze pin moet worden verbonden met GND (gemeenschappelijke kathode) of 5V (gemeenschappelijke anode), afhankelijk van het type display.
Common Cathode(CC) Vs Common Anode(CA)
Zeven segment displays zijn er in twee types: Common Cathode (CC) en Common Anode (CA).De interne structuur van beide typen is nagenoeg gelijk. Het verschil is de polariteit van de LED’s en de gemeenschappelijke terminal. Zoals hun naam al doet vermoeden, heeft de gemeenschappelijke kathode alle kathodes van de LED’s in een 7-segment met elkaar verbonden en de gemeenschappelijke anode heeft alle anodes van de LED’s in een 7-segment met elkaar verbonden.
In de gemeenschappelijke kathode display, alle kathode aansluitingen van de LED-segmenten zijn samen verbonden met ‘logic 0’ / GND. De afzonderlijke segmenten worden dan verlicht door het toepassen van een HIGH / ‘logic 1’ signaal op de afzonderlijke Anode aansluitingen (a-g).
In de gemeenschappelijke anode display, zijn alle anode-aansluitingen van de LED-segmenten samengevoegd tot logische “1”. De afzonderlijke segmenten worden verlicht door een massa-, logische “0”- of “LOW”-signaal toe te passen op de kathode van het desbetreffende segment (a-g).
In het algemeen, zijn common anode-displays (die we in onderstaande experimenten hebben gebruikt) populairder, omdat veel logische circuits meer stroom kunnen afgeven dan ze kunnen afgeven.
Ook moet worden opgemerkt dat een kathode display geen directe vervanging in een schakeling is voor een anode display en omgekeerd, omdat het hetzelfde is als de LED’s omgekeerd aansluiten, en er dus geen lichtemissie zal plaatsvinden.
Hoe werkt een 7 Segment Display?
Afhankelijk van het decimaal getal dat moet worden weergegeven, wordt de betreffende set LED’s verlicht. Om bijvoorbeeld het cijfer 4 weer te geven, moeten we vier van de LED-segmenten laten oplichten die overeenkomen met b, c, f en g. Zo kunnen de verschillende cijfers van ‘0 tot en met 9’ en de tekens van ‘A tot en met F’ worden weergegeven met behulp van een 7-segmentendisplay zoals afgebeeld.
Onderstaande waarheidstabel toont de afzonderlijke segmenten die moeten worden verlicht om cijfers en tekens weer te geven. Merk op dat de waarheidstabel voor een 7-segments display met gemeenschappelijke anode precies het tegenovergestelde is van die voor een 7-segments display met gemeenschappelijke kathode.
Bedrading – Aansluiten 7 Segment Display op Arduino UNO
Nu we begrijpen hoe het 7-segment display werkt, kunnen we beginnen het aan te sluiten op de Arduino!
Start met het plaatsen van het 7-segment display op je breadboard, waarbij je ervoor zorgt dat elke kant van het display aan een aparte kant van het breadboard zit. Met de decimale punt naar beneden zijn de pinnen 1-5 aan de onderkant van links naar rechts en 10-6 aan de bovenkant van links naar rechts, zoals te zien is in de illustratie hieronder.
Om te beginnen sluiten we een van de gemeenschappelijke pinnen 3 of 8 aan op de 5V-pin op de Arduino (als u een 7-segment display met gemeenschappelijke anode gebruikt) of op de GND-pin op de Arduino (als u een 7-segment display met gemeenschappelijke kathode gebruikt). De overige 4 pinnen op de bovenste positie zijn verbonden met digitale pin 2 tot digitale pin 5. De andere 4 pinnen op de onderste positie met decimaalteken zijn verbonden met digitale pin 6 tot 9.
Hoewel het display zonder stroombegrenzende weerstanden kan werken, is het altijd een goed idee om ze in je circuit te hebben om te voorkomen dat je display doorbrandt.
Typisch voor een standaard rood gekleurd 7-segment display, kan elk LED segment ongeveer 15 mA trekken om correct te branden, dus op een 5 volt digitale logische schakeling, zou de waarde van de stroom begrenzende weerstand ongeveer 200Ω (5v – 2v)/15mA zijn, of 220Ω om de dichtstbijzijnde hogere voorkeurswaarde.
Als je klaar bent, zou je iets moeten hebben dat lijkt op de illustratie die hieronder wordt getoond.
Arduino Code
Nu, is het tijd om het display te verlichten met wat code.
Voordat je kunt beginnen met het schrijven van code om de 7-segment displays aan te sturen, moet je eerst de SevSeg Arduino Library downloaden. U kunt dat doen door de GitHub repo te bezoeken en de bibliotheek handmatig te downloaden of, klik op deze knop om de zip te downloaden:
Om het te installeren, open de Arduino IDE, ga naar Sketch > Include Library > Add .ZIP Library, en selecteer dan het SevSeg ZIP-bestand dat u zojuist hebt gedownload. Als u meer details wilt over het installeren van een bibliotheek, bezoek dan deze Arduino-bibliotheek installeren tutorial.
Als u de bibliotheek eenmaal hebt geïnstalleerd, kunt u deze sketch kopiëren in de Arduino IDE. De volgende test schets telt op van 0 tot 9. Probeer de sketch uit; daarna zullen we hem in detail uitleggen.
#include "SevSeg.h"SevSeg sevseg;void setup(){//Set to 1 for single digit displaybyte numDigits = 1;//defines common pins while using multi-digit display. Left empty as we have a single digit displaybyte digitPins = {};//Defines arduino pin connections in order: A, B, C, D, E, F, G, DPbyte segmentPins = {3, 2, 8, 7, 6, 4, 5, 9};bool resistorsOnSegments = true;//Initialize sevseg object. Uncomment second line if you use common cathode 7 segmentsevseg.begin(COMMON_ANODE, numDigits, digitPins, segmentPins, resistorsOnSegments);//sevseg.begin(COMMON_CATHODE, numDigits, digitPins, segmentPins, resistorsOnSegments);sevseg.setBrightness(90);}void loop(){ //Display numbers one by one with 2 seconds delay for(int i = 0; i < 10; i++) { sevseg.setNumber(i); sevseg.refreshDisplay(); delay(2000); }}
Code Uitleg:
De sketch begint met het opnemen van de SevSeg bibliotheek die de controls en signalen naar het 7-segment vereenvoudigt. Vervolgens moeten we een SevSeg-object maken dat we vervolgens in de hele sketch kunnen gebruiken.
#include "SevSeg.h"SevSeg myDisplay;
Ten slotte moeten we opgeven hoeveel cijfers het display heeft. Aangezien we een enkelcijferig display gebruiken, stellen we dit in op 1. Als u een 4-cijferig display gebruikt, stelt u dit in op 4.
//Set to 1 for single digit displaybyte numDigits = 1;
De digitPins array definieert eenvoudig de ‘gemeenschappelijke pinnen’ bij gebruik van een meercijferig display. Laat het leeg als u een enkelcijferig display gebruikt. Geef anders de arduino pinnummers op waarmee de ‘common pins’ van de individuele cijfers zijn verbonden. Rangschik ze van links naar rechts.
//defines common pins while using multi-digit display//Left empty as we have a single digit displaybyte digitPins = {};
De tweede array die we geïnitialiseerd zien worden is de segmentPins array. Dit is een array van alle Arduino pin nummers die verbonden zijn met pinnen op het LED display die de segmenten aansturen; dus in dit geval zijn dit degenen die we direct vanaf het breadboard op de Arduino hebben aangesloten. Deze moeten ook in de juiste volgorde worden gezet, omdat de bibliotheek ervan uitgaat dat de pinnen in de volgende volgorde staan: A, B, C, D, E, F, G, DP.
//Defines arduino pin connections in order: A, B, C, D, E, F, G, DPbyte segmentPins = {3, 2, 8, 7, 6, 4, 5, 9};
Na het aanmaken van deze variabelen geven we ze vervolgens door aan de SevSeg constructor met behulp van begin()
functie.
//Initialize sevseg objectsevseg.begin(COMMON_ANODE, numDigits, digitPins, segmentPins, resistorsOnSegments);
In de sectie ‘lus’: Het programma begint van 0 tot 9 op te tellen met behulp van de ‘for’-lus en de variabele ‘i’. Elke keer wordt de SevSeg bibliotheekfunctie setNumber()
gebruikt, samen met refreshDisplay ()
om het getal op het display te zetten.
Dan is er een seconde vertraging voordat ‘i’ wordt opgehoogd en het volgende getal wordt weergegeven.
for(int i = 0; i < 10; i++){ sevseg.setNumber(i); sevseg.refreshDisplay(); delay(1000);}
Arduino-project
Dobbelen
Als aanvulling is hier een ander project, waarmee mensen die toegankelijkheidstechnologie nodig hebben, kunnen “dobbelen”. Je kunt het gebruiken om spelletjes te spelen zoals Yahtzee, ludo etc. Het maakt gebruik van dezelfde Arduino setup, behalve dat we een tactiele schakelaar gebruiken om snel te kunnen rollen.
Het hele punt van een dobbelsteen is om een manier te bieden om willekeurig tot een getal van 1 tot 6 te komen. En de beste manier om een willekeurig getal te krijgen is om de ingebouwde functie random(min,max) te gebruiken. Deze neemt twee parameters, de eerste specificeert de ondergrens van de willekeurige waarde (inclusief dit getal) en de tweede parameter specificeert de bovengrens van de willekeurige waarde (exclusief dit getal). Dit betekent dat een willekeurig getal wordt gegenereerd tussen min en max-1
#include "SevSeg.h"SevSeg sevseg; const int buttonPin = 10; // the number of the pushbutton pin// variables will change:int buttonState = 0; // variable for reading the pushbutton statusvoid setup(){ byte numDigits = 1; byte digitPins = {}; byte segmentPins = {3, 2, 8, 7, 6, 4, 5, 9}; bool resistorsOnSegments = true; sevseg.begin(COMMON_ANODE, numDigits, digitPins, segmentPins, resistorsOnSegments); sevseg.setBrightness(90);// initialize the pushbutton pin as an input:pinMode(buttonPin, INPUT);}void loop(){// read the state of the pushbutton value:buttonState = digitalRead(buttonPin); if (buttonState == HIGH) {sevseg.setNumber(random(1,7));sevseg.refreshDisplay(); }}