7-Segment LED nummer display
Dit is een voorbereidend project waarin we een Seven-segment LED display gaan aansluiten. Ik heb gemerkt dat er (minimaal) 2 typen zijn. Het vereist dus even wat denk en probeer werk om je display werkende te krijgen.
Eerst even de basis. De 7 segment display, bestaat uit 7 segmenten (eigenlijk 8 segmenten). Links 2 vertikale segmenten, in het midden 3 horizontale segmenten en rechts weer 2 vertikale segmenten. Hiernaast nog een puntje (digital point) segmenten, maar die laten we nu even buiten beschouwing.
Alle 7 segmenten kunnen we los aan/uit zetten. Het zijn allemaal losse LED's. Als we alle segmenten (LED's) aanzetten, dan staat er een 8. Als we alles aanzetten, maar de onderste vertikale links uit laten, dan staat er een 9. Als we enkel de beide 2 rechtser aanzetten, dan staat er een 1. Enzovoort.
In de rij hierboven zie je alle nummers staan. Lijkt het onoverzichtelijk. Doe je ogen bijna dicht en kijk door je oogspleten. Dan zie je de nummers duidelijker.
In de code hieronder heb ik per nummer een eigen functie geschreven. Deze functie zet de LED's voor dat nummer aan. Om het cijfer vier te tonen, moeten beide vertikale rechter LED's aan (B en C). De middelste horizontale LED (G) en de linker vertikale LED (F). We moeten dus B, C, G en F aanzetten. Dat doen we dus in de functie display4.
void display4(void) {
    digitalWrite(b,HIGH);
    digitalWrite(c,HIGH);
    digitalWrite(f,HIGH);
    digitalWrite(g,HIGH);
}
Voor de andere nummers heb ik ook zo een functie geschreven. Omdat we allerlei LED's aanzetten is er ook een algemene functie die alles uitzet.
turnAllOff
. In deze functie zetten we alle LED's iedere keer uit. Ook dus degene die al uit waren. Dat kan natuurlijk geen kwaad.
Aansluitschema
Belangrijk bij het aansluiten van de 7-segment LED is een eenduidig aansluitschema. Er zitten 5 pin aan de bovenkant en 5 aan de onderkant met een in de literatuur gebruikte nummering die onlogisch lijkt. Natuurlijk kun je ze aansluiten zoals je wilt, dan moet je echter wel een eigen mapping gaan doen, zie hiervoor project 7. Ik wil dat echter niet aanraden en adviseer om deze methode te gebruiken.
Die laatste DP, ook wel H genoemd, is voor de decimale punt. Indien je deze niet nodig hebt dan hoef je die ook niet aan te sluiten.
En de middelste pin boven of onder moet naar de GND.
Breadboard
Source code
/*
   7-segment LED counting
   (C) copyright www.punthooft.nl 2019-2025
*/
const int A = 5;
const int B = 4;
const int C = 3;
const int D = 9;
const int E = 8;
const int F = 6;
const int G = 7;
int delayTime=500;
void setup() {
    int i;
    for(i=3;i<=9;i++) {
      pinMode(i,OUTPUT);
    }
}
void loop() {
     turnAllOff();
     display0();
     delay(delayTime);
     turnAllOff();
     display1();
     delay(delayTime);
     turnAllOff();
     display2();
     delay(delayTime);
     turnAllOff();
     display3();
     delay(delayTime);
     turnAllOff();
     display4();
     delay(delayTime);
     turnAllOff();
     display5();
     delay(delayTime);
     turnAllOff();
     display6();
     delay(delayTime);
     turnAllOff();
     display7();
     delay(delayTime);
     turnAllOff();
     display8();
     delay(delayTime);
     turnAllOff();
     display9();
     delay(delayTime);
}
void turnAllOff(void) {
    digitalWrite(A,LOW);
    digitalWrite(B,LOW);
    digitalWrite(C,LOW);
    digitalWrite(D,LOW);
    digitalWrite(E,LOW);
    digitalWrite(F,LOW);
    digitalWrite(G,LOW);
}
void display1(void) {
    digitalWrite(B,HIGH);
    digitalWrite(C,HIGH);
}
void display2(void) {
    digitalWrite(A,HIGH);
    digitalWrite(B,HIGH);
    digitalWrite(D,HIGH);
    digitalWrite(E,HIGH);
    digitalWrite(G,HIGH);
}
void display3(void) {
    digitalWrite(A,HIGH);
    digitalWrite(B,HIGH);
    digitalWrite(C,HIGH);
    digitalWrite(D,HIGH);
    digitalWrite(G,HIGH);
}
void display4(void) {
    digitalWrite(B,HIGH);
    digitalWrite(C,HIGH);
    digitalWrite(F,HIGH);
    digitalWrite(G,HIGH);
}
void display5(void) {
    digitalWrite(A,HIGH);
    digitalWrite(C,HIGH);
    digitalWrite(D,HIGH);
    digitalWrite(F,HIGH);
    digitalWrite(G,HIGH);
}
void display6(void) {
    digitalWrite(A,HIGH);
    digitalWrite(C,HIGH);
    digitalWrite(D,HIGH);
    digitalWrite(E,HIGH);
    digitalWrite(F,HIGH);
    digitalWrite(G,HIGH);
}
void display7(void) {
    digitalWrite(A,HIGH);
    digitalWrite(B,HIGH);
    digitalWrite(C,HIGH);
}
void display8(void) {
    digitalWrite(A,HIGH);
    digitalWrite(B,HIGH);
    digitalWrite(C,HIGH);
    digitalWrite(D,HIGH);
    digitalWrite(E,HIGH);
    digitalWrite(F,HIGH);
    digitalWrite(G,HIGH);
}
void display9(void) {
    digitalWrite(A,HIGH);
    digitalWrite(B,HIGH);
    digitalWrite(C,HIGH);
    digitalWrite(D,HIGH);
    digitalWrite(F,HIGH);
    digitalWrite(G,HIGH);
}
void display0(void) {
    digitalWrite(A,HIGH);
    digitalWrite(B,HIGH);
    digitalWrite(C,HIGH);
    digitalWrite(D,HIGH);
    digitalWrite(E,HIGH);
    digitalWrite(F,HIGH);
}
Opmerkingen
Voor een rode LED van 1,8V is een weerstandswaarde vanaf 160 Ohm nodig, ik gebruik de meer gangbare van 220 Ohm
Als er een LED het niet doet, dan is er iets mis met de aansluiting van die LED (de draadjes) of hierboven in de code staat een fout. Als alle LEDs geen van allen iets doen, dan heb je waarschijnlijk een ander type 7-segment LED en moet je even zoeken naar het aansluitschema daarvan.
Source code
Ik wil toch nog even naar deze code kijken. Bovenstaande code werkt gewoon, omdat die het goed uitlegd. Onderstaande code is kleiner, gemakkelijker te onderhouden en daardoor beter.
We gebruiken hierin 2 arrays. Dat zijn lijsten met nummers. De eerste is de lijst van welke LED's we moeten aandoen als we later naar een nummer verwijzen. Deze hebben we al eerder gezien in het vorig project. Het is een lijst met de pin nummers. Hiermee weten we welke pin we op HIGH moeten zetten om die LED te laten branden. De LED-A is nu LED[0] geworden op pin 5. Bij arrays begin je altijd bij 0 te tellen. LED[0] is dus het eerste element in de array.
De andere array is complexer. Het is een 2-dimensionale array. Of eigenlijk een array in een array. Je kunt dit vergelijken met een boekje (de array) met op iedere pagina een lijstje. Een lijstje met je favoriete voetbalclub (Feyenoord natuurlijk), favoriet gerecht, favoriete drank etc.
Iedere lijstje in de array (pagina in het boek) bevat een lijstje met hierin welke segmenten er allemaal moeten gaan branden om een nummer te maken.
Hierboven hadden we gezien dat om het getal 4 te maken, we moeten laten branden:
In de code zetten we in iedere loop eerst weer alles uit. Dan zetten we het huidig nummer aan. Wachten even. We gebruiken een teller
current
, om eenvoudig te tellen van 0 tot en met 9, en dan opnieuw.
Je ziet in de subarray (digits) dat het aantal segmenten dat er per nummer moet worden aangestoken verschillend is. Voor het nummer een hoeven er maar 2 segmenten te branden (1 en 2) en voor het nummer 8 alle segmenten. We moeten echter wel door de array kunnen lopen. Er is geen functie in de arduino versie van deze taal, die aangeeft hoeveel elementen er in een array zitten. We moeten dat zelf regelen. Dat doe ik door in iedere lijst (pagina) een
-1
als laatste op te nemen. We gaan dus iedere lijst aflopen en alle segmenten aanzetten, totdat we bij de -1 komen, dan zijn we klaar.
Deze manier van array gebruiken is 40 tot 50 jaar heel veel gebruikt. Tegenwoordig nog maar amper.
/*
   7-segment LED counting
   (C) copyright www.punthooft.nl 2019-2025
*/
const int LED[] = {5, 4, 3, 9, 8, 6, 7};
const int delayTime = 1000;
const int digits[10][10] = {
    { 0,1,2,3,4,5,-1 },       // 0
    { 1,2,-1 },               // 1
    { 0,1,3,4,6,-1 },
    { 0,1,2,3,6,-1 },
    { 1,2,5,6,-1 },
    { 0,2,3,5,6,-1 },
    { 0,2,3,4,5,6,-1 },
    { 0,1,2,-1 },
    { 0,1,2,3,4,5,6,-1 },     // 8
    { 0,1,2,3,5,6,-1 }        // 9
};
int current = 0;
void setup() {
    for(int i=0;i<7;i++) {
      pinMode(LED[i],OUTPUT);
    }
}
void loop() {
  turnAllOff();
  display(current);
  delay(delayTime);
  current++;
  if (current > 9) {
    current = 0;
  }
}
void turnAllOff(void) {
    for(int i=0;i<7;i++) {
        digitalWrite(LED[i],LOW);
    }
}
void display(int number) {
  int i = 0;
  while (digits[number][i] != -1) {
    digitalWrite(LED[ digits[number][i] ],HIGH);
    i++;
  }
}