4.2 Een 4-digit 7-segment display aansturen met ESP32
-
Als alles goed ging, is het gelukt om de 7-segment display aan te sturen met behulp van de CD4511. Je kan nu een getal in binaire vorm omzetten naar een getal in decimale vorm dat weergegeven wordt op de display.
-
Aangezien onze DIP switch vier schakelaars heeft, kunnen we hiermee hoogstens het getal 11112 (= 1510) maken.
-
Om dit decimale getal van twee cijfers weer te geven volstaat een single digit 7-segment display uiteraard niet.
-
Gelukkig zit er in het pakket ook een 4-digit 7-segment display. Hierin heeft elk digit heeft een aparte CC (Common Cathode) en kan dus afzonderlijk aan- of uitgezet worden. Verder staan de digits eigenlijk in parallel (alle segmenten a zijn met elkaar doorverbonden, enz.).

4-Digit 7-Segment Display Schema
-
Het gebruik van een afzonderlijke BCD-naar-7-segment decoder (zoals de 74HC4511) had als voordeel dat we slechts 4 inputs moesten aanleggen (het getal in binaire notatie) om 7 segmenten aan te sturen.
-
Er zijn echter ook nadelen: er is (uiteraard) een aparte IC nodig.
-
We kunnen ook niets veranderen aan de wijze waarop de decodering gebeurt in het IC. Is het je bv. opgevallen dat bij weergave van het cijfer 6 het bovenste segmentje niet oplichtte? Bovendien, alle combinaties boven de 9 resulteerden in een blank display, terwijl we hier misschien liever de hexadecimale codes A t.e.m. F hadden gezien.
-
In dit deel van dit labo gaan we het 4-digit display rechtstreeks aansturen vanuit de ESP32, dus zonder gebruik te maken van een externe decoder. We moeten dan zelf een decoder bouwen in software, maar dan kunnen we deze ook geheel naar onze hand zetten.
Opdracht 4.2a - Een getal weergeven op meerdere displays
-
Plaats het 4-digit 7-segment display op je breadboard.
-
Verbind de CC van de twee rechtse digits (zie “4-Digit 7-Segment Display Schema” - digit3 en digit4) elk via een stroombegrenzingsweerstand van 220 Ω met de ground.
-
Verbind de segmenten van de 7-segment display met de juiste poorten van de ESP32. Baseer je hiervoor op onderstaande code.
-
Kijk of je de code kan aanpassen zodat het bovenste segment bij cijfer zes nu wel of niet oplicht.
-
Pas de code aan zodat letter A, b,C, d, E en F ook nog afgespeeld worden in de loop.
#define segA 12 // connecting segment A to PIN12
#define segB 13 // connecting segment B to PIN13
#define segC 15 // connecting segment C to PIN15
#define segD 2 // connecting segment D to PIN2
#define segE 17 // connecting segment E to PIN17
#define segF 22 // connecting segment F to PIN22
#define segG 21 // connecting segment G to PIN21
int COUNT = 0; // count integer for 0-9 increment
void setup()
{
pinMode(segA, OUTPUT);// taking all pins as output
pinMode(segB, OUTPUT);// taking all pins as output
pinMode(segC, OUTPUT);// taking all pins as output
pinMode(segD, OUTPUT);// taking all pins as output
pinMode(segE, OUTPUT);// taking all pins as output
pinMode(segF, OUTPUT);// taking all pins as output
pinMode(segG, OUTPUT);// taking all pins as output
}
void loop()
{
switch (COUNT)
{
case 0://when count value is zero show ”0” on disp
digitalWrite(segA, HIGH);
digitalWrite(segB, HIGH);
digitalWrite(segC, HIGH);
digitalWrite(segD, HIGH);
digitalWrite(segE, HIGH);
digitalWrite(segF, HIGH);
digitalWrite(segG, LOW);
break;
case 1:// when count value is 1 show ”1” on disp
digitalWrite(segA, LOW);
digitalWrite(segB, HIGH);
digitalWrite(segC, HIGH);
digitalWrite(segD, LOW);
digitalWrite(segE, LOW);
digitalWrite(segF, LOW);
digitalWrite(segG, LOW);
break;
case 2:// when count value is 2 show ”2” on disp
digitalWrite(segA, HIGH);
digitalWrite(segB, HIGH);
digitalWrite(segC, LOW);
digitalWrite(segD, HIGH);
digitalWrite(segE, HIGH);
digitalWrite(segF, LOW);
digitalWrite(segG, HIGH);
break;
case 3:// when count value is 3 show ”3” on disp
digitalWrite(segA, HIGH);
digitalWrite(segB, HIGH);
digitalWrite(segC, HIGH);
digitalWrite(segD, HIGH);
digitalWrite(segE, LOW);
digitalWrite(segF, LOW);
digitalWrite(segG, HIGH);
break;
case 4:// when count value is 4 show ”4” on disp
digitalWrite(segA, LOW);
digitalWrite(segB, HIGH);
digitalWrite(segC, HIGH);
digitalWrite(segD, LOW);
digitalWrite(segE, LOW);
digitalWrite(segF, HIGH);
digitalWrite(segG, HIGH);
break;
case 5:// when count value is 5 show ”5” on disp
digitalWrite(segA, HIGH);
digitalWrite(segB, LOW);
digitalWrite(segC, HIGH);
digitalWrite(segD, HIGH);
digitalWrite(segE, LOW);
digitalWrite(segF, HIGH);
digitalWrite(segG, HIGH);
break;
case 6:// when count value is 6 show ”6” on disp
digitalWrite(segA, LOW);
digitalWrite(segB, LOW);
digitalWrite(segC, HIGH);
digitalWrite(segD, HIGH);
digitalWrite(segE, HIGH);
digitalWrite(segF, HIGH);
digitalWrite(segG, HIGH);
break;
case 7:// when count value is 7 show ”7” on disp
digitalWrite(segA, HIGH);
digitalWrite(segB, HIGH);
digitalWrite(segC, HIGH);
digitalWrite(segD, LOW);
digitalWrite(segE, LOW);
digitalWrite(segF, LOW);
digitalWrite(segG, LOW);
break;
case 8:// when count value is 8 show ”8” on disp
digitalWrite(segA, HIGH);
digitalWrite(segB, HIGH);
digitalWrite(segC, HIGH);
digitalWrite(segD, HIGH);
digitalWrite(segE, HIGH);
digitalWrite(segF, HIGH);
digitalWrite(segG, HIGH);
break;
case 9:// when count value is 9 show ”9” on disp
digitalWrite(segA, HIGH);
digitalWrite(segB, HIGH);
digitalWrite(segC, HIGH);
digitalWrite(segD, HIGH);
digitalWrite(segE, LOW);
digitalWrite(segF, HIGH);
digitalWrite(segG, HIGH);
break;
break;
}
if (COUNT < 10)
{
COUNT++;
delay(1000);///increment count integer for every second
}
if (COUNT == 10)
{
COUNT = 0; // if count integer value is equal to 10, reset it to zero.
delay(1000);
}
}
Verschillende cijfers weergeven op aparte displays
-
Digit 3 en digit 4 zullen nu beide permanent oplichten aangezien zij permanent verbonden zijn met de ground.
-
Het is natuurlijk de bedoeling dat we op beide digits ook een verschillend cijfer kunnen weergeven.
-
Om dit te verwezenlijken mag er op elk gegeven moment telkens maar 1 digit oplichten.
-
Dit kunnen we bereiken door de CC’s van elke digit met een aparte uitgangspoort van de ESP32 te verbinden (in plaats van de continue verbinding met de ground).
-
Met de ESP32 zullen we dan afwisselend de CC van elke digit via de juiste code met de ground kunnen verbinden door een ‘0’ op de betreffende uitgang uit te sturen.
In de schakeling kan je kiezen om voor elk segmentje een aparte stroombegrenzingsweerstand gebruiken van 220 Ω. Dit zorgt ervoor dat de lichtopbrengst constant blijft. Alternatief je mag ook weerstanden aan de CC blijven gebruiken.

Breadboard Opstelling Multiplexing
Opdracht 4.2b - Multiplexen tussen meerdere displays
-
Verbind de CC van digit 3 en digit 4 nu NIET MEER MET DE GROUND maar met respectievelijk poort 26 en poort 27 van de ESP32 via een stroombegrenzingsweerstand (zie “Breadboard Opstelling Multiplexing”). Daarnaast verbind je (ter voorbereiding van opdracht 4.3) de CC van digit 1 en digit 2 met respectievelijk poort 33 en 25.
-
Programmeer poorten 33, 25, 26 en 27 als digitale output.
-
Met behulp van een digitalWrite(26, LOW) kan je ervoor zorgen dat pin 26 met de ground wordt doorverbonden. Met digitalWrite(26, HIGH) verbreek je deze connectie met de ground.
-
Gebruik deze techniek om afwisselend het getal “6 op twee digits (bv. digit 3 en digit 4) te laten oplichten om de 500 ms. Start hiervoor van de code uit opdracht 4.2a.
Indien je de delay van 500 ms verkleint tot 1 ms zul je merken dat het lijkt alsof beide displays simultaan oplichten. Test dit!
Roep de docent, demonstreer de functionaliteit van de schakeling.
ANS vraag 2a, 2b, 2c