Hallo zusammen,
wie programmiere die If-Anweisungen richtig?
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
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);
}
Plumps
September 20, 2022, 12:37pm
2
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?
noiasca
September 20, 2022, 12:46pm
3
anon49286593:
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
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);
}
}
}
agmue
September 20, 2022, 1:35pm
7
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);
}
combie
September 20, 2022, 2:23pm
8
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;
}
}
fony
September 20, 2022, 3:42pm
9
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.
Plumps
September 20, 2022, 5:07pm
12
anon49286593:
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?
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?
anon49286593:
Das ist nah dran.
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);
}
}
}
Plumps
September 20, 2022, 5:12pm
15
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.
system
Closed
March 19, 2023, 5:17pm
19
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.