Hallo an alle erstmal,
ich bin einsteiger in der Arduino Programmierung und benötige deshalb Hilfe bei einer kleinen Fehlersuche.Ich habe im Forum nach einiger Sucherei nicht das passende gefunden.Momentan versuche ich eine Zeitschaltuhr zu realisieren mittels Displayshield von Saintsmart und Software.
Zusätzlich soll die Möglichkeit bestehen, die gewünschten Zeiten mittels der auf dem Shield befindlichen Taster über ein kleines Menü einzustellen.Das Einstellen der aktuellen Uhrzeit funktioniert soweit auch nun habe ich ein Problem beim Darstellen der Zeit im Hauptmenü.Ich möchte quasi vom Hauptbildschirm mittels HOCH und RUNTER durch das Menü schalten.
0.Hauptbildschirm (Uhrzeit)
1.Menü (Zeiteinstellung)
2.Menü
3.Menü
4.Menü
Dazu habe ich Switch-Case Anweisungen verwendet und eine While-Schleife die bei drücken der HOCH und RUNTER Taste unterbrechen soll und in das nächste Menü schalten soll.Lange Rede kurzer Sinn
ich kann für die Abbruchbedingung nur eine Taste auswählen und bei Tastendruck bleibt die Zeit stehen und es "Hängt" kurz.
Ziele:
-Menü soll flüssig durchschaltbar sein.
-Es sollen HOCH und RUNTER Taster zum durchschalten verwendet werden können.
Ich danke euch schon mal vorab für eure Hilfe.
vielleicht kann mir ja jemand den Logikfehler erklären.
Und geht bitte nicht so streng mit mir ins Gericht ich programmiere noch nicht all zulange.
CODE:(entschuldigt bitte den Wust, ich hoffe die Kommentare machen es en bissel verständlicher)
//Libraries
#include <Time.h>
#include <TimeLib.h>
#include <LiquidCrystal.h>
#include <sainsmartkeypad.h>
//INIT DISPLAY
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
SainsmartKeypad keypad(0);
// GOLBAL Variablen
char key;
//Variablen zum zählen der Menüseiten
int men1 = 1;
int menuseitegesamt = 4;
int menuseitealt = 0;
int menuseiteakt = 0;
//Variablen zum auslesen der Taster
int keypad_pin = A0;
int keypad_value = 0;
//Aktuelle UHRZEIT
int s = 0;
int sec = 0;
int hrs = 0;
int minutes = 0;
int initialHours = 00;
int initialMins = 00;
int initialSecs = 00;
//Einschaltzeit
//AUschaltzeit
void setup() {
lcd.begin(16, 2); // put your setup code here, to run once:
hauptmenu();
delay(1000);
}
void loop() {
// put your main code here, to run repeatedly:
//Auswahl der Untermenüs
key = ReadKeypad();
casecount();
if (key == 'S') {
switch (menuseiteakt)
{
case 0:
break;
case 1:
menu1();
break;
case 2:
// menu2();
break;
case 3:
// menu3();
break;
case 4:
// menu4();
break;
}
}
}
///Funktionen Menü
////Readkeypad
char ReadKeypad() {//Liest die Analog werte der Taster us und gibt Chars zurück
no button pressed 1023
select 741
left 503
down 326
up 142
right 0
* /
keypad_value = analogRead(keypad_pin);
if (keypad_value < 100)
return 'R';
else if (keypad_value < 200)
return 'U';
else if (keypad_value < 400)
return 'D';
else if (keypad_value < 600)
return 'L';
else if (keypad_value < 800)
return 'S';
else
return 'N';
}
////Hauptmenu
void hauptmenu() {//Hier befindet sich der Fehler
lcd.clear();
lcd.setCursor(0, 0);
switch (menuseiteakt)
{
case 0:
//bei drücken von U oder D soll direkt nächstes menü aufgerufen werden
// Oderverknüpfung beider Tasten mit || funktioniert nicht
key = 'N';//taste sofort auf N setzen klappt nicht
while (key != 'U') {
key = ReadKeypad();
displaytime();
}
delay(200);
lcd.setCursor(0, 1);
lcd.print(key);
break;
case 1:
lcd.write("1.Menu A");
lcd.setCursor(0, 1);
lcd.print(menuseiteakt);
delay(200);
break;
case 2:
lcd.print("2. Menu B");
lcd.setCursor(0, 1);
lcd.print(menuseiteakt);
delay(200);
break;
case 3:
lcd.print("3. Menu C");
delay(200);
break;
case 4:
lcd.print("4. Menu D");
delay(200);
break;
}
}
///Waitbutton
void waitbutton() {//Dient zum warten auf loslassen des Tasters
while (analogRead(keypad_pin) < 800) {}
}
////Casecount
void casecount() {//Zählt die Menüseiten für Switch Case
if (key == 'U') {
menuseiteakt++;
if (menuseiteakt > menuseitegesamt) {
menuseiteakt = 0;
}
} else if (key == 'D') {
menuseiteakt--;
if (menuseiteakt < 0) {
menuseiteakt = menuseitegesamt;
}
}
if (menuseiteakt != menuseitealt) {
menuseitealt = menuseiteakt;
hauptmenu();
}
}
////Funktionen Menüaufruf
void menu1() {
switch (men1) {
case 1: //Dient zumn einstellen der Stunden
lcd.clear();
//lcd.print("in menu1");
while (ReadKeypad() != 'L') {
key = ReadKeypad();
// waitbutton();
initialHour();
//lcd.print(key);
//delay(10);
}
menuseiteakt = 0;
break;
case 2: // Dient zum enstellen der Minuten ( weiterspringen des Crusors)
while (ReadKeypad() != 'L') {
key = ReadKeypad();
// waitbutton();
initialMin();
//lcd.print(key);
//delay(10);
}
menuseiteakt = 0;
break;
}
}
/////Funktionen ZEIT
int seconds() {
s = initialHours * 3600; //Brechnet aus Stunden die sekunden
s = s + (initialMins * 60); //Berechnet aus Minuten die Sekunden und addiert auf
s = s + initialSecs; //Addiert die Sekunden hinzu
s = s + (millis() / 1000); // alle 1000 ms wird 1 sekunde aufaddiert
return s;
}
int hours() {
hrs = seconds();
hrs = hrs / 3600; // umrechung Sekunden in Stunden
hrs = hrs % 24; //Modulo zur ausgabe der Stunden
return hrs;
}
int mins() {
minutes = seconds(); // siehe hours()
minutes = minutes / 60;
minutes = minutes % 60;
return minutes;
}
int secs() {
sec = seconds(); //siehe hours()
sec = sec % 60;
return sec;
}
char sep() {
s = millis() / 1000; //alle 1000 ms bei geraden zahlen ":" printen
if (s % 2 == 0)
{
lcd.print(":");
}
else {
lcd.print(" "); // bei ungeraden zahlen " " printen
}
}
void printDigits(byte digits) {
if (digits < 10)
lcd.print('0'); // wenn digits < 10 führenden Null einfügen
lcd.print(digits);//
}
void displaytime() {// gibt Uhrzeit in loop in der Form HH:MM:SS auf display aus
key = ReadKeypad();
lcd.setCursor(0, 0);
printDigits( hours());
sep();
printDigits(mins());
sep();
printDigits(secs());
lcd.setCursor(1, 0);
lcd.print(hrs);
}
////Funktionen Zeiteinstellung
void initialHour() {//Per Modulo einzelne stellen errechnen und per taster hochzählen
int s = millis() / 1000;
int stunden10 = (initialHours / 10) % 10;
int stunden1 = initialHours % 10;
//lcd.clear();
lcd.setCursor(0, 0);
lcd.print(stunden10);
lcd.setCursor(1, 0);
lcd.print(stunden1);
lcd.setCursor(2, 0);
sep();
lcd.setCursor(3, 0);
lcd.print("00");
lcd.setCursor(5, 0);
sep();
lcd.print("00");
if (key == 'U') {
waitbutton();
//delay(500);
initialHours++;
lcd.setCursor(0, 0);
lcd.print(stunden10);
lcd.setCursor(1, 0);
lcd.print(stunden1);
lcd.setCursor(2, 0);
sep();
}
if (initialHours > 23) {
initialHours = 0;
}
if (initialHours < 0) {
initialHours = 23;
}
if (key == 'R') {
men1 = 2;
menu1();
}
}
void initialMin() {
int s = millis() / 1000;
int min10 = (initialMins / 10) % 10;
int min1 = initialMins % 10;
//lcd.clear();
lcd.setCursor(3, 0);
lcd.print(min10);
lcd.setCursor(4, 0);
lcd.print(min1);
lcd.setCursor(5, 0);
sep();
if (key == 'U') {
waitbutton();
//delay(500);
initialMins++;
lcd.setCursor(3, 0);
lcd.print(min10);
lcd.setCursor(4, 0);
lcd.print(min1);
}
if (initialMins > 59) {
initialMins = 0;
}
if (initialMins < 0) {
initialMins = 59;
}
}