Befehl wird nicht erkannt

Hallo zusammen,

ich habe in Zeile in der bei einem bestimmten Wert der Pin 9 bei dem Wert zwischen 2.98 und 3.02 angesprochen wird. Ist dieser Befehl erledigt, ist es soweit in Ordnung. Jetzt habe ich einen weiteren Wert zwischen 5.00 und 5.10 in einer weiteren Zeile festgelegt. Aber dieser wird nicht ausgeführt, weil der erste wahrscheinlich bearbeitet wurde. Ich weiß nicht wie ich das Problem löse, das die Zeile zwischen mit dem Wert zwischen 5.00 und 5.10 ausgeführt wird, wenn die erste Zeile mit dem Wert zwischen 2.98 und 3.02 ausgeführt wurde oder auch nicht.

#include <Adafruit_ADXL345_U.h> 
#include <Adafruit_Sensor.h>    
Adafruit_ADXL345_Unified Sensor = Adafruit_ADXL345_Unified();


#define vib 9
bool done = false;  

void setup()
{
  Serial.begin(9600); 
  pinMode(vib, OUTPUT); 
  Sensor.begin();     
}

void loop()
{
  sensors_event_t sensor; 
  Sensor.getEvent(&sensor); 

  if ((sensor.acceleration.x > 2.98 && sensor.acceleration.x < 3.02) && done == false) 
  {
    digitalWrite(vib, HIGH);
    delay(1000);
    digitalWrite(vib, LOW);
    delay(600);
    done = true; 
  }
  else 
  {
    digitalWrite(vib, LOW);
  }

   if ((sensor.acceleration.x > 5.00 && sensor.acceleration.x < 5.10) && done == false) 
    {
    digitalWrite(vib, HIGH);
    delay(1000);
    digitalWrite(vib, LOW);
    delay(600);
    digitalWrite(vib, HIGH);
    delay(1000);
    digitalWrite(vib, LOW);
    delay(600);
    done = true;  
  }
  else 
  {
    digitalWrite(vib, LOW);
  }
  
  Serial.println(sensor.acceleration.x);

}

Ich vermute das done inzwischen den Wert true hat und somit die Bedingung nicht wahr wird.

Du musst, so wie es in deinem Programmablauf es dir vorschwebt, auch den Wert von done wieder auf false setzen

Hat geklappt. Ich habe den Befehl erweitert. Ist das so richtig im Ablauf oder besser an einer anderen Stelle?

if ((sensor.acceleration.x > 2.98 && sensor.acceleration.x < 3.02) && done == false) 
  {
    digitalWrite(vib, HIGH);
    delay(1000);
    digitalWrite(vib, LOW);
    delay(600);
    done = true; 
    done = false;

Was willst du eigentlich mit dem Flag „done“ erreichen? Dass, wenn der Wert mehrmals hintereinander ermittelt wird, es nicht dauernd blinkt? Oder was?

So wie du es jetzt machst, kannst Du „done“ auch ganz weglassen.

Genau, es soll nicht dauernd blinken. Nur nach den Befehlen wie angegeben.
Ja, das habe ich auch gerade bemerkt, als ich am Ende das ganze wieder zurückgesetzt habe. Also done = false gesetzt habe. Also den Ausgangszustand wieder eingesetzt habe, das done weggelassen werden kann.

In dem anderen Thread ging es darum, dass das „Vibrieren“ nur einmalig ausgeführt wird. done (wie erledigt) wird nach Ausführung auf true gesetzt. Jetzt musst du dir selber im Ablauf klar werden, ab wann das vibrieren wieder ausgeführt werden darf. Und dort setzt du done wieder auf false.

Im Notfall halt einen zweiten Merker wie done erstellen, für den zweiten Bereich.

Da es keinen Programmablaufplan gibt, musst du festlegen, oder erklären, ab wann die Einmalausführung wieder aufgehoben werden soll. Und dementsprechend im Code integrieren.

Du könntest z.B. auch im Else-Zweig done auf false setzen.

Schau dir auch mal else if (…) an. Das spart dir dann ein else.

Ich gucke dort auch nochmal rein. Genau, ich habe es durch die letzten Tage etwas nachvollzogen und erweitere das jetzt immer etwas.
Mit dem Ablaufplan dachte ich mir auch schon. Ob der Befehl eine Zeile vorher oder nachher abgerufen wird. Danke Dir.

In C/C++ gibt es keine Befehle.
Es gibt Funktionen.
Grüße Uwe

Ok, denke ich in Zukunft dran.

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