If-Anweisungen richtig programmieren

Hallo zusammen,

wie programmiere die If-Anweisungen richtig?

  1. Zwischen dem Wert 7.50 und 8.50 soll die Anweisung ausgegeben werden.
    Kleiner 7.00 und größer 9.00 wird der Wert zurückgesetzt
  2. Zwischen dem Wert 9.50 und 10.50 soll eine weitere Anweisung ausgegeben werden.
    Kleiner 9.00 und größer 11.00 wird der Wert zurückgesetzt

Da dieses nicht so ohne weiteres geht, weiß ich nicht wie es umgesetzt werden kann. Meine Zeilen habe ich beigefügt komme aber nicht weiter. Das Programm hat keine Fehlermeldung, da die Programmierung in Ordnung ist, aber nicht so umgesetzt wird, wie ich es gerne möchte.

#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.50 && sensor.acceleration.x < 8.50) && done == false) 
  {
    digitalWrite (vib, HIGH); 
    tone (sound, 440);        
    delay (500);              
    noTone (sound);          
    done = true;
                   
  }
  else //
  {
    digitalWrite(vib, LOW);
  }
  if (sensor.acceleration.x > 9.00 || sensor.acceleration.x < 7.00)
  {
  done = false;               
  }

  if ((sensor.acceleration.x > 9.50 && sensor.acceleration.x < 10.50) && done == false) 
  {
    digitalWrite (vib, HIGH);  
    tone (sound, 440);         
    delay (500);               
    digitalWrite(vib, HIGH);
    tone (sound, 440);
    delay (500);
    noTone (sound);            
    
    done = true;               
  }
  else //
  {
    digitalWrite(vib, LOW);     
  }
  if (sensor.acceleration.x > 11.00 || sensor.acceleration.x < 9.00)
  {
  done = false;           
  }
Serial.println(sensor.acceleration.x);
}

Wie wäre es für den zweiten Zustand einen zweiten Merker (Variable done) zu nutzen?

Wie soll der Code unterscheiden, welcher der beiden Zustände erreicht wurde?

Wie wärs wenn du dir das in einer Tabelle mal selber aufschreibst

 0.00 - 7.00    --> Wert zurücksetzen
 7.50 - 8.50    --> "Anweisung ausgeben"
 9.50 - 10.50   --> "eine weitere Anweisung ausgeben"
11.00 - endlos  --> Wert zurücksetzen

so jetzt bleiben diese Anforderung über:

Kleiner 9.00 und größer 11.00 wird der Wert zurückgesetzt
Kleiner 7.00 und größer 9.00 wird der Wert zurückgesetzt

ordne das selber in die Tabelle ein ... wo gehört das hin?
Also --> mach mal so eine komplette Entscheidungstabelle ... dann funktionierts auch mit der Umsetzung in Code.

Außerdem finde ich es schön langsam bedenklich das du für jeden if einen eigenen Thread aufmachst. Ich finde das nicht notwendig.

Mit dem ersten Befehl klappt es, aber der zweite läuft in der Schleife und wiederholt sich ständig.

#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.50 && sensor.acceleration.x < 8.50) && done == false) 
  {
    digitalWrite (vib, HIGH);
    tone (sound, 440);        
    delay (500);             
    noTone (sound);            
    done = true;
                   
  }
  else //
  {
    digitalWrite(vib, LOW);
  }
  if (sensor.acceleration.x > 9.00 || sensor.acceleration.x < 7.00)
  {
  done = false;              
  }

  if ((sensor.acceleration.x > 9.50 && sensor.acceleration.x < 10.50) && done == false) 
  {
    digitalWrite (vib, HIGH);   
    tone (sound, 440);          
    delay (500);               
    digitalWrite(vib, HIGH);
    tone (sound, 440);
    delay (500);
    noTone (sound);            
    
    done = true;               
  }
  else //
  {
    digitalWrite(vib, LOW);     
  }
  if (sensor.acceleration.x > 11.00 || sensor.acceleration.x < 9.10)
  {
  done = false;               
  done = true;
  }
  
Serial.println(sensor.acceleration.x);
}

Die Idee mit der Tabelle ist gut und baue ich mir auf.

Mir wurde mal gesagt, dass ich nicht alle Informationen miteinander vermischen soll, weil es verschiedene Themen sind und man schnell durcheinander kommt, deshalb die verschiedenen Threads. Aber ich nehme die Anregung gerne auf.

Ich hab Deine Aufgabenstellung vermutlich nicht verstanden...

