Mitprotokollieren wie lange ein Pin auf "high" geschaltet ist.

hallo,

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?

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.

Versuch es mal mit millis().
Wie du das mit der Sd-Karte machst weiß ich nicht.

#define pin_1 13
long previousMillis = 0;        

void setup() {
  pinMode(pin_1, OUTPUT);      
}

void loop()
{
unsigned long currentMillis = millis();
while (pin_1 == HIGH) {
previousMillis = currentMillis;   
       }

if (pin_1 == LOW) {
// previosMillis aud SD schreiben
   }

}

Ich weiß aber nicht ob es funktioniert :slight_smile:
Edit: Doch nicht erster

Addi

Burnsi:
hallo,

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.

gibt es noch andere einheiten wie millis?

klar :-))))))))
millis/1000 gleich Sekunden,
millis/60000 gleich Minuten
millis/3600000 gleich Stunden

Es gibt noch die micros. Aber noch feiner aufgelöst willst du ja nicht. :smiley: Aus den millis kannst du aber auch sehr leicht Stunden, Minuten und Sekunden generieren.

Aber kann ich mehrere Zustände gleichzeitig mit millis überwachen?
Ich nutze millis bereits in meinem Programm.

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.

Grüße Uwe

readpinx =digitalRead(pinx);
if (readpinx ==1 && readpinx!= statuspinx)
{
Einschaltzeit abspeichern.
statuspinx = readpinx
}
if (readpinx == 0 && readpinx!= statuspinx)
{
Ausschaltzeit abspeichern.
statuspinx = readpinx
}

ich brauche eigentlich nicht die genauen zeiten sondern nur die addierten stunden die der pin auf 1 geschaltet war.

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

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

danke für die aufklärung.

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

Mein Fehler beim copy und Paste, der einfachheit halber oben korr.

Sorry, gut beobachtet :wink:

ok :slight_smile:

ich werds in der nächsten zeit versuchen bei mir einzubauen, dann werd ich euch wieder nerven :slight_smile: