ich möchte mitschreiben wie lange ein einzelner pin auf high geschaltet ist.
abgefragt sollen 3 versch. digitale pins werden.
das ergebnis soll auf eine sd karte geschrieben werden (evtl jede stunde aktualisieren)
Prinzipiell ist das ganz einfach: Flankenwechsel von LOW auf HIGH erkennen, mit millis() die Anfangszeit nehmen, beim Flankenwechsel von HIGH auf LOW die Differenz der aktuellen Millisekunden und der Anfangszeit bilden, fertig.
ich möchte mitschreiben wie lange ein einzelner pin auf high geschaltet ist.
abgefragt sollen 3 versch. digitale pins werden.
das ergebnis soll auf eine sd karte geschrieben werden (evtl jede stunde aktualisieren)
wie könnte ich sowas bewerkstelligen?
Von welchen Zeiten sprechen wir?
Die Pins sollen alle gleichzeitig kontrolliert werden?
Grüße Uwe
die zeiten brauchen nicht sehr genau zu sein.
die pins werden höchstens 8h auf high geschaltet sein.
die auflösung der zeiten können sehr grob sein, evtl 0,25h.
Es gibt noch die micros. Aber noch feiner aufgelöst willst du ja nicht. Aus den millis kannst du aber auch sehr leicht Stunden, Minuten und Sekunden generieren.
Da Du Stunden protokollieren willst und ein Viertelstunde Genauigkeit ausreichend ist rate ich Dir zu einer RTC zb einem DS1307. Da speicherst Du einfach die Einschalt/Ausschaltzeit ab.
Die Eingänge kannst Du einfach kontrollieren. Konzept-Codebeispiel unten. Die geliche Kontrolle führst Du für jedes Pin durch.
Aber kann ich mehrere Zustände gleichzeitig mit millis überwachen?
Ich nutze millis bereits in meinem Programm.
Die Frage sagt mir, dass Uwe's Vorschlag mit dem DS1307 RAM , der eigentlich richtig ist, und sogar erlaubt, zwischendurch den Reset-Knopf zu drücken,
erstmal zu weit geht.
also, ganz einfach:
unsigned long Pin1Start=0; // 0 heisst: läuft grade nicht, sonst die letzte Startzeit
unsigned long Pin2Start=0;
unsigned long Pin3Start=0;
unsigned int Dauer1 = 0; // hier zählen wir die Sekunden der letzten Einschalt-Perioden, z.B. bis sie auf die SD geschrieben werden.
void loop()
{
if ( digitalRead(Pin1) == HIGH && Pin1Start == 0) Pin1Start = millis();
if ( digitalRead(Pin2) == HIGH && Pin2Start == 0) Pin2Start = millis();
if ( digitalRead(Pin3) == HIGH && Pin3Start == 0) Pin3Start = millis();
if ( digitalRead(Pin1) == LOW && Pin1Start != 0)
{
Dauer1 += (millis()-Pin1Start) / 1000 ; // in sek. auf den bisherigen Wert aufaddieren
Pin1Start = 0;
}
// ... genauso für Pin2 und 3
}
Das war, wie gesagt erstmal ganz einfach zum Zeigen, wie mehrere Zeiten parallel gleichzeitig gezählt werden können.
Es geht auch anders und hat sicher Besonderheiten, aber darüber reden wir erst wenn du fragst.
edit: Danke für den Hinweis auf den, jetzt hoffentlich verschwundenen, Tippfehler.
ja, bin noch anfänger.
aber der code leuchtet mir ein und ist verständlich.
ich hatte den millis befehl missverstanden und wusste nicht dass man mehrmals gleichzeitig zählen kann.
millis() ist kein Befehl sondern eine Funktion (wie fast alles in C).
Millis gibt die verstrichenen Millisekunden ab Einschaltmoment / Reset zurück.
Somit liegt es an Dir mehrere Millis-Werte für verschiedene Events abzuspeichern.
Millis läuft nach 49,5 Tagen über (die millis() fängt wieder bei Null an zu zählen) Durch die richtige Differenzbildung des Startwertes mit dem Endwert kann auch während des überlaufs die richtige Zeitdifferenz errechnet werden.
Grüße Uwe