PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Uhrzeit auf LCD mit Arduino ausgeben (Eigene Zeichen)



NukeNoob
14.04.2012, 23:13
Hallo @ All!
Ich muss momentan mein P5 (Fünftes Prüfungselement) für's Abitur vorbereiten. Ich habe mir einen Arduino und ein LCD gekauft und habe alles angeschlossen und es funktioniert auch. Nun empfange ich die Zeit per Funk und kann sie auch ausgeben, nur leider sind mir die Zahlen zu klein. Deswegen habe ich mir selber Symbole erstellt und dann jeweils in einer Funktion (Eins (); , Zwei (); usw.) größere Zahlen daraus gemacht, welche über alle 4 Zeilen des LCD angezeigt werden. Nun habe ich natürlich ein Problem: Ich muss dem Arduino ja sagen, dass er für eine bestimmt Uhrzeit, z.B. 15:15:30 Uhr, meine Funktionen Eins(); | Fuenf (); | Doppeltpunkt (); | Eins(); | Fuenf (); | Doppeltpunkt (); | Drei (); | Null (); benutzen soll, damit auch die richtigen großen Zahlen angezeigt werden. Wenn ich das ganze mit switch & case realisiere benötige ich für die Stunden 24 case Blöcke sowie 60 für Minuten und Sekunden. Dadurch wird der Quelltext super unübersichtlich und man findet auch keine Fehler mehr. Hat Jemand eine Idee, wie man das ganze einfacher gestalten könnte? Vielleicht irgendwie den Funktionen einen Präfix geben, sodass auch diese einfach hochgezählt werden? Freue mich auf euere Antworten =) und vielen Dank im Voraus!

LG

robo_tom_24
15.04.2012, 00:31
Hallo
Bei manchen LCD's kann man zwischen einzeiligem und zweizeiligem Modus umschalten -> Datenblatt
Oder aber du machst dir verschachtelte Funktionen bzw. eine Umwandlungsfunktion
BSP:

void SmallToBig_time(int uhrzeit, char* string_mit_grossen_zeichen)
{
//uhrzeit kommt z.B. in array mit 3 Elemten -> 3 mal funktionsaufruf
for(i=0;i<3;i++)
{
SmallToBig_char(int uhrzeit[i], char* elemente_mit_grossen_zeichen)
{
//UMWANDELN
}
//Strings wieder zusammensetzen und ausgeben
strcat(string_mit_grossen_zeichen, elemente_mit_grossen_zeichen);
}
}

So hätte ich das ca. aufgesetzt....

mfg thomas

NukeNoob
15.04.2012, 11:49
Hallo! Danke für die schnelle Antwort =). Nur weiß ich nicht genau wie ich mit deiner Funktion arbeiten soll. Meine Eigenen Zeichen sind wie folgt aufgebaut:

void Null (int x, int y)
{
int xPos = x;
int yPos = y;
lcd.setCursor(xPos, yPos);
lcd.write(7);
lcd.write(7);
lcd.write(7);
lcd.setCursor(xPos, yPos+1);
lcd.write(7);
lcd.setCursor(xPos+2, yPos+1);
lcd.write(7);
lcd.setCursor(xPos, yPos+2);
lcd.write(7);
lcd.setCursor(xPos+2, yPos+2);
lcd.write(7);
lcd.setCursor(xPos, yPos+3);
lcd.write(7);
lcd.write(7);
lcd.write(7);
}

Das wäre jetzt z.B. meine Null. Ich übergebe die X- und Y-Positon auf dem LCD als Paramter und die Zahlen werden angezeigt. Vielleicht gibt es noch eine bessere Möglichkeit =)?

LG

robo_tom_24
15.04.2012, 12:18
Schau, du zerlegst sozusagen deine Uhrezeit in die einzelnen Zeichen, wandelst diese in große um und setzt sie wieder als String zusammen

Vielleicht verstehst du es so: (ich gehe jetzt davon aus, das deine Uhrzeit in als Zahl in Sekunden seit 1.1.1970 (?) daherkommt)
time ist deine "ganze" Zeit in sekunden
das array int small_time deine Uhrzeit in kleinen Buchstaben

Du machst dir eine Funktion, bzw benutzt eine Fertige die die Sekunden in die aktuelle Uhrzeit umwandelt:

void time_to_number(long time, int* small_time)
{
//UMWANDELN
}

Dann sieht dein array z.B so aus (13:05:27):

small_time:
[0]: 1
[1]: 3
[2]: 0
[3]: 5
[4]: 2
[5]: 7

Nun kommt wieder eine Funktion die dir das Ganze in deinen Text umwandelt


#define x_pos(x) (x)*120 //X Position für jedes Zeichen ermitteln - ich gehe von 120x200 Pixel pro Zeichen aus
#define y_pos 20 //Randabstand von oben

void number_to_text (const int* small time)
{


int i;
for(i=0;i<=5;i++)
{


switch(i)
{


case 0: Null(x_pos(i),y_pos);
break;

case 1: Eins(x_pos(i),y_pos);
break;

//Und so weiter....

}


}

}

Din deinem Hauptprogramm würde dann nur das stehen:


void main()
{


int small_time[6];
//Andere Dinge....

while(1)
{

time_to_number(funktion_die_zeit_liefert, small_time);

number_to_text(small_time);
}

}


Ich hoffe es hilft dir weiter ;)

Mir kommt gerade.... du könntest aber auch eine große 7 Segmentanzeige verwenden :cool:

mfg thomas

NukeNoob
15.04.2012, 12:23
Hallo! Danke nochmal für die Antwort! Habe mir jetzt selber etwas ausgedacht, werde deine Möglichkeit aber auch noch mal überdenken:

void Zeige_Uhrzeit ()
{
int StundeBit = hour()%10;
int MinuteBit = minute()%10;

lcd.clear();
if(hour() < 10)
{
Null (1, 0);
}
else if ((hour()>10) && (hour()<20))
{
Eins (1, 0);
}
else if ((hour()>=20) && (hour()<=24))
{
Zwei(1, 0);
}

switch (StundeBit)
{
case (0):
{
Null (5, 0);
} break;
case (1):
{
Eins (5, 0);
} break;
case (2):
{

Zwei (5, 0);
} break;
case (3):
{
Drei (5, 0);
} break;
case (4):
{
Vier (5, 0);
} break;
case (5):
{
Fuenf (5, 0);
} break;
case (6):
{
Sechs (5, 0);
} break;
case (7):
{
Sieben (5, 0);
} break;
case (8):
{
Acht (5, 0);
}
case(9):
{
Neun (5, 0);
} break;
}

if(second()%2 == 0)
{
Doppelpunkt(9, 0);
Doppelpunkt(10, 0);
}

if(minute() < 10)
{
Null (12, 0);
}
else if ((minute()>=10) && (minute()<20))
{
Eins (12, 0);
}
else if ((minute()>=20) && (minute()<30))
{
Zwei(12, 0);
}
else if ((minute()>=30) && (minute()<40))
{
Drei(12, 0);
}
else if ((minute()>=40) && (minute()<50))
{
Vier(12, 0);
}
else if ((minute()>=50) && (minute()<60))
{
Fuenf(12, 0);
}
else if (minute()==60)
{
Sechs(12, 0);
}

switch (MinuteBit)
{
case (0):
{
Null (16, 0);
} break;
case (1):
{
Eins (16, 0);
} break;
case (2):
{
Zwei (16, 0);
} break;
case (3):
{
Drei (16, 0);
} break;
case (4):
{
Vier (16, 0);
} break;
case (5):
{
Fuenf (16, 0);
} break;
case (6):
{
Sechs (16, 0);
} break;
case (7):
{
Sieben (16, 0);
} break;
case (8):
{
Acht (16, 0);
}
case(9):
{
Neun (16, 0);
} break;
}
}

Ein bisschen lang - aber es funktioniert =)

Edit: Meine Zeit wird in folgendem Format geliefert: HH:MM:SS.
Edit: Ich muss gestehen, dass ich deine Möglichkeit immer noch nicht verstehe. Liegt mit Sicherheit daran, dass ich mich mehr mit Spieleprogrammierung beschäftigt habe :D ... Aber mach dir nix drauß ... deine Lösung ist bestimmt besser, aber meine Funkiutoniert ja auch!

LG!

robo_tom_24
15.04.2012, 12:54
Wenn ichs dir nochmals erklären soll, als Text, bitte melden :)
Für eine Arbeit soll der Code ja auch schön sein ;)

mfg thomas