Arduino Delay für eine Sekunde?

2 Antworten

Delay ist beim Mikrocontroller gar nicht so gut. Wie RareDevil schon geschrieben hat, brauchen die anderen Funktionen auch Zeit. Das kannst du aber gerade bei Arduino kaum aus dem Code herauslesen, weil dir die IDE gar nicht den "echten" Code zeigt und vor dem compilieren noch eine automatische Optimierung (optimize for size, wenn ich nicht irre) stattfindet. Dadurch wird die Uhr sehr ungenau.

Ein weiterer Nachteil von Delay ist, dass der Watchdog praktisch unbrauchbar wird, weil du ihn während des Delay nicht zurücksetzen kannst.

Die Methode, millis() zu pollen ist um Längen besser. Dabei muss man aber wissen und berücksichtigen, dass millis() nach knapp zwei Monaten überläuft.

Eine dritte Möglichkeit wäre, Interrupts zu verwenden. Der ATMega2560 hat 4 Stück 16bit Timer dabei, die von der Arduino IDE nicht für andere Sachen verwendet werden (im Gegensatz zum 8bit Timer0). Diese Variante ist allerdings etwas komplexer zu programmieren.

Ein ganz anderer Ansatz ist die Verwendung eines Uhrenchips. Der Klassiker ist der DS1307, der an den I2C Bus angehängt wird.

wenn Du ein Delay von 1000ms nutzt, benötigen die restlichen Befehle danach aber auch noch Zeit zur Abarbeitung. Dadurch läuft dein Programmzyklus insgesamt länger. Entweder musst Du alternativ zum Delay statt dessen mit millis() einen Timer bauen, der nicht den Programmcode für eine Sekunde anhält (Delay stoppt den Programmablauf für die Zeit), oder deine Laufzeit analysieren (Je Zyklus die Laufzeit messen und das Delay anpassen), was aber bedeutet, wenn was passiert, was länger dauert wie normal, verzögert sie doch wieder.