-
We komen al aardig in de buurt van het gewenste eindresultaat.
-
Momenteel lichten 2 digits op, maar ze tonen hetzelfde cijfer.
-
Natuurlijk is het de bedoeling dat het rechtse display de eenheden toont en het linkse display de tientallen.
-
Hiervoor moeten we uit het decimale getal de eenheden en de tientallen afleiden. De tientallen verkrijgen we door een gehele deling door tien uit te voeren, de eenheden door een modulo-operatie.
Bv voor het getal “16”:
// 16 delen door 10 geeft "1 rest 6"
int eenheid = decimalNumber % 10; // modulo = rest bij deling (6)
int tiental = decimalNumber / 10; // gehele deling (1)
Daarnaast was de code van vorige oefening nog al omslachtig. Hieronder staat een voorbeeld om de code op een efficiëntere manier te schrijven. Aan de fysieke opstelling hoef je niets te veranderen.
int seg[7] = {12, 13, 15, 2, 17, 22, 21};
/*
seg[0] = seg a = GPIO 12 van ESP32
seg[1] = seg b = GPIO 13
seg[2] = seg c = GPIO 15
seg[3] = seg d = GPIO 2
seg[4] = seg e = GPIO 17
seg[5] = seg f = GPIO 22
seg[6] = seg g = GPIO 21
*/
int CC[4] = {33, 25, 26, 27};
/*
CC[0] = GPIO 33 van ESP32 = LSD (rightmost) CC=Common Cathode
CC[1] = GPIO 25
CC[2] = GPIO 26
CC[3] = GPIO 27 = MSD (leftmost) Most Significant Digit
*/
byte onDisplay[16] =
{
// bits 6543210
// segments gfedcba
0b0111111, //0
0b0000110, //1
0b1011011, //2
0b1001111, //3
0b1100110, //4
0b1101101, //5
0b1111101, //6
0b0000111, //7
0b1111111, //8
0b1101111, //9
0b1110111, //A
0b1111100, //b
0b0111001, //C
0b1011110, //d
0b1111001, //E
0b1110001, //F
} ;
void toonCijfer(int cijfer) {
for (int i=0;i<=6;i++)
{ digitalWrite(seg[i],bitRead(onDisplay[cijfer],i));
}
}
void setup()
{
for (int i=0;i<=6;i++){pinMode(seg[i], OUTPUT);};
for (int i=0;i<=3;i++){pinMode(CC[i], OUTPUT);};
}
void loop() {
digitalWrite(CC[0],LOW);
digitalWrite(CC[1],HIGH);
digitalWrite(CC[2],HIGH);
digitalWrite(CC[3],HIGH);
toonCijfer(5);
}
-
In het programma maken we gebruik van “arrays” - meer uitleg vind je hier : https://www.arduino.cc/reference/tr/language/variables/data-types/array/
-
In de setup() moeten deze pennen uiteraard als digitale uitgangen geconfigureerd worden; door het gebruik van de arrays kan dit met compacte for-lussen.
-
De “waarheidstabel” (= hoe willen we dat het display voor elke combinatie gaat oplichten) gaan we opsommen in een array onDisplay[16]. De aanduiding 0b voor elke combinatie geeft aan dat er een binaire notatie volgt.
-
De methode toonCijfer( cijfer ) zorgt dat de segmentjes juist aangestuurd worden om het gewenste cijfer te tonen. Als we in onze loop bv. schrijven toonCijfer(5), dan zal deze methode zorgen dat er een 5 verschijnt op het geselecteerde display.

Elektronisch Schema
Opdracht 4.3
In alle volgende oefeningen moeten de vier displays samen lijken op te lichten. In werkelijkheid gaan we ze echter één na één aansturen, maar dan wel voldoende snel na elkaar zodat onze (trage) ogen dit niet merken.
-
Declareer volgende variabelen en geef ze voorlopig een vaste waarde: EH=4, TT=3, HT=2 en DT=1 (eenheden, tientallen, honderdtallen en duizendtallen). Toon het samengestelde getal als 1234 op het display zoals in bovenstaande.
-
Houd de DT, HT en TT vast op hun waarde (DT=1, HT=2, TT=3), maar laat de eenheden achtereenvolgens de waarden van 0 tot 9 aannemen. Let op: je zal elk volledig getal een aantal keren moeten herhalen vooraleer je naar de volgende waarde springt. Experimenteer met verschillende delay-waarden en herhalingsaantallen om een rustig beeld te verkrijgen.
-
Laat je display nu tellen van 0000 tot 9999 (en dan weer herhalen).
Extra opdracht 1: Programmeer een klok die de tijd weergeeft in de volgende notatie HH.MM (HH = uren, van 00 tot 23; MM = minuten, van 00 tot 59). Als uitbreiding kan je “leading zero suppression” (= vooroplopende 0 niet tonen, maar blank maken) toepassen op de weergave van de uren.
Extra opdracht 2: Programmeer een stopwatch met een start/stop knop en een reset button. De notatie voor de stopwatch is MM.SS (minuten en seconden).
Roep de docent, demonstreer de functionaliteit van de schakeling.
ANS vraag 3