Nachdem ich nun die RTC mit LCD zum Laufen gebracht habe, und auch 3 Temperatursensoren (2x DS18B20, 1x DHT22) anzeigen kann, habe ich das Problem, dass die RTC etwas holprig läuft. D.h., die Zeit stimmt grundsätzlich, nur springt die Anzeige manchmal bei 2 sec, manchmal erst bei 3 sec weiter, also nicht im Sekundentakt.
Wie muss ich die Uhr einbinden, damit sie flüssig läuft (bzw. flüssig angezeigt wird)? Ich nehme an, dass hier der restliche Code "stört", also für die Verzögerungen sorgt.
Das ist dein Übeltäter. Hier bleibt der Code einfach eine Sekunde oder mehr stehen. Du musst die DHT-Abfrage mit Millis steuern. Schau dir das Beispiel BlinkwithoutDelay an.
OK, danke. Ist hier überhaupt ein Delay notwendig? Ich habe es jetzt versuchsweise auskommentiert und es funktioniert jetzt sowohl die Uhr als auch die Temperaturanzeige.
Die Sensoren haben verschiedene Aktualisierungsintervalle. Sie könnten durch zu häufige Abfrage durcheinander kommen oder der erhöhte Energieverbrauch durch die Abfragen lässt die Sensoren sich leicht erwärmen und damit falsch messen. Deshalb sollte man sie nur alle ein bis zwei Sekunden auslesen.
Hallo,
wenn Du es über millis() machst, dann weißt Du nie wann gemessen wird.
Mache es doch über eine Abfrage:
If (Sekunden == 0)
dann messen
Dann weißt Du, das zu jeder vollen Minute gemessen wird.
Dieses "dann messen" setzt Du dann noch in eine logische Abfrage, so-
das nur 1x gemessen wird, wenn Sekunde == 0 ist.
Übers SensorTiming brauchst Du Dich dann nicht mehr kümmern.
Gruß und Spaß
Andreas
Die Zeitanzeige brauchst du doch auch nur jede Sekunde einmal.
OK, gibt Leute, die den Doppelpunkt blinken lassen
void loop() {
int current = millis();
if ( current & 0x1ff == 0) { // alle 512 ms
printLCD (current & 0x200); // abwechselnd true/false
if (current & 0x3F00 == 0) { // alle 16 sec
getTempAndDisplay();
}
delay (2); // damit millis() danach sicher einen anderen Wert hat
}
}
void printLCD(bool blink) {
lcd.setCursor(12,3);
print_Digits(hour());
lcd.print(":");
print_Digits(minute());
lcd.print(blink ? ":" : " "); // kann man natürlich auch mit if / else schreiben
print_Digits(second());
}
Gegenvorschlag, der keine extra Statusprüfung braucht, ob in dieser Sekunde schon was gemacht wurde
Hier wird alle 10 Sekunden gemessen, weil die Sekunden, geteilt durch 10-
den Rest 0 (nul) ergibt. D.h. die Stelle nach dem Komma ist 0.
Gruß und Spaß
Andreas
P.S. was macht dieser HEX-Mist da eigentlich. Ist das jetzt eine neue Mode?
Das fällt mir in Sketchen immer öfter auf.