Arduino Forum

International => Deutsch => Topic started by: Burnsi on Nov 21, 2012, 04:03 pm

Title: Mitprotokollieren wie lange ein Pin auf "high" geschaltet ist.
Post by: Burnsi on Nov 21, 2012, 04:03 pm
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?
Title: Re: Mitprotokollieren wie lange ein Pin auf "high" geschaltet ist.
Post by: sth77 on Nov 21, 2012, 04:32 pm
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.
Title: Re: Mitprotokollieren wie lange ein Pin auf "high" geschaltet ist.
Post by: Addi on Nov 21, 2012, 04:34 pm
Versuch es mal mit millis().
Wie du das mit der Sd-Karte machst weiß ich nicht.
Code: [Select]

#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 :)
Edit: Doch nicht erster

Addi
Title: Re: Mitprotokollieren wie lange ein Pin auf "high" geschaltet ist.
Post by: uwefed on Nov 21, 2012, 05:21 pm

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
Title: Re: Mitprotokollieren wie lange ein Pin auf "high" geschaltet ist.
Post by: Burnsi on Nov 21, 2012, 05:35 pm
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?
Title: Re: Mitprotokollieren wie lange ein Pin auf "high" geschaltet ist.
Post by: maverick1509 on Nov 21, 2012, 05:58 pm
klar :-))))))))
millis/1000 gleich Sekunden,
millis/60000  gleich Minuten
millis/3600000 gleich Stunden
Title: Re: Mitprotokollieren wie lange ein Pin auf "high" geschaltet ist.
Post by: sth77 on Nov 21, 2012, 05:59 pm
Es gibt noch die micros. Aber noch feiner aufgelöst willst du ja nicht.  :D Aus den millis kannst du aber auch sehr leicht Stunden, Minuten und Sekunden generieren.
Title: Re: Mitprotokollieren wie lange ein Pin auf "high" geschaltet ist.
Post by: Burnsi on Nov 21, 2012, 06:17 pm
Aber kann ich mehrere Zustände gleichzeitig mit millis überwachen?
Ich nutze millis bereits in meinem Programm.
Title: Re: Mitprotokollieren wie lange ein Pin auf "high" geschaltet ist.
Post by: uwefed on Nov 21, 2012, 07:39 pm
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

Code: [Select]
readpinx =digitalRead(pinx);
if (readpinx ==1 && readpinx!= statuspinx)
{
Einschaltzeit abspeichern.
statuspinx = readpinx
}
if (readpinx == 0 && readpinx!= statuspinx)
{
Ausschaltzeit abspeichern.
statuspinx = readpinx
}
 
Title: Re: Mitprotokollieren wie lange ein Pin auf "high" geschaltet ist.
Post by: Burnsi on Nov 21, 2012, 07:45 pm
ich brauche eigentlich nicht die genauen zeiten sondern nur die addierten stunden die der pin auf 1 geschaltet war.
Title: Re: Mitprotokollieren wie lange ein Pin auf "high" geschaltet ist.
Post by: uwefed on Nov 21, 2012, 08:01 pm
Dann benutze das RAM des DS1307 (hat 56 Bit) und addiere einfach die Minuten.
Grüße Uwe
Title: Re: Mitprotokollieren wie lange ein Pin auf "high" geschaltet ist.
Post by: michael_x on Nov 21, 2012, 09:28 pm
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.
Title: Re: Mitprotokollieren wie lange ein Pin auf "high" geschaltet ist.
Post by: Burnsi on Nov 21, 2012, 10:06 pm
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.
Title: Re: Mitprotokollieren wie lange ein Pin auf "high" geschaltet ist.
Post by: uwefed on Nov 21, 2012, 10:31 pm
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
Title: Re: Mitprotokollieren wie lange ein Pin auf "high" geschaltet ist.
Post by: Burnsi on Nov 21, 2012, 10:37 pm
danke für die aufklärung.

aber warum stehen in dem code in jeder if Pin1Start = millis()?
müssten die nicht hochgezählt sein?
Title: Re: Mitprotokollieren wie lange ein Pin auf "high" geschaltet ist.
Post by: michael_x on Nov 21, 2012, 10:42 pm
Mein Fehler beim copy und Paste, der einfachheit halber oben korr.

Sorry, gut beobachtet ;)
Title: Re: Mitprotokollieren wie lange ein Pin auf "high" geschaltet ist.
Post by: Burnsi on Nov 21, 2012, 10:44 pm
ok  :)

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