Go Down

Topic: 2 ineinander verschachtelte millis() Abfragen möglich? (Read 213 times) previous topic - next topic

progger

Mahlzeit zusammen  :)


Ich möchte alle 5 Sek eine Temp von einem DS18B20 ausgeben (10 Bit).


Dazu möchte ich alle 4 Sek EINEN Request senden und dann 1 Sek warten und dann die Temp auslesen und ausgeben.
Dann das ganze von vorn...

Leider funktioniert mein Test-Sketch nicht: Es wird nur alle 4 Sek der Request ausgeführt...
Geht es überhaupt mit 2 so verschachtelten millis()-Schleifen?

Ich könnte natürlich bei jeder Loop-Wiederholung einen Request senden, aber das wäre ja zu einfach  :D


Danke für eure Tipps! Gruezi



Code: [Select]
unsigned long actual, prevmillis {0};
constexpr unsigned short timeRequest {4000}, timeGet {1000};

void setup() {
  Serial.begin(74880);
}
void loop() {
  actual = millis();
  if (actual - prevmillis >= timeRequest) {
    Serial.print(actual);
    Serial.println(" - REQUEST");
    actual = millis();
    if (actual - (prevmillis + timeRequest) >= timeGet) {
      Serial.print(actual);
      Serial.println(" - GET");
      prevmillis = actual;
    }
    prevmillis = actual;
  }
}



Rentner

Hallo,

ich glaube Du das das mit der Verwendung von millis() noch nicht ganz verstanden und auch die if Verzweigung verwechselt Du möglicherweise mit einer Schleife.

Nachtrag
Du konntest eine Schrittkette, Ablaufsteuerung  aufbauen
1 4s warten
2 1s warten
3 auslesen, anzeigen

Schau Dir aus der Lib das Beispile "waitforConversion" an da wird gezeigt wie man den Sensor asyschron abfragt.

Heinz

noiasca

ich bin da wieder bei einer Schrittkette, Finite State Machine. Weils einfach schön lesbar ist und sich überschaubar erweitern lässt:

Code: [Select]

unsigned long currentMillis, previousMillis {0};
constexpr unsigned short timeRequest {4000}, timeGet {1000};
enum class Status {IDLE, STEP1} status;

void setup() {
  Serial.begin(115200);
}
void loop() {
  currentMillis = millis();
  switch (status)
  {
    case Status::IDLE :
      if (currentMillis - previousMillis >= timeRequest)
      {
        Serial.print(currentMillis);
        Serial.println(" - REQUEST");
        previousMillis = currentMillis;
        status = Status::STEP1;
      }
      break;
    case Status::STEP1:
      if (currentMillis - previousMillis >= timeGet)
      {
        Serial.print(currentMillis);
        Serial.println(" - Sensor lesen");
        previousMillis = currentMillis;
        status = Status::IDLE;
      }
      break;
  }
}


13:14:50.514 -> 4000 - REQUEST
13:14:51.521 -> 5000 - Sensor lesen
13:14:55.549 -> 9000 - REQUEST
13:14:56.521 -> 10000 - Sensor lesen
13:15:00.538 -> 14000 - REQUEST
13:15:01.570 -> 15000 - Sensor lesen
13:15:05.570 -> 19000 - REQUEST
13:15:06.606 -> 20000 - Sensor lesen
13:15:10.619 -> 24000 - REQUEST
13:15:11.611 -> 25000 - Sensor lesen
13:15:15.615 -> 29000 - REQUEST
13:15:16.651 -> 30000 - Sensor lesen
13:15:20.643 -> 34000 - REQUEST
13:15:21.665 -> 35000 - Sensor lesen
13:15:25.687 -> 39000 - REQUEST
13:15:26.686 -> 40000 - Sensor lesen
how to react on postings:
- post helped: provide your final sketch, say thank you & give karma.
- post not understood: Ask as long as you understand the post
- post is off topic (or you think it is): Stay to your topic. Ask again.
- else: Ask again.

