ich versuche einen Timer, mit einem RTC Modul (Real Time Clock), mit dem Arduino Nano zu bauen.
Der Timer soll nach einer Betätigung eines Tasters starten, X Sekunden (im Code bsp. 10 Sek) das Licht brennen lassen, und nach Ablauf der Zeit das Licht ausschalten. Ich habe in der Vergangenheit dies mit der millis() Funktion versucht, doch nach längerem Betrieb fällt eine Ungenauigkeit auf.
Ich habe versucht einen Code zu schreiben. Dieser funktioniert nicht nach Plan. Die LED leuchtet, nach Betätigung des Tasters, ohne Ende.
//DS3231 zu Arduino Nano: SDA -> A4
// SCl -> A5
// VCC -> 5V
// GND -> GND
#include <Wire.h>
#include <DS3231.h>
RTClib myRTC;
void setup () {
Serial.begin(9600);
Wire.begin();
pinMode(2, INPUT_PULLUP); //Pull-up Taster Pin 2
pinMode(5, OUTPUT); //LED Pin 5
delay(500);
Serial.println("Ready!");
}
void loop () {
delay(1000); //kurze Pause
DateTime now = myRTC.now();
Serial.print(now.unixtime());
Serial.println();
int button1 = digitalRead(2); //Position des Tasters lesen
if (button1 == LOW) { //Wenn der Taster gedrückt ist
digitalWrite(5, HIGH); //Schalte LED ein
static long alteZeit = now.unixtime(); //Merken der Zeit, an der angeschaltet
if (now.unixtime() >= alteZeit + 10) { //Wenn aktuelle Zeit >/= als alte Zeit + 10Sec
digitalWrite(5, LOW); //Schalte LED aus
}
}
}
Was könnte das Problem sein und wie kann man es lösen?
Die Ungenauigkeit von millis() zeigt sich nach längerem Betrieb, in dem die angegebenen 10 Sekunden, bei dem Arduino, früher eintreffen, als 10 Sekunden in Wirklichkeit währen.
Nichts anderes erwartet. Wenn Du jedem Timer auch noch eine andere Ablaufzeit geben möchtest, musst Du für die 10 ebenso eine Konstante benutzen, wie für den Zeitmerker die Variable gesetzt ist.
Markier den Sketch oben als Lösung - dann findet man das auch mit der Suchfunktion unter gelösten Fragen.