// Forensketch Auswahl if
// https://forum.arduino.cc/t/if-anweisungen-richtig-programmieren/1033738
#include <Adafruit_ADXL345_U.h>
#include <Adafruit_Sensor.h>
Adafruit_ADXL345_Unified Sensor = Adafruit_ADXL345_Unified();


const byte led = 8;
const byte vib = 9;
const byte sound = 10;
byte wiederholungen = 0;

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);
  digitalWrite(led, (sensor.acceleration.x != 0 ));
  if (sensor.acceleration.x > 7.50 &&
      sensor.acceleration.x < 8.50 &&
      wiederholungen == 0)
  {
    digitalWrite (vib, HIGH);
    wiederholungen = 1;
    beeper(wiederholungen);
  }
  else if (sensor.acceleration.x > 9.50 &&
           sensor.acceleration.x < 10.50 &&
           wiederholungen == 0)
  {
    digitalWrite (vib, HIGH);
    wiederholungen = 2;
    beeper(wiederholungen);
  }
  else
  {
    wiederholungen = 0;
    digitalWrite(vib, LOW);
  }
  Serial.println(sensor.acceleration.x);
}

void beeper(const byte anzahl)
{
  for (byte b = 0; b < anzahl; b++)
  {
    tone (sound, 440);
    delay (500);
    noTone (sound);
    if (anzahl > 1)
    {
      delay(500);
    }
  }
}

Ich verstehe die Aufgabenstellung so:

#define led 8
#define vib 9

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

  auswertung(7.75);
  auswertung(6.0);
  auswertung(7.8);
  auswertung(10.0);
  auswertung(12.0);
  auswertung(10.0);
  auswertung(6.0);
}

void loop()
{}
/*
    Zwischen dem Wert 7.50 und 8.50 soll die Anweisung ausgegeben werden.
    Kleiner 7.00 und größer 9.00 wird der Wert zurückgesetzt
    Zwischen dem Wert 9.50 und 10.50 soll eine weitere Anweisung ausgegeben werden.
    Kleiner 9.00 und größer 11.00 wird der Wert zurückgesetzt
*/
void auswertung(float wert)
{
  Serial.print("wert = ");
  Serial.print(wert);

  if ( wert >= 7.5 && wert <= 8.5 )
  {
    digitalWrite(led, HIGH);
    Serial.print("\tled HIGH");
  }
  if ( wert < 7.0 || wert > 9.0 ) 
  {
    digitalWrite(led, LOW);
    Serial.print("\tled LOW ");
  }

  if ( wert >= 9.5 && wert <= 10.5 )
  {
    digitalWrite(vib, HIGH);
    Serial.print("\tvib HIGH");
  }
  if ( wert < 9.0 || wert > 11.0 ) 
  {
    digitalWrite(vib, LOW);
    Serial.print("\tvib LOW ");
  }
  Serial.println();
  delay(1000);
}

Am besten, wenn irgend möglich: Darauf verzichten!

Aus meiner Wühlkiste:

#include <Streaming.h> // die Lib findest du selber ;-)
Print &cout = Serial; // cout Emulation für "Arme"

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

void loop() 
{
 switch(int(42.11*10))
 {
  case 103 ... 189:   cout << F("Tuwas1") << endl; break;
  case 303 ... 559:   cout << F("Tuwas2") << endl; break;
 }
}

Donner Wetter da stimmt was nicht, wo ist der Sin?
So wie empfohlen Tabelle basteln. und das done auch mall durchgehen

#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.50 && sensor.acceleration.x < 8.50) && done == false) 
  {
    digitalWrite (vib, HIGH); 
    tone (sound, 440);        
    delay (500);              
    noTone (sound);          
    done = true;
                   
  }
  else //
  {
    digitalWrite(vib, LOW);
  }
  if (sensor.acceleration.x > 9.00 || sensor.acceleration.x < 7.00)
  {
  done = false;               
  }

  if ((sensor.acceleration.x > 9.50 && sensor.acceleration.x < 10.50) && done == false) 
  {
    digitalWrite (vib, HIGH);  
    tone (sound, 440);         
    delay (500);               
    digitalWrite(vib, HIGH);
    tone (sound, 440);
    delay (500);
    noTone (sound);            
    
    done = true;               
  }
  else //
  {
    digitalWrite(vib, LOW);     
  }
  if (sensor.acceleration.x > 11.00 || sensor.acceleration.x < 9.00)
  {
  done = false;           
  }
Serial.println(sensor.acceleration.x);
}

Das ist nah dran. Also wenn man sich mein Programm anschaut, passt es soweit. nur das bei dem zweiten Befehl zwischen den Werten 9.50 und 10.50 zweimal piepen und brummen soll und nicht aufhört.

