Hallo,
vorab, ich weiß das es zu diesem Thema durchaus andere Foreneinträge gibt, aber leider keinen, der mir so richtig auf die Sprünge hilft.
Ich habe folgendes vor:
- Ein Menü bauen in dem ich verschiedene Ausgänge schalten kann.
- Die aktuelle Uhrzeit wird unter dem Reiter "Uhrzeit" angezeigt
zu 1.funktioniert tadellos (mit Anleitung aus dem Internet)
zu2. leider nicht :o
wenn ich den Sketch hochlade bekomme ich, wenn ich unter dem Menüpunkt "Uhrzeit" bin die Uhrzeit angezeigt, aber diese aktualisiert sich leider nicht. Wenn ich den select Butten nochmals drücke bekomme ich wieder die aktuelle Uhrzeit angezeigt. Also liegt das Problem meines Erachtens nicht an der RTC sondern daran, das das LCD nicht aktualisiert oder halt nur ein mal nach dem Tastendruck. Ich habe schon in diversen Beiträgen gesehen, dass man irgendwie mit millis() das Problem beheben kann. Ich habe es aber bedauerlicher weise nicht hinbekommen. Irgendwie muss man doch, wenn man in dem "Case 5" ist dem LCD sagen können, das es ein mal in der Sekunde neu lädt.
Zu meiner Hardware:
-Arduino Nano
-DS3231 RTC
-I²C LCD 16x2
Menue_mit_RTC.ino (3.23 KB)
Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).
Gruß Tommy
Tommy56:
Setze Deinen Code bitte in Codetags ...
Da Tabanero nicht mehr online ist, übernehme ich das mal:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
#if defined(ARDUINO) && ARDUINO >= 100
#define printByte(args) write(args);
#else
#define printByte(args) print(args,BYTE);
#endif
LiquidCrystal_I2C lcd(0x3F,16,2);
int upButton = 10;
int downButton = 11;
int selectButton = 12;
int menu = 1;
int LED = 5;
int AUX = 8;
uint8_t clock[8] = {0x0,0xe,0x15,0x17,0x11,0xe,0x0};
RTC_DS1307 RTC;
void setup() {
lcd.init();
lcd.backlight();
pinMode(upButton, INPUT_PULLUP);
pinMode(downButton, INPUT_PULLUP);
pinMode(selectButton, INPUT_PULLUP);
pinMode (LED, OUTPUT);
pinMode (AUX, OUTPUT);
lcd.clear();
lcd.print("Willkommen!");
lcd.setCursor(0,1);
delay(2000);
lcd.clear();
updateMenu();
lcd.createChar(2, clock);
Wire.begin();
RTC.begin();
}
void loop(){
if (!digitalRead(downButton)){
menu++;
updateMenu();
delay(100);
while(!digitalRead(downButton));
}
if (!digitalRead(upButton)){
menu--;
updateMenu();
delay(100);
while(!digitalRead(upButton));
}
if (!digitalRead(selectButton)){
executeAction();
updateMenu();
delay(100);
while(!digitalRead(selectButton));
}
}
void updateMenu() {
switch (menu) {
case 0:
menu = 1;
break;
case 1:
lcd.clear();
lcd.print(">Licht an");
lcd.setCursor(0,1);
lcd.print("Licht aus");
break;
case 2:
lcd.clear();
lcd.print("Licht an");
lcd.setCursor(0,1);
lcd.print(">Licht aus");
break;
case 3:
lcd.clear();
lcd.print(">Ausgang an");
lcd.setCursor(0,1);
lcd.print("Ausgang aus");
break;
case 4:
lcd.clear();
lcd.print("Ausgang an");
lcd.setCursor(0,1);
lcd.print(">Ausgang aus");
break;
case 5:
lcd.clear();
lcd.print(">Uhrzeit");
lcd.setCursor(0,1);
lcd.print("");
case 6:
menu = 5;
break;
}
}
void executeAction(){
switch (menu) {
case 1:
action1();
break;
case 2:
action2();
break;
case 3:
action3();
break;
case 4:
action4();
break;
case 5:
action5();
break;
}
}
void action1() {
lcd.clear();
lcd.print("LED an!");
digitalWrite(LED, HIGH);
delay(2000);
menu = 1;
}
void action2() {
lcd.clear();
lcd.print("LED aus!");
digitalWrite(LED, LOW);
delay(2000);
menu = 1;
}
void action3() {
lcd.clear();
lcd.print("AUX an!");
digitalWrite(AUX, HIGH);
delay(2000);
menu = 1;
}
void action4() {
lcd.clear();
lcd.print("AUX aus!");
digitalWrite(AUX, LOW);
delay(2000);
menu = 1;
}
void action5(){
lcd.clear();
DateTime now = RTC.now();
lcd.printByte(2);
lcd.print(" ");
lcd.print(now.hour(), DEC);
lcd.print(':');
lcd.print(now.minute(), DEC);
lcd.print(':');
lcd.print(now.second(), DEC);
lcd.setCursor(0, 1);
lcd.print(now.day(), DEC);
lcd.print('/');
lcd.print(now.month(), DEC);
lcd.print('/');
lcd.print(now.year(), DEC);
lcd.print(' ');
delay(1000);
updateMenu();
}
Gruß
Gregor
Hi
Nunja - da Du das Menü nur updatest, wenn ein Knopf gedrückt wurde - wie soll eine neue Uhrzeit erscheinen?
Du müsstest in der loop() abfangen, ob Du im Menü-Punkt 'Uhrzeit' bist und dann
- das Knöpfchen drücken simulieren
oder
- die Update Routine aufrufen
MfG
PS: Entweder wird nicht mit einer so schnellen Antwort gerechnet, oder das Problem hat einen anderen Stellenwert, als meine Arduino-Probleme :o
Als Schmankerl sind mir die grünen Punkte an Euren Nicks aufgefallen
PPS: Die RTC1307 ist nicht so sonderlich genau - nimm beim nächsten Mal den großen Bruder 3231 - Der ist temperaturkompensiert und soll nur wenige Minuten im Jahr abgleiten.
... Da habe ich mich doch von dem Lib-Aufruf täuschen lassen :o
postmaster-ino:
Als Schmankerl sind mir die grünen Punkte an Euren Nicks aufgefallen
Die gibt es an Deinem auch, wenn Du gerade online bist. Also keine Verschwörung 
Gruß Tommy
Solltest du das mit deinem Menü nicht hinbekommen, dann sieh dir mal dieses Menü an, damit funktioniert es ganz sicher.
Hey,
danke für die schnelle Antwort und den Upload. Ja es ist nicht so dringend, da ich nur am experimentieren bin ;). das mit dem Simulieren des Knopf drückes habe ich auch schon versucht. Funktioniert aber leider nicht so zuverlässig.. Ich hatte den Fall das er dann auch teilweise in anderen Menüpunkten die select Taste ständig drückte.
Ich müsste ja irgendwie die Uhr "vor" das Menü stellen, damit sie nicht auf den Tastendruck wartet oder?
Gruß
André
Deine Frage ist schwer zu beantworten, da du in deinem Sketch keinerlei Dokumentation hast.
Da sieht man nicht, was der machen soll.
Damit ist das einlesen für uns sehr schwer.
Hauptsache du weist in einem Jahr noch, was er machen soll.
Das Problem ist ja soweit ich das verstanden habe das, dass die Uhrzeit bzw. das Display nur auf den Tastendruck reagiert. Ich müsste ihr halt irgenwie sagen, dass sie sich aktualisieren soll.
Den Code habe ich von YT nachgebaut und nach meinen Wünschen angepasst.
Hier das Video, in dem auch erklärt wird wie es funktioniert.
Hi
Ok, der Link zum YT-Video ist bei mir jetzt nicht sichtbar, aber erst Mal wurscht.
Du hast doch eine Abfrage in Deinem Sketch, wo Du bei Knopfdruck drauf reagierst - meine, was der Menüpunkt 5.
Wenn Du jetzt eine weitere IF einbaust, Die alle 100ms die aktuelle Uhrzeit auf's Display schickt, wenn Menüpunkt 5 aktiv ist?
Bei Dir prüfst Du ja erst die Taster und Dann, was dieser Taster machen soll - somit kommt die Abfrage nur dran, wenn auch ein Taster betätigt wurde.
MfG
Tabanero:
Das Problem ist ja soweit ich das verstanden habe das, dass die Uhrzeit bzw. das Display nur auf den Tastendruck reagiert. Ich müsste ihr halt irgenwie sagen, dass sie sich aktualisieren soll.
Den Code habe ich von YT nachgebaut und nach meinen Wünschen angepasst.
Hier das Video, in dem auch erklärt wird wie es funktioniert.
Das Problem ist, dass man einen nicht dokumentierten Sketch schwer bis nicht versteht und ich tue mir das nicht an.
Ebenso sehe ich mir nicht irgendwelche Videos an. Also gut das man das nicht sieht.
Du solltest deinen (ach ist ja nicht deiner) den Sketch dokumentieren, dann verstehst du den ach besser und findest deine Fehler besser.
Hey,
sorry das das mit dem Link nicht geklappt hat, hier nochmal ein neuer Versuch.
Ich habe mir das Video angesehen und dann das erst einmal 1 zu 1 nachgebaut. Ich habe mir demnach auch keine Komentare dazu angelegt, da das ja wie erwähnt erst mal nur ein Experiment ist. Da die Erklärung in dem Video so gut war habe ich mir auch erstmal keine Kommentare dahinter geschrieben. Wenn du dir das nicht antuen möchtest bitte... zwingt dich keiner dazu.
@postmaster-ino
Danke! Das was du schreibst leuchtet mir ein. Ich bin mir über den Syntax allerdings noch nicht ganz sicher.
wenn ich im Loop den unten stehenden Code einfüge
if (menu) == 5 {
updateMenu();
delay(1000);
}
gibt es folgende Fehlermeldung:
Arduino: 1.8.1 (Windows 10), Board: "Arduino Nano, ATmega328"
C:\Users\André\Desktop\Menue_mit_RTC\Menue_mit_RTC.ino: In function 'void loop()':
Menue_mit_RTC:63: error: expected primary-expression before '==' token
exit status 1
expected primary-expression before '==' token
muss ich nicht warten bis das Menü = 5 ist und dann die Anweisung zum aktualisieren geben?
Gruß
André
Aber schön, dass du all unsere Fragen und Bitten ignorierst.
Hi
Vll. solltest Du die Anderen auch etwas beachten - vll. willst Du ja Mal wieder vorbei kommen und da ist's schon besser, wenn der Leumund nicht ganz 'am Arsch' ist.
Bei Deiner Abfrage hast Du hinter der Abfrage keinen Befehl - Das schmeckt dem Kompiler nicht sonderlich.
Vll. wolltest Du die Klammer aber auch erst hinter der 5 schließen - dann ergibt sich plötzlich sogar ein Sinn.
Etwas mehr als C&P solltest Du schon anstreben.
MfG
Du hast ganz einfach die If-Anweisung falsch aufgebaut.
statt if(menu)==5 kommt da if(menu==5) hin
Siehe hier
Ja, das ist richtig. Aber ich fand die Aussage in der Form ungerechtfertigt. Wie dem auch sei. Ich habe mit dem Hinweis den Code etwas überarbeitet. Die Zeit wird jetzt auch nicht mehr in dem Untermenü "Uhrzeit" dargestellt und siehe da, es funktioniert. Vielen Dank für die Hilfestellung. Ich bin auch dabei von C & P wegzukommen, aber das ist als Neuling nicht so einfach.
Trotzdem Danke!
Tabanero:
... Ich bin auch dabei von C & P wegzukommen, aber das ist als Neuling nicht so einfach.
Wenn es Dir beim Wegkommen mal zu anstrengend wird: Mach Dir nichts draus. Mach einfach weiter und denke daran, dass sich die Mühe gelohnt haben wird. Selber programmieren zu können ist deutlich besser als immer wieder nach passendem Code suchen zu müssen.
Gruß
Gregor