TaskMacro an Geocaching Schaltung

Guten morgen

Ich habe euch letze Woche ja gefragt wegen den mehrern Sachen gleichzeitig ausführen meiner Geocaching-Schaltung. Ihr (vorallem combie) habt mir die TaskMacro Lirary empfohlen und combie ht mir meine Schaltung geschickt.
Ich habe es aber zu kompliziert gefunden und bin bei if und while geblieben. Es hat so auch funktioniert mit zwei Aufagben. Jetzt habe ich aber eine 3. Aufgabe hinten dran gehängt und es hat nicht mehr geklappt und es war sowieso zu kompliziert das ganze Sketch. Also habe ich mich dran gemacht meine Schaltung mit der TaskMacro Library zu schreiben (mit 3. Aufagbe) aber die Schaltung funktioniert nicht. :frowning: Hier bitte ich Sie zur Hilfe.
Das Problem ist das der SR04 nur ein mal die Distanz misst.

Code: [Select]

#include <SR04.h>
#include <TaskMacro.h>

const byte TRIG_PIN     = 3;
const byte ECHO_PIN     = 2;
const byte LED1         = 4;
const byte LED2         = 5;
const byte LICHTSENSOR  = A0;
int buttonpin = 6;
int LED3 = 13;
int clap = 0;
long detection_range_start = 0;
long detection_range = 0;
boolean status_lights = false;

SR04 sr04 = SR04(ECHO_PIN, TRIG_PIN);


void setup()
{
 Serial.begin(9600);
 pinMode(LED1, OUTPUT);
 pinMode(LED2, OUTPUT);
 pinMode(LED3, OUTPUT);
}

void SR04Task()
{
 static long distance;
 taskBegin();
 while (1)
 {
   distance = sr04.Distance();
   Serial.print(distance);
   Serial.println("cm");
   digitalWrite(LED1, distance >= 10 && distance <= 12);
   taskPause(3000);
 }
 taskEnd();
}

void LichtTask()
{
 static int Wert;
 taskBegin();
 while (1)
 {
   if (digitalRead(LED1))
   {
     Wert = analogRead(LICHTSENSOR);
     Serial.println(Wert);
     digitalWrite(LED2, Wert > 300);

   } else digitalWrite(LED2, LOW);
   taskPause(100);
 }
 taskEnd();
}
void KlatschTask()
{
 int status_sensor = digitalRead(buttonpin);
 taskBegin();
 while (1) {
   if (digitalRead(LED2))
   {
     if (status_sensor == 0)
     {
       if (clap == 0)
       {
         detection_range_start = detection_range = millis();
         clap++;
       }
       else if (clap > 0 && millis() - detection_range >= 50)
       {
         detection_range = millis();
         clap++;
       }
     }
     if (millis() - detection_range_start >= 400)
     {
       if (clap == 2)
       {
         if (!status_lights)
         {
           status_lights = true;
           digitalWrite(LED3, HIGH);
         }
         else if (status_lights)
         {
           status_lights = false;
           digitalWrite(LED3, LOW);
         }
       }
       clap = 0;
     }
   }
 }
   taskEnd();
}

void loop()
{
 SR04Task();
 LichtTask();
 KlatschTask();
}

Vielen Dank

Challenger

Warum setzt du den Sketch nicht in Code-Tags ?
Dann können wir den besser lesen. Auch auf mobilen Geräten.

Oh super, hat sich überschnitten.

Habs gemerkt und in Code Tags gemacht.

Der Code sieht soweit unverdächtig aus.

Woran merkst Du, daß der SR04 nur einmal mißt? Auch wenn die anderen Tasks nicht laufen?

Vielleicht liegt das Problem in der Messung selbst. Die dauert ja einige Zeit, bis ein Echo zurückkommt oder bis zum Timeout. Wenn also kein Echo kommt, und kein Timeout eingestellt ist, könnte das Programm da schon hängen bleiben.

Funktionieren die anderen beiden Tasks denn zufriedenstellend und es hängt nur der SR04?

Falls ja, versuch für den SR04 mal die NewPing Library.
Die habe ich bereits erfolgreich in verschiedenen Projekten eingesetzt und sie hat mich noch nie im Stick gelassen. Besonders das Thema Timeouts wird da gut gehandelt.