Ich habe das Problem gefunden. Weiß aber noch nicht wie ich es lösen kann. Ich setze einen Beschleunigungssensor ein. Dieser liefert die Werte 0 bis 10, dann 10 bis 0, dann -0 bis -10 und -10 - 0, wenn man Uhrzeigesinn eine 360 Grad Drehung macht. Hängt das mit der Bibliothek zusammen? Ich hätte es am liebsten, wenn die Werte 0 bis 359 im SerMon angezeigt werden. Damit kann ich dann die Wertgrenzen besser abgrenzen und muss keine wilden Vorzeichenwechsel ändern.

Du rufst diese Werte ab. Du könntest auch die Rohwert über diese Bibliothek abrufen.

Das könntest du über map lösen.

Mein Gedanke ist, was ich über den SerMon angezeigt bekomme, diese Werte in Programmierung aufnehme um, damit kein durcheinander zu erzeugen.
Wie kann ich die Rohwerte abrufen. Ich dachte, das sind die Rohwerte. Wie sieht es mit map aus? Ist das aufwendig?

Das ist auch beim zweiten Versuch nicht mein Sketch.
Aber dann hatte ich das ja doch richtig verstanden.

Variante 1:

// Forensketch Auswahl if
// https://forum.arduino.cc/t/if-anweisungen-richtig-programmieren/1033738
#include <Adafruit_ADXL345_U.h>
#include <Adafruit_Sensor.h>
Adafruit_ADXL345_Unified Sensor = Adafruit_ADXL345_Unified();


const byte led = 8;
const byte vib = 9;
const byte sound = 10;
byte wiederholungen = 0;

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);
  digitalWrite(led, (sensor.acceleration.x != 0 ));
  if (sensor.acceleration.x > 7.50 &&
      sensor.acceleration.x < 8.50 &&
      wiederholungen == 0)
  {
    wiederholungen = 1;
    beeper(wiederholungen);
  }
  else if (sensor.acceleration.x > 9.50 &&
           sensor.acceleration.x < 10.50 &&
           wiederholungen == 0)
  {
    wiederholungen = 2;
    beeper(wiederholungen);
  }
  else
  {
    wiederholungen = 0;
    digitalWrite (vib, HIGH);
  }
  Serial.println(sensor.acceleration.x);
}

void beeper(const byte anzahl)
{
  for (byte b = 0; b < anzahl; b++)
  {
    digitalWrite (vib, HIGH);
    tone (sound, 440);
    delay (500);
    digitalWrite(vib, LOW);
    noTone (sound);
    if (anzahl > 1)
    {
      delay(500);
    }
  }
}

Variante 2:

// Forensketch Auswahl if
// https://forum.arduino.cc/t/if-anweisungen-richtig-programmieren/1033738
#include <Adafruit_ADXL345_U.h>
#include <Adafruit_Sensor.h>
Adafruit_ADXL345_Unified Sensor = Adafruit_ADXL345_Unified();


const byte led = 8;
const byte vib = 9;
const byte sound = 10;
byte wiederholungen = 0;

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);
  digitalWrite(led, (sensor.acceleration.x != 0 ));
  int16_t auswahl = int16_t(sensor.acceleration.x * 100);
  Serial.println(auswahl);
  switch (auswahl)
  {
    case 751 ... 849:
      if (wiederholungen == 0)
      {
        wiederholungen = 1;
        beeper(wiederholungen);
      }
      break;
    case 951 ... 849:
      if (wiederholungen == 0)
      {
        wiederholungen = 2;
        beeper(wiederholungen);
      }
      break;
    default:
      wiederholungen = 0;
      digitalWrite (vib, HIGH);
      break;
  }
}

void beeper(const byte anzahl)
{
  for (byte b = 0; b < anzahl; b++)
  {
    digitalWrite (vib, HIGH);
    tone (sound, 440);
    delay (500);
    digitalWrite(vib, LOW);
    noTone (sound);
    if (b < anzahl - 1)
    {
      delay(500);
    }
  }
}

sensor.getX sollte dir den "Roh" Wert des Sensors liefern. Ich nutze diese Bibliothek aber nicht selber.

map() - Arduino-Referenz

Die Diskussion kannst Du Dir sparen!
Hatten wir doch gerade....
Es wird nicht besser... ;(

Das stimmt. Ich versuche entweder andere Werte ausgeben zu lassen und eine andere Bibliothek zu finden, wobei das eventuell nicht so einfach wird.

Ich schaue es mir an.

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