Go Down

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

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?

sth77

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.
Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

Addi

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
/ \    _|  _| o
 /--\ (_| (_| |

uwefed


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

Burnsi

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?

maverick1509

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

sth77

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.
Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

Burnsi

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

uwefed

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
}
 

Burnsi

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

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