Programmieren der Uhrzeitausgabe
Jetzt, da die LEDs ins Programm integriert wurden, fehlt lediglich nur noch die eigentliche Programmierung der Ausgabe der Uhrzeit mit den LEDs. Diese befindet sich im void loop().
int binaryHour = String(Clock.getHour(h12, PM), BIN).length();
int binaryMinute = String(Clock.getMinute(), BIN).length();
Mit diesen Zeilen werden sich die Stunden und die Minuten genommen und in Binär umgewandelt. Dann wird die Zeichenlänge der Binärzahl in einer int-Variable gespeichert.
Als Beispiel: wenn es 11 Uhr wäre, würde die Binärzahl 1011 dabei herauskommen. Die Binärzahl hat eine Zeichenlänge von 4, also wird in der Variable die Zahl 4 gespeichert.
if (h12) {
if (PM) {
digitalWrite(am_LED, LOW);
}
else {
digitalWrite(am_LED, HIGH);
}
}
Da wir uns für das 12-Stunden-System entschieden haben, müssen wir eine Möglichkeit haben zwischen AM und PM zu unterscheiden. Dafür verwenden wir die vorher definierte Konstante für die LED, sowie die vorher definierten booleans, welche zur Überprüfung verwendet werden.
(In diesem Fall leuchtet sie bei AM)
for (int i = 0; i <= binaryHour; i++){
if (bitRead(Clock.getHour(h12, PM), i) == 1) {
digitalWrite(stunden[i], HIGH);
}
else{
digitalWrite(stunden[i],LOW);
}
}
Damit nur die LEDs leuchten, die zu der Uhrzeit auch leuchten sollen, überprüfen wir die einzelnen Bits der Uhrzeit. Dafür haben wir vorher die Variabel binaryHour und binaryMinute erstellt. Es wird eine for-schleife erstellt, die nur solange durchläuft, wie lange die Binärzahl ist. Dann werden mit der Methode bitRead die Bits der aktuellen Uhrzeit auf 1 und 0 überprüft. Wenn das Bit = 1 ist, wird die LED an der Stelle im Array aktiviert. Dies wird für die Minuten genauso wiederholt.
Die Methode bitRead() funktioniert so, dass sie sich bei der Binärzahl das rechteste Bit anschaut. Bei der Zahl 11, also 1011 in Binär, würde bei bitRead(2) das makierte Bit mit dem Wert 0 – 1011.
Der gesamte Code sollte am Ende ca. so aussehen:#include <DS3231.h>
#include <Wire.h>
DS3231 Clock;
bool h12;
bool PM;
byte Hour;
byte Minute;
byte Second;
#define am_LED 15
int stunden[] = {27, 14, 12, 13};
int minuten[] = {5, 17, 32, 33, 25, 26};
void GetDateStuff(byte& Hour, byte& Minute, byte& Second) {
boolean GotString = false;
char InChar;
byte Temp1, Temp2;
char InString[6];
byte j=0;
while (!GotString) {
if (Serial.available()) {
InChar = Serial.read();
InString[j] = InChar;
j += 1;
if (InChar == 'x') {
GotString = true;
}
}
}
Temp1 = (byte)InString[0] -48;
Temp2 = (byte)InString[1] -48;
Hour = Temp1*10 + Temp2;
Temp1 = (byte)InString[2] -48;
Temp2 = (byte)InString[3] -48;
Minute = Temp1*10 + Temp2;
Temp1 = (byte)InString[4] -48;
Temp2 = (byte)InString[5] -48;
Second = Temp1*10 + Temp2;
}
void setup() {
Serial.begin(9600);
Wire.begin();
pinMode(am_LED, OUTPUT);
for (int i = 0; i <= 3; i++){
pinMode(stunden[i], OUTPUT);
}
for (int i = 0; i <= 5; i++){
pinMode(minuten[i], OUTPUT);
}
}
void loop() {
if (Serial.available()) {
GetDateStuff(Hour, Minute, Second);
Clock.setClockMode(true);
Clock.setHour(Hour);
Clock.setMinute(Minute);
Clock.setSecond(Second);
}
int binaryHour = String(Clock.getHour(h12, PM), BIN).length();
int binaryMinute = String(Clock.getMinute(), BIN).length();
if (h12) {
if (PM) {
digitalWrite(am_LED, LOW);
}
else {
digitalWrite(am_LED, HIGH);
}
}
for (int i = 0; i <= binaryHour; i++){
if (bitRead(Clock.getHour(h12, PM), i) == 1) {
digitalWrite(stunden[i], HIGH);
}
else{
digitalWrite(stunden[i],LOW);
}
}
for (int i = 0; i <= binaryMinute; i++){
if (bitRead(Clock.getMinute(), i) == 1) {
digitalWrite(minuten[i], HIGH);
}
else{
digitalWrite(minuten[i], LOW);
}
}
}
Zuletzt geändert: Donnerstag, 11. Februar 2021, 14:25