Go Down

Topic: Mitprotokollieren wie lange ein Pin auf "high" geschaltet ist. (Read 1 time) previous topic - next topic

uwefed

Dann benutze das RAM des DS1307 (hat 56 Bit) und addiere einfach die Minuten.
Grüße Uwe

michael_x

#11
Nov 21, 2012, 09:28 pm Last Edit: Nov 21, 2012, 10:44 pm by michael_x Reason: 1
Quote
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:
Code: [Select]
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.

Burnsi

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.

uwefed

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

Burnsi

danke für die aufklärung.

aber warum stehen in dem code in jeder if Pin1Start = millis()?
müssten die nicht hochgezählt sein?

Go Up