lehrkraefte:blc:informatik:ffprg2-2020:7segment-display

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
lehrkraefte:blc:informatik:ffprg2-2020:7segment-display [2020/08/24 08:33] – [Codierung der Ziffern als Bytes] Ivo Blöchligerlehrkraefte:blc:informatik:ffprg2-2020:7segment-display [2020/08/24 08:46] (current) – [Codierung der Ziffern als Bytes] Ivo Blöchliger
Line 1: Line 1:
 +====== 7-Segment-Anzeige from Scratch ======
 +Ein mittlerer Pin wird über ein 220$\Omega$-Widerstand mit GND verbunden.
 +Acht Pins vom ESP32 werden mit den acht "äusseren" Pins der 7-Segment-Anzeige verbunden. Verwenden Sie Pin 13 bis 32 auf der "VIN"-Seite des ESP32
 +
 +Nummerierung der Segmente:
 +
 +| oben | 0 |
 +| oben rechts | 1 |
 +| unten rechts | 2 |
 +| unten | 3 |
 +| links unten | 4 |
 +| links oben | 5 |
 +| mitte | 6 | 
 +| Punkt | 7 |
 +
 +Test:
 +<code c++>
 +// Ordnen Sie die Pin-Nummern so, dass die LED in obiger Reihenfolge blinken.
 +// Diese Ordnung hängt davon ab, wie die die LEDs angeschlossen haben.
 +byte ledPins[] = {33, 32, 12, 14, 13, 25, 26, 27};
 +
 +void setup() {
 +  Serial.begin(115200);
 +  for (int i=0; i<8; i++) {
 +    pinMode(ledPins[i], OUTPUT);
 +  }
 +}
 +
 +void loop() {
 +  for (int i=0; i<8; i++) {
 +    digitalWrite(ledPins[i], HIGH);
 +    Serial.printf("[%d] GPIO %d\n", i, ledPins[i]);
 +    delay(1000);
 +    digitalWrite(ledPins[i], LOW);
 +  }
 +}
 +</code>
 +
 +====== Codierung der Ziffern als Bytes ======
 +Ein Byte hat 8 Bits, kann also darstellen, welche Segmente an und aus sein sollen. Daten können auch direkt binär angegeben werden.
 +
 +Vervollständigen Sie die Variable digits mit der Darstellung der restlichen Ziffern.
 +
 +<code c++>
 +byte ledPins[] = {33, 32, 12, 14, 13, 25, 26, 27};
 +
 +byte digits[] = {0b00111111, 0b110};
 +
 +void setup() {
 +  Serial.begin(115200);
 +  for (int i=0; i<8; i++) {
 +    pinMode(ledPins[i], OUTPUT);
 +  }
 +}
 +
 +void showByte(byte b) {
 +  // 1 << i ist die Binärzahl 1, um i Stellen nach links verschoben,
 +  // d.h. jene Zahl, die genau an der Stelle i eine 1 hat.
 +  //
 +  // Diese Zahl wird bitweise UND gerechnet, d.h. es bleibt entweder Null
 +  // oder diese Zahl übrig. 
 +  // Das Resultat kann direkt verwendet werden, wobei 0 als LOW und alles andere
 +  // als HIGH interpretiert wird.
 +  for (int i=0; i<8; i++) {
 +    digitalWrite(ledPins[i], (b & (1 << i)));
 +  }
 +}
 +
 +void loop() {
 +  for (int j=0; j<4; j++) {
 +    for (int i=0; i<2; i++) {
 +      showByte(digits[i]);
 +      delay(200);
 +    }
 +  }
 +  for (int i=1; i<=256; i++) {
 +    showByte(i);
 +    delay(40);
 +  }
 +}
 +</code>
 +
 +===== Weitere Ideen =====
 +  * Kleine Animationen auf der Anzeige
 +  * Verwendung eines Shift-Registers oder eines 7-Segment Decoders.
 +  * Weitere Displays.