time counter, how do?

/* wie kann man die Zeit hoch zählen, wenn nur der Pin auf HIGH steht. I will count the time only if pin is HIGH?
Danke!*/
#include <Wire.h>
#include <MPU6050.h>
 
MPU6050 mpu;

long detectedTime;
 
void setup()
{
  Serial.begin(9600);
  Serial.println("Initialize MPU6050");
  while(!mpu.begin(MPU6050_SCALE_2000DPS, MPU6050_RANGE_2G))
  {
    Serial.println("Error");
    delay(1000);
  }
  pinMode(51, OUTPUT);
   
  mpu.setThreshold(2);
}
 
void loop()
{
  Vector rawGyro = mpu.readRawGyro();
  Vector normGyro = mpu.readNormalizeGyro();
  float normal_x = normGyro.XAxis;
  float normal_y = normGyro.YAxis;
  float normal_z = normGyro.ZAxis;
  /*
  Serial.print(" Xnorm = ");
  Serial.print(normal_x);Serial.print(" raw ");Serial.print(rawGyro.XAxis);
  Serial.print(" Ynorm = ");
  Serial.print(normal_y);
  Serial.print(" Znorm = ");
  Serial.println(normal_z);
   */
  if(abs(normal_x) + abs(normal_y) + abs(normal_z) > 0.2)
  {
    digitalWrite(51, HIGH);
    detectedTime = millis();
  }else{
    digitalWrite(51, LOW);
  }

  Serial.print("TIME: ");Serial.println(detectedTime);
}

Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).
Das kannst Du auch noch nachträglich ändern.

Weiterhin stelle bitte einen vollständigen Code und nicht nur ein Fragmeint ein.

Gruß Tommy

Sowas nennt man gern "Betriebsstundenzähler", wobei das mit den "Stunden" nicht so eng zu sehen ist. Können auch ms sein.
Je nach dem wie genau du es haben willst, gibt es zwei Möglichkeiten:
A) regelmäßig (z.B. jede Sekunde) nachsehen, ob das Signal da ist, gegebenenfalls den Zähler erhöhen
B) bei jedem Signalwechsel entweder Zeit mrrken oder Differenz zur vorigen Zeit bilden und auf den Zähler aufaddieren.

Versuche mal dies (ungetestet):

unsigned long aktTime, oldTime, countTime;

int pin=13;

void loop(){
  aktTime = millis();
  if (digitalRead(pin) && (aktTime != oldTime)){
    countTime++;
    oldTime = aktTime;
    Serial.println(countTime);
  }
}

(ungetestet)

Die Geschwindigkeit wird durch Serial.begin vorgegeben, da je loop-Durchlauf eine Ausgabe erfolgt.
Darunter leidet dann evtl. auch etwas die "Genauigkeit", da ein Durchlauf mehrere ms dauern kann, weil der ausgabepuffer voll ist.
(z.B. bei 9600 Bd 5 .. 12 ms je Durchlauf)

Besser nur jede Sekunde eine Ausgabe oder im Endausbau noch seltener, aber schöner formatiert. :slight_smile:

Hi

Wenn Du dabei mit Differenzen rechnest (zeit_jetzt-zeit_vorhin), ist Es 'egal', wie lange loop() für einen Durchlauf braucht.

MfG

Edit
DU->Du
(bekomme den Shift-Finger zu langsam hoch ...)

Niemand hat bemerkt, daß ich bei millis() die Klammern vergessen hatte. Oh je.

michael_x:
(z.B. bei 9600 Bd 5 .. 12 ms je Durchlauf)

Im geheimen setup() hatte ich natürlich eine höhere Baudrate :wink:

michael_x:
Je nach dem wie genau du es haben willst, gibt es zwei Möglichkeiten:
A) regelmäßig (z.B. jede Sekunde) nachsehen, ob das Signal da ist, gegebenenfalls den Zähler erhöhen
B) bei jedem Signalwechsel entweder Zeit mrrken oder Differenz zur vorigen Zeit bilden und auf den Zähler aufaddieren.

Hallo.

Danke erst mal!

Genau, das soll einen Betriebsstundenzähler werden. Ich will die Zeit so genau wie möglich zählen. Ich habe meinen Code erneut (vollig) hinzugefügt.

Eine Frage, du hast geschrieben:
" B) bei jedem Signalwechsel entweder Zeit mrrken oder Differenz zur vorigen Zeit bilden und auf den Zähler aufaddieren"

-Wie kann man von einem Zähler eine richtige Zeit bastelt?
-Wie genau wird das sein?

nazh:
-Wie kann man von einem Zähler eine richtige Zeit bastelt?

Was verstehst du unter richtiger oder falscher Zeit?

Gruß Fips

Derfips:
Was verstehst du unter richtiger oder falscher Zeit?

Richtig: Sa+So
Falsch: Mo-Fr

SCNR

Gregor

gregorss:
Richtig: Sa+So
Falsch: Mo-Fr

Urlaub: Mo- So

Gruß Fips

Hi

Wie ermittelst Du denn momentan, ob Du von der Arbeit nach Hause darfst?
(also jetzt ohne Brüllhorn und Sklavenpeitscher)
So in etwas sollte Das der Arduino auch machen - nur ist Seine Armbanduhr die Funktion millis();

MfG

postmaster-ino:
Wie ermittelst Du denn momentan, ob Du von der Arbeit nach Hause darfst?
(also jetzt ohne Brüllhorn und Sklavenpeitscher)
So in etwas sollte Das der Arduino auch machen - nur ist Seine Armbanduhr die Funktion millis();

Wenn man nicht millis() nützt nur Zähler hoch zählt, z.b. wie folgt:

int pin = 13; // input pullup pin
long couter;

void loop(){

 if (digitalRead(pin) == LOW){  
 counter++;                           // das ist keine richtige Zeit. Wir nützen nicht millis();
}
Serial.println(counter); 
}

Kann mir bitte jemand einen Beispiel zeigen, wie man Aktivität zählt?
Zum Beispiel so kann man nicht machen, wie unten ist. Die Frage ist, wie macht man?

int pin = 13; // input pullup pin
long detectedTime;

void loop(){

 if (digitalRead(pin) == LOW){ 
    detectedTime = millis();                       
}
Serial.println(detectedTime);
}

Derfips:
Was verstehst du unter richtiger oder falscher Zeit?

Gruß Fips

Unter richtige Zeit verstehe ich millis() und nicht richtige Zeit counter++;

nazh:
Kann mir bitte jemand einen Beispiel zeigen, wie man Aktivität zählt?

Beispiele hätte ich für den Esp8266 und den Esp32!

Beispiel für Betriebsstundenzähler seit Neustart des Esp....

String runtime() {
  static uint8_t rolloverCounter = 0;
  static uint32_t letzteMillis = 0;
  uint32_t aktuelleMillis = millis();
  if (aktuelleMillis < letzteMillis) {       // prüft Millis Überlauf
    rolloverCounter++;
  }
  letzteMillis = aktuelleMillis;
  uint32_t sek = (0xFFFFFFFF / 1000 ) * rolloverCounter + (aktuelleMillis / 1000);
  char buf[20];
  snprintf(buf, sizeof(buf), sek < 86400 || sek > 172800 ? "%d Tage %02d:%02d:%02d" : "%d Tag %02d:%02d:%02d", sek / 86400, sek / 3600 % 24, sek / 60 % 60, sek % 60);
  return buf;
}

Aktueller Stand bei einem meiner Esp...

Hilft dir das weiter?

Gruß Fips

Hi nazh,

unsigned long sumTime;
unsigned long startTime;
bool started = false; 

void setup()
{
  ...
}

void loop()
{

...

if(abs(normal_x) + abs(normal_y) + abs(normal_z) > 0.2){
 
    if (started == false){
      digitalWrite(51, HIGH);
      startTime = millis(); // Rollover nach 50 Tagen!
      started = true; 
    }
    
  } else {
      
    if (started == true){
      digitalWrite(51, LOW);
      sumTime = sumTime + millis() - startTime; 
      started = false;
    }
    
  }

...

}

Das sollte dir helfen, hier wird einfach ein FLAG hergenommen, um zu überprüfen ob der Timer bereits läuft. Ich habe es auf einem Arduino UNO getestet. Sollte also funktionieren.

PS: Du kannst den Code auch noch verkürzen, er ist gerade zur Anschauung nur aufgedröselt.

Beste Grüße,
Saber

Super!!!

Vielen Dank Jungs.