combie

Die eher langweilige Variante:
Code: [Select]
#include <TaskMacro.h>
#include <Streaming.h>


constexpr bool stromausfall {false};

Task sensorisiere()
{
 
  taskBegin();
  while( not stromausfall )
  {

    // hier messung starten
    Serial << "Messung in Auftrag gegeben" << endl;
    taskPause(1000);
   
    // hier sensor lesen
    Serial << "Messwert gelesen" << endl;

    // warten auf nächsten Messzyklus
    taskPause(4000);
   
  }
  taskEnd();
}


void setup()
{
  Serial.begin(9600);
  Serial << "Start: "<< __FILE__ << endl;
}

void loop()
{
  sensorisiere();
}
Heute war Gestern Morgen.
Heute ist Morgen Gestern.
Morgen ist Heute Gestern.
Gestern war Heute Morgen

progger

Super, viele Dank euch!

Daraus kann ich was bauen :)

combie

Heute war Gestern Morgen.
Heute ist Morgen Gestern.
Morgen ist Heute Gestern.
Gestern war Heute Morgen

Schuppeste

#6
Oct 19, 2020, 08:44 am Last Edit: Oct 19, 2020, 08:51 am by Schuppeste
Ja?
Damit bestimmt einfach so?
Code: [Select]
#include <TaskMacro.h>

im Prinzip fehlt doch nur eine Kaskade.. nur als Beispiel, könnte vom Ergebnis abweichen. (Selbst draufkommen)
Code: [Select]

unsigned long actual, prevmillis {0};
constexpr unsigned short timeRequest {4000}, timeGet {1000};

void setup() {
  Serial.begin(74880);
}
void loop() {
  actual = millis();
  if (actual - prevmillis >= timeRequest) {
    Serial.print(actual);
    Serial.println(" - REQUEST");
    }else if (actual - (prevmillis + timeRequest) >= timeGet) {
      Serial.print(actual);
      Serial.println(" - GET");
      prevmillis = actual;
    }
    prevmillis = actual;
 
}

noiasca

hast du das mal in einen Arduino geladen? eher nicht oder?
Das siehst doch beim drüberlesen, dass das faul ist.
Merke: Code immer testen vor dem Posten!(!!!)
how to react on postings:
- post helped: provide your final sketch, say thank you & give karma.
- post not understood: Ask as long as you understand the post
- post is off topic (or you think it is): Stay to your topic. Ask again.
- else: Ask again.

Schuppeste

hast du das mal in einen Arduino geladen? eher nicht oder?
Habe ich doch dabei geschrieben..
Es ist wohl sogar für einen anfänger erkenntlich das dem TO lediglich der Tip für If Else If fehlt.
Ich bin nicht dazu da ihm seinen halbfunktionierenden code in Ordnung zu bringen, oder ihm Weisheiten meiner Programmierart aufzuzwingen. Für mich fehlt in seinem Code nur ein else und eine eventuelle vertauschung. (Ist nicht mein Code, daher nur als Beispiel ungetestet)

combie

hast du das mal in einen Arduino geladen? eher nicht oder?
Das siehst doch beim drüberlesen, dass das faul ist.
Merke: Code immer testen vor dem Posten!(!!!)
Ja, das habe ich getan!

Hier nochmal ein etwas modifizierter Testcode, und in Anschluss die Ausgaben
Code: [Select]
#include <TaskMacro.h>
#include <Streaming.h>


constexpr bool stromausfall {false};

Task sensorisiere()
{
  
  taskBegin();
  while( not stromausfall )
  {

    // hier messung starten
    Serial << "Messung in Auftrag gegeben" << endl;
    taskPause(1000);
    
    // hier sensor lesen
    Serial << "Messwert gelesen" << endl;

    // warten auf nächsten Messzyklus
    taskPause(4000);
    
  }
  taskEnd();
}


