Pages: [1] 2   Go Down
Author Topic: Mitprotokollieren wie lange ein Pin auf "high" geschaltet ist.  (Read 828 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 20
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

Germany
Offline Offline
Edison Member
*
Karma: 46
Posts: 2310
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

Offline Offline
Full Member
***
Karma: 5
Posts: 193
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Versuch es mal mit millis().
Wie du das mit der Sd-Karte machst weiß ich nicht.
Code:
#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 smiley
Edit: Doch nicht erster

Addi
Logged

  / \    _|  _| o
 /--\ (_| (_| |

Forum Moderator
BZ (I)
Online Online
Brattain Member
*****
Karma: 249
Posts: 21183
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 20
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

Offline Offline
Sr. Member
****
Karma: 7
Posts: 359
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Germany
Offline Offline
Edison Member
*
Karma: 46
Posts: 2310
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

Offline Offline
Newbie
*
Karma: 0
Posts: 20
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Forum Moderator
BZ (I)
Online Online
Brattain Member
*****
Karma: 249
Posts: 21183
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
readpinx =digitalRead(pinx);
if (readpinx ==1 && readpinx!= statuspinx)
{
Einschaltzeit abspeichern.
statuspinx = readpinx
}
if (readpinx == 0 && readpinx!= statuspinx)
{
Ausschaltzeit abspeichern.
statuspinx = readpinx
}
 
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 20
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Forum Moderator
BZ (I)
Online Online
Brattain Member
*****
Karma: 249
Posts: 21183
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Germany
Offline Offline
Faraday Member
**
Karma: 56
Posts: 2975
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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.
« Last Edit: November 21, 2012, 04:44:36 pm by michael_x » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 20
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Forum Moderator
BZ (I)
Online Online
Brattain Member
*****
Karma: 249
Posts: 21183
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 20
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

danke für die aufklärung.

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

Pages: [1] 2   Go Up
Jump to: