Wert zurücksetzen

Hallo zusammen,
ich möchte gerne das bei dem Wert zwischen 7.85 und 8.00 ein Befehl ausgeführt wird und wenn dieser ausgeführt wurde, bei dem Wert über 8.00 und bei -0.20 zurücksetzen, damit dieser zwischen 7.85 und 8.00 neu ausgeführt werden kann. Klappt aber nicht. Kann mir jemand helfen?

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

bool done = false; 
#define led 8
#define vib 9
#define sound 10

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

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

  if (sensor.acceleration.x > 1 || sensor.acceleration.x < -1) digitalWrite(led,HIGH); 
    else digitalWrite(led,LOW);


  if ((sensor.acceleration.x > 7.85 && sensor.acceleration.x < 8.00) && done == false) 
  {
    digitalWrite (vib, HIGH);   
    tone (sound, 440);         
    delay (500);                
    noTone (sound);             
       
    done = true;                
    if (sensor.acceleration.x > 8.00 && sensor.acceleration < -0.20)
    done = false;
  }
  else //
  {
    digitalWrite(vib, LOW);
  }
 
Serial.println(sensor.acceleration.x);
}

Die If Abfrage, mit der du done wieder auf false setzen willst, wird doch nie erreicht. Die äußere If hat doch also Bedingung done false.

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

bool done = false; 
#define led 8
#define vib 9
#define sound 10

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

void loop()
{
  sensors_event_t sensor; 
  Sensor.getEvent(&sensor); 
  if (sensor.acceleration.x > 1 || sensor.acceleration.x < -1) digitalWrite(led,HIGH); 
  else digitalWrite(led,LOW);
  if ((sensor.acceleration.x > 7.85 && sensor.acceleration.x < 8.00) && done == false) 
  {
    digitalWrite (vib, HIGH);   
    tone (sound, 440);         
    delay (500);                
    noTone (sound);                
    done = true;                
  }
  else //
  {
    digitalWrite(vib, LOW);
  }
  if (sensor.acceleration.x > 8.00 || sensor.acceleration.x < -0.20)
  {
    done = false;
  }
  Serial.println(sensor.acceleration.x);
}

Hab es mal versucht mit dem Handy anzupassen. Jetzt ist die If-Abfrage für done außerhalb der anderen If-Abfrage.

[Edit]
Die obere Schwelle zum wieder aktivieren würde ich nicht so na an die Schwelle des deaktivierens legen, da die Werte etwas flattern. 8.20 wäre vermutlich besser

Leider klappt es nicht so ganz. Das mit dem flattern habe ich mir auch gedacht. Aber jetzt bekomme ich die Fehlermeldung.

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

bool done = false; 
#define led 8
#define vib 9
#define sound 10

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

void loop()
{
  sensors_event_t sensor; 
  Sensor.getEvent(&sensor); 
  if (sensor.acceleration.x > 1 || sensor.acceleration.x < -1) digitalWrite(led,HIGH); 
  else digitalWrite(led,LOW);
  if ((sensor.acceleration.x > 7.85 && sensor.acceleration.x < 8.00) && done == false) 
  {
    digitalWrite (vib, HIGH);   
    tone (sound, 440);         
    delay (500);                
    noTone (sound);                
    done = true;                
  }
  else //
  {
    digitalWrite(vib, LOW);
  }
  if (sensor.acceleration.x > 8.20 && sensor.acceleration < 7.70)
  {
  done = false;
  }
  Serial.println(sensor.acceleration.x);
}
Stufe_1:37:59: error: no match for 'operator<' (operand types are 'sensors_vec_t' and 'double')
   if (sensor.acceleration.x > 8.20 && sensor.acceleration < 7.70 )
                                       ~~~~~~~~~~~~~~~~~~~~^~~~~~~~
exit status 1
no match for 'operator<' (operand types are 'sensors_vec_t' and 'double')

Da fehlt das .x

Mein Rat:
Sorgfältig lesen!
An anderer Stelle machst du es richtig!
Warum nicht dort?

Tipp Nr. 2:
Mit komplizierten if Kaskaden verwirrt man sich selber.
Darum: Lass es!

Stimmt, danke. Habe ich eingesetzt. Aber jetzt kommt keine Fehlermeldung und es lässt sich noch nicht zurücksetzen.

Ja, stimmt. Total überlesen und aus der Fehlermeldung konnte ich es nicht herauslesen.

Wie soll der Wert gleichzeitig über 8.20 und unter 7.70 sein können. Der Wert kann nur entweder über 8.20 oder unter 7.70 sein.

Daher würde ich ein oder in die IF-Abfrage einbauen.

Oh man, stimmt. Habe erst einem das && durch || ersetzt. Danke euch für die Hilfe.

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