Millis Schleife funktioniert nicht

Hallo,

die erste Schleife soll solange laufen, bis mein Interwall von 5 Sekunden abgelaufen ist. Danach (else) soll die aktuelle Zeit als vorherige gespeichert werden und die erste Schleife wieder solange durchlaufen werden, bis meine 5 Sek abgelaufen sind. Hier das Prog:

#include <DFRobot_MAX30102.h>

DFRobot_MAX30102 particleSensor;

float Signalmax = 1;
float Signalpeak = 1;
float DC;
float AC;
float Summeinterwall = 0;
float Signal; 
float Durchgang;
float Perfusionsindex;
float Signalmin;
float previousMillis;
void setup() {

  Serial.begin(115200);
  while (!particleSensor.begin()) {
    Serial.println("MAX30102 was not found");
    delay(1000);
  }

    

  particleSensor.sensorConfiguration(/*ledBrightness=*/0x1F, /*sampleAverage=*/SAMPLEAVG_4, \
                                  /*ledMode=*/MODE_MULTILED, /*sampleRate=*/SAMPLERATE_400, \
                                  /*pulseWidth=*/PULSEWIDTH_411, /*adcRange=*/ADCRANGE_4096);
}



void loop() {
 // function1
Signal = (particleSensor.getRed());
 unsigned long currentMillis = millis(); 
 const long interval = 5000; 


  if (currentMillis - previousMillis <= interval) 
  
  {  
    
        Serial.print("im Interwall");
        Serial.print('\n');

    if (Signal>Signalmax) { Signalmax = Signal; }
    if (Signal<Signalmin) { Signalmin = Signal; }

    Summeinterwall = Summeinterwall + Signal;
    Durchgang = Durchgang +1;

        Serial.print(Summeinterwall);
        Serial.print(Durchgang);
        Serial.print('\n');
    
  }

  else

  { Signalmax = Signalpeak; 

      Serial.print("Interwall abgelaufen");
      Serial.print('\n');

    DC = (Signalpeak - (Summeinterwall/Durchgang))*2;
        Serial.print(DC);

    AC = Signalpeak - DC;
        Serial.print(AC);

    Perfusionsindex = (AC/DC)*100;
    Serial.print("Perfusionsindex");
    Serial.print(Perfusionsindex);
    Serial.print('\n');

    Signalmax = 1; Summeinterwall =1; Durchgang = 0;}
    previousMillis = currentMillis; 
    Serial.print("Aktuelle Zeit auf vorherige gesetzt");
     Serial.print('\n');

}

Seltsamerweise bekomme ich aber folgendes im seriellen Monitor:

Aktuelle Zeit auf vorherige gesetzt
im Interwall
2584380.001446.00
Aktuelle Zeit auf vorherige gesetzt
im Interwall
2586232.001447.00
Aktuelle Zeit auf vorherige gesetzt
im Interwall
2588076.001448.00
Aktuelle Zeit auf vorherige gesetzt

Jemand eine Idee?

float previousMillis;

Das sollte unsigned long sein.

1 Like

Auch musst du zwischen de zwei Phasen unterscheiden, wenn ich deine Logik verstehe.
float Durchgang;
könnte in einen Bereich kommen, wo unendlich+1==unendlich gilt.

Da du das Zeitverhalten durch die Geschwindigkeit der Serial.print Ausgaben steuerst, solltest du durch eine langsamere Geschwindigkeit mehr Überblick behalten. Oder besser das Ganze überdenken.

Da ist noch ein Klammerfehler drinnen, das ist korrekt, den habe ich aber bereits gefunden und ausgebessert, zusammen mit dem Tipp oben klappt es nun mit den Millis. :slight_smile:

Grüße

Ich hab mal ne Frage:
Du setzt:

float Signalpeak = 1;

und verwendest die nur noch um Signalmax damit zu setzen:

  { Signalmax = Signalpeak; 

Dann kannst Du die auch const machen.
Oder ist das andersrum?

Und dann würde ich nicht alles in globale Variablen packen.
Aus summeintervall, Durchgang, signalmin, signalmax errechnest Du sowieso zur Laufzeit alles. Verschwende keinen Speicherplatz.
Und weil wir schon bei Verschwendung sind: Deine float für Signal ist überflüssig. (So auch für signalmin/signalmax etc.)
Die Funktion get() gibt einen uint32_t zurück.

Und dann noch ein gut gemeinter Kosmetiktipp: Schreib nicht Einzeiler für die Ausgabe auf dem SerMon, sondern bündel das soweit es geht. Wenn Du mal einen Block nicht sehen willst, kannst Du den einfacher ausblenden, als wenn Du jede Zeile auskommentierst...

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.