| ZeitzonenBei dem Versuch „Zeitzonen“ kommen gleichzeitig zwei 4 Digit 7-Segmentanzeigen ins Spiel. Eine von ihnen wird mit dem Treiber
TM1637 gesteuert. Sie dient der Anzeige der aktuellen Uhrzeit und wird von Arduino mithilfe der Bibliothek TM1637
(#include <TM1637Display.h>) angesprochen. Um die Kommunikation zwischen den beiden Partnern zu ermöglichen, werden
lediglich zwei Leitungen benötigt. Die zweite 4 Digit 7-Segmentanzeige (SH5461AS), die im Laufschrift Städte anzeigen wird, muss man selbst
mit einem passenden Programm (in der Arduino-Welt Sketch genannt) bedienen. Sie wird mit der Multiplexing – Methode gesteuert. Trotz dessen werden
hier (statt 28) 11 Verbindungen zu Arduino benötigt. Mit sieben von ihnen werden die einzelnen Segmente der Anzeige bedient, mit vier
weiteren die einzelnen Digits ein- bzw. ausgeschaltet. Zusätzlich werden sieben Vorwiderstände zum Schutz der Anzeige-Leuchtdioden benötigt.
Für die aktuelle Zeit ist das Modul ZS-042 mit einer Batterie und dem RTC-Chip DS3231 zuständig.
Die KomponentenAufgebaute TestschaltungBei dem Multiplexing-Verfahren werden in diesem Fall die einzelnen Digits stets ganz schnell ein- und ausgeschaltet.
Die Schaltfrequenz muss ausreichend hoch sein, damit der Vorgang vom menschlichen Auge nicht bemerkt werden kann. Möchte man auf dem
ersten Digit ein Zeichen sichtbar machen, muss man es einschalten (hier der Ausgang 45 auf LOW stellen) und mit den Ausgängen 31-43, die
für die einzelnen Segmente der Anzeige (a bis g) zuständig sind, das gewünschte Zeichen bilden. Mit HIGH-Signal wird z.B. ein Element
eingeschaltet. Dabei müssen die drei übriggebliebenen Digits ausgeschaltet bleiben. So verfährt man mit allen Digits. SchaltplanSchaltplan (Arduino ohne USB-Anschluss oder Netzteil: Vin > 6 V) Das Programm (Sketch):// ----------------------------------------------------------// Zeitzonen // 7-Segmentanzeige 4-Digit SH5461AS / Multiplexing // 7-Segmentanzeige 4-Digit und Treiber TM1637 // Real Time Clock - Modul mit DS3231 // Arduino Mega2560 R3 (kompaktibel) // ---------------------------------------------------------- #include <TM1637Display.h> #include <DS3231.h> #define CLK 2 #define DIO 3 DS3231 clock; RTCDateTime dt; TM1637Display display(CLK, DIO); int a = 31; int b = 33; int c = 35; int d = 37; int e = 39; int f = 41; int g = 43; int digit1 = 45; int digit2 = 47; int digit3 = 49; int digit4 = 51; String Ausgabe; int Z1 = 0; int Z2 = 0; String Zone = "00"; String Leer = "oooo"; int Zone_Neu = 0; int DigitNr; char Zeichen; bool A [] = {1,1,1,0,1,1,1}; bool B [] = {0,0,1,1,1,1,1}; bool D [] = {0,1,1,1,1,0,1}; bool E [] = {1,0,0,1,1,1,1}; bool I [] = {0,1,1,0,0,0,0}; bool K [] = {1,0,1,0,1,1,1}; bool L [] = {0,0,0,1,1,1,0}; bool M [] = {1,0,1,0,1,0,1}; bool N [] = {0,0,1,0,1,0,1}; bool O [] = {1,1,1,1,1,1,0}; bool R [] = {0,0,0,0,1,0,1}; bool S [] = {1,0,1,1,0,1,1}; bool T [] = {0,0,0,1,1,1,1}; bool U [] = {0,1,1,1,1,1,0}; bool W [] = {1,0,1,1,1,0,0}; bool Y [] = {0,1,1,1,0,1,1}; bool o [] = {0,0,0,0,0,0,0}; bool Buchstabe [] = {1,0,1,1,0,1,0}; char Stadt [] = { "ooooBERLINooooLONDONooooNEWYORKooooTOKIOooooMOSKAUoooo" }; void Zeitanzeige (int Zone) { dt = clock.getDateTime(); int Std_Aktuell = dt.hour + Zone; if ((dt.hour + Zone) > 24) { Std_Aktuell = dt.hour + Zone - 24; } if ((dt.hour + Zone) < 0) { Std_Aktuell = 24 + dt.hour + Zone; } Ausgabe = String(Std_Aktuell); if (dt.minute < 10) { Ausgabe = Ausgabe + "0"; } Ausgabe = Ausgabe + String(dt.minute); display.showNumberDecEx(Ausgabe.toInt(), 0b01000000, false, 4, 4); } void setup() { clock.begin(); display.setBrightness(10); display.clear(); pinMode (a, OUTPUT); pinMode (b, OUTPUT); pinMode (c, OUTPUT); pinMode (d, OUTPUT); pinMode (e, OUTPUT); pinMode (f, OUTPUT); pinMode (g, OUTPUT); pinMode (digit1, OUTPUT); pinMode (digit2, OUTPUT); pinMode (digit3, OUTPUT); pinMode (digit4, OUTPUT); Zeitanzeige (0); // Aktuelle Zeit setzen (// entfernen): //clock.setDateTime(2020, 03, 21, 11, 42, 0); } void Digit_On_Off (int DigitNr) { digitalWrite (digit1, HIGH); if (DigitNr == 1) { digitalWrite (digit1, LOW); } digitalWrite (digit2, HIGH); if (DigitNr == 2) { digitalWrite (digit2, LOW); } digitalWrite (digit3, HIGH); if (DigitNr == 3) { digitalWrite (digit3, LOW); } digitalWrite (digit4, HIGH); if (DigitNr == 4) { digitalWrite (digit4, LOW); } } void Anzeige (char Zeichen, int DigitNr) { Digit_On_Off (DigitNr); switch (Zeichen) { case 'A' : { for (int i = 0; i < 7; i++) { Buchstabe [i] = A [i]; } break; } case 'B' : { for (int i = 0; i < 7; i++) { Buchstabe [i] = B [i]; } break; } case 'D' : { for (int i = 0; i < 7; i++) { Buchstabe [i] = D [i]; } break; } case 'E' : { for (int i = 0; i < 7; i++) { Buchstabe [i] = E [i]; } break; } case 'I' : { for (int i = 0; i < 7; i++) { Buchstabe [i] = I [i]; } break; } case 'K' : { for (int i = 0; i < 7; i++) { Buchstabe [i] = K [i]; } break; } case 'L' : { for (int i = 0; i < 7; i++) { Buchstabe [i] = L [i]; } break; } case 'M' : { for (int i = 0; i < 7; i++) { Buchstabe [i] = M [i]; } break; } case 'N' : { for (int i = 0; i < 7; i++) { Buchstabe [i] = N [i]; } break; } case 'O' : { for (int i = 0; i < 7; i++) { Buchstabe [i] = O [i]; } break; } case 'R' : { for (int i = 0; i < 7; i++) { Buchstabe [i] = R [i]; } break; } case 'S' : { for (int i = 0; i < 7; i++) { Buchstabe [i] = S [i]; } break; } case 'T' : { for (int i = 0; i < 7; i++) { Buchstabe [i] = T [i]; } break; } case 'U' : { for (int i = 0; i < 7; i++) { Buchstabe [i] = U [i]; } break; } case 'W' : { for (int i = 0; i < 7; i++) { Buchstabe [i] = W [i]; } break; } case 'Y' : { for (int i = 0; i < 7; i++) { Buchstabe [i] = Y [i]; } break; } case 'o' : { for (int i = 0; i < 7; i++) { Buchstabe [i] = o [i]; } break; } } digitalWrite (a, Buchstabe [0]); digitalWrite (b, Buchstabe [1]); digitalWrite (c, Buchstabe [2]); digitalWrite (d, Buchstabe [3]); digitalWrite (e, Buchstabe [4]); digitalWrite (f, Buchstabe [5]); digitalWrite (g, Buchstabe [6]); } void loop() { Z2++; for (int i = 0; i < 4; i++) { DigitNr = i+1; Zeichen = Stadt [Z1+i]; Anzeige (Zeichen, DigitNr); delay (2); if (Z2 == 50) { digitalWrite (digit1, HIGH); Z2 = 0; Z1++; if (Z1 > 51) { Z1 = 0; } Zone = ""; Zone.concat (Stadt [Z1+3]); Zone.concat (Stadt [Z1+4]); if (Zone == "oB") { Zone_Neu = 0; } if (Zone == "oL") { Zone_Neu = -1; } if (Zone == "oN") { Zone_Neu = -5; } if (Zone == "oT") { Zone_Neu = 8; } if (Zone == "oM") { Zone_Neu = 2; } Leer = ""; for (int j = 0; j < 4; j++) { Leer.concat(Stadt [Z1+j]); } if (Leer == "oooo") { Zeitanzeige (Zone_Neu); } } } } // ---------------------------------------------------------- Kurzvideo Weitere Themen:
|