Zwei Schleifen parallel mit Arduino Mega

Ich möchte gerne void motor, void loop und void luefter gleichzeitig laufen lassen.
Wie gehe ich das an? Es sollen auch weitere Threads dazu kommen.
Der Arduino wird doch hoffentlich Leistungsstark genug sein um mehrere Schleifen oder "Programme" gleichzeitig laufen lassen zu können?!

#include <Stepper.h>
#include <math.h>

const int buttonPin2 = 2;
const int buttonPin3 = 3;
const int buttonPin4 = 4;
const int buttonPin5 = 5;
const int ledPin =  7;
const int Lufter = 13;
const int stepsPerRevolution = 2048;

int button2 = 0;  
int button3 = 0;  
int button4 = 0; 
int button5 = 0; 

double Thermistor(int RawADC)
{
  double Temp;
  Temp = log(10000.0*((1024.0/RawADC-1))); 
  Temp = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * Temp * Temp ))* Temp );
  Temp = Temp - 273.15;
  return Temp;
}

Stepper Stepper1(stepsPerRevolution, 8,10, 9, 11);

void motor()
{
  if(Serial.available())
  {
    int Sbutton2 = Serial.read();
    if (Sbutton2 == 'A')
    {
        for (int i = 0; i < 10000; i++)
        {
          Stepper1.step(8);
          Sbutton2 = Serial.read();
          if (Sbutton2 == 'B')
          {
            break;
          }
        }
      }
    if (Sbutton2 == 'C')
    {
        for (int i = 0; i < 10000; i++)
        {
          Stepper1.step(-8);
          Sbutton2 = Serial.read();
          if (Sbutton2 == 'D')
          {
            break;
          }
        }
      }
   }
}


void luefter()
{
  int valone = analogRead(0);      
  double tempone = Thermistor(valone);   
  int valtwo = analogRead(1);      
  double temptwo = Thermistor(valtwo);
  double unterschied = temptwo - tempone;

  Serial.print(tempone);   
  Serial.print(" ");
  Serial.print(temptwo);  
  Serial.print(" ");
  Serial.println(unterschied);

  
  if (unterschied > 2)
  {
    digitalWrite (Lufter, HIGH);
    delay(3000);
  }
 else if (3 > unterschied && unterschied > 1)
  {
    for (int i = 0; i < 25; i++)
    {
      digitalWrite (Lufter, LOW);
      delay(70);
      digitalWrite (Lufter, HIGH);
      delay(50);
      
    }
  } 
  else
  {
    digitalWrite (Lufter, LOW);
    delay(3000);
  }
}

void setup()
{
  pinMode(buttonPin2, INPUT);
  pinMode(buttonPin3, INPUT);
  pinMode(buttonPin4, INPUT);
  pinMode(buttonPin5, INPUT);
  pinMode(ledPin, OUTPUT);
  pinMode(Lufter, OUTPUT);
   
  Stepper1.setSpeed(15);
  
  Serial.begin(9600);
}

void loop()
{
  button2 = digitalRead(buttonPin2);
  button3 = digitalRead(buttonPin3);
  button4 = digitalRead(buttonPin4);
  button5 = digitalRead(buttonPin5);

   if (button2 == HIGH)
   {
      Stepper1.step(10);
   }

   if (button3 == HIGH)
   {
      Stepper1.step(-10);
   }
}

Da kann der Arduino nichts für, wenn du ihm sagst, er soll das so machen! Schau dir BlinkWithoutDelay an und verstehe es. Und dann sagst du mir, was hier so alles falsch ist.

Ich möchte gerne void motor, void loop und void luefter gleichzeitig laufen lassen.
Wie gehe ich das an? Es sollen auch weitere Threads dazu kommen.

Fein!
Genau das richtige um meine TaskMacros zu Hochform auflaufen zu lassen.
Siehe: TaskMacros

Mal sehen, wann endlich eine Rückmeldung zu den Task Makros kommt. Bislang habe ich den Verdacht, daß sich noch keiner getraut hat, sie tatsächlich zu benutzen :frowning:

:grin:

Erschreckt den jungen Mann doch nicht gleich so!

:slight_smile:

Archery:
Ich möchte gerne void motor, void loop und void luefter gleichzeitig laufen lassen.
Wie gehe ich das an? Es sollen auch weitere Threads dazu kommen.
Der Arduino wird doch hoffentlich Leistungsstark genug sein um mehrere Schleifen oder "Programme" gleichzeitig laufen lassen zu können?!

Prinzipiell ja, das kann er.
aber: "parallel" (im Sinne von gleichzeitig) kann er das nicht, weil er einfach nur einen Kern hat.
Aber er kann das nacheinander.
Wenn die einzelnen Funktionen so programmiert sind, dass sie in wenigen Millisekunden abgearbeitet sind, dann wird auch jede alle paar Millisekunden aufgerufen. Das ist für fast alle Anwendungen "parallel" genug.

Das bedeutet aber vor allem: keine delay()!

Jede Funktion arbeitet nach dem Prinzip:
Aufruf.
muss ich was machen? Nein: return.
ja: ausführen,
merken, was ich zuletzt gemacht habe.
return.

Die Funktionweise habe ich mal anhand eines Nachtwächters erklärt:
withoutDelay: Der Nachtwächter

Hallo Gunther,

kannst Du Dein wunderschönes Nachtwächterbeispiel evtl. mal als vergrößerbare Grafik (PDF) oder als Text rein stellen?

Gruß Tommy

done.
BlinkwithoutDelay - Die Nachtwächtererklärung