Task loopsPerSecond()
{
  static unsigned long loops {0};
  loops++;
  
  taskBegin();
  while( not stromausfall )
  {
    taskPause(1000);
    Serial << "Loops per Second: " << loops << endl;
    loops = 0;
  }
  taskEnd();
}


void setup()
{
  Serial.begin(9600);
  Serial << "Start: "<< __FILE__ << endl;
}

void loop()
{
  sensorisiere();
  loopsPerSecond();
}



Ausgaben:
Code: [Select]
Start: E:\Programme\arduino\portable\sketchbook\sketch_oct18a\sketch_oct18a.ino
Messung in Auftrag gegeben
Messwert gelesen
Loops per Second: 65689
Loops per Second: 64123
Loops per Second: 64076
Loops per Second: 64142
Messung in Auftrag gegeben
Loops per Second: 64076
Messwert gelesen
Loops per Second: 65703
Loops per Second: 64057
Loops per Second: 64142
Loops per Second: 64142
Messung in Auftrag gegeben
Loops per Second: 64129
Messwert gelesen
Loops per Second: 65706
Loops per Second: 64067
Loops per Second: 64142
Loops per Second: 64076
Messung in Auftrag gegeben
Loops per Second: 64129
Messwert gelesen
Loops per Second: 65639
Heute war Gestern Morgen.
Heute ist Morgen Gestern.
Morgen ist Heute Gestern.
Gestern war Heute Morgen

Peter-CAD-HST

Moin  progger
ich habe eine getestete einfache Lösung zu deinem Thema, allerdings ungeschachtelt  :)
Code: [Select]
#define myBaud 1000000
#define yourBaud 9600
#define ProjektName "https://forum.arduino.cc/index.php?topic=709636.0"
unsigned long millisRequestInterval = 4000;
unsigned long millisAusgabeInterval = 1000;
unsigned long millisRequest = 0;
unsigned long millisAusgabe = 0;
void setup() {
  // put your setup code here, to run once:
  Serial.begin(myBaud);
  Serial.print("File: ");
  Serial.println(__FILE__);
  Serial.print("Projekt: ");
  Serial.println(ProjektName);
  millisRequest = millis();
}
void loop() {
  // put your main code here, to run repeatedly:
  if ((millis() - millisRequest > millisRequestInterval) && millisRequest)
  {
    millisAusgabe = millis();
    millisRequest=0;
    Serial.println("Request");
  }
  if ((millis() - millisAusgabe > millisAusgabeInterval) &&  millisAusgabe)
  {
    millisRequest = millis();
    millisAusgabe = 0;
    Serial.println("Ausgabe");
  }
}

Viel Spass beim Testen
Gruß Peter
und gesund bleiben
KISS Q&D - keep calm and carry on - mind the gap - beware of sharks! -

progger

Muss ja auch nicht verschachtelt sein, ich dachte halt nur, das wäre dann die Lösung   :-[

Danke für deinen Vorschlag, das sieht auch sehr anfängerfreundlich und nachvollziehbar aus   :smiley:

Peter-CAD-HST

hast du das mal in einen Arduino geladen? eher nicht oder?
Das siehst doch beim drüberlesen, dass das faul ist.
Merke: Code immer testen vor dem Posten!(!!!)
oder als <ungetestet> vermerken
KISS Q&D - keep calm and carry on - mind the gap - beware of sharks! -

Peter-CAD-HST

Muss ja auch nicht verschachtelt sein, ich dachte halt nur, das wäre dann die Lösung   :-[

Danke für deinen Vorschlag, das sieht auch sehr anfängerfreundlich und nachvollziehbar aus   :smiley:
man muss sich ja nicht immer die Hose mit einer Kneifzange anziehen.  :)
KISS Q&D - keep calm and carry on - mind the gap - beware of sharks! -

Go Up