Ultraschallsensor und RGB Farbänderung

Hi Zusammen,

ich bin ein kleiner Anfänger auf dem Gebiet des Arduinos. Ich habe mir zuerst einmal einen Bastelkoffer bestellt und übe immer mal wieder.

Mein erstes “größeres” Objekt war eine Treppenbeleuchtung mit Bewegungsmelder etc., aber ich denke dass gehört hier nicht hin.

Wie dem auch sei, ich spiele gerade mit einem Ultraschallsensor rum und bin beim suchen auf diesen Thread gestoßen.

Ich habe den Code zum ausprobieren mal soweit kopiert und “versucht” nach meinen Vorstellungen umzuändern.

Soweit so gut. Mein Problem liegt aktuell aber darin dass sich die Farbe der RGB nicht so ändert wie Sie soll.

Mein Wunsch ist:

<= 30 = ROT
<= 50 = GELB
und sonst grün

Im folgenden Bereich habe ich rumgespielt:

 if (entfernung <= 30 )
  {
    Serial.print(entfernung);
    Serial.println(" cm");
    setColor(entfernung, 0, 0);
  } 
  
  if (entfernung <= 50){
    Serial.print(entfernung);
    Serial.println(" cm");
    setColor(entfernung, 255,0);
 }
  else {   
    Serial.print(entfernung);
    Serial.println(" cm");
   
    setColor(entfernung, 255, 0);
  }

}

void setColor(int red, int green, int blue)
{
if(red > 255 || red < 0){
    red = 0;
  }
  if(green > 255 || green < 0){
    green = 0;
  }
  if(blue > 255 || blue < 0){
    blue = 0;
  }

Die Farbe ändert sich allerdings nur von gelb ins grüne.

Wäre jemand so freundlich und würde mir da einen Denkanstoss geben wie ich da wo was ändern muss?!

Mit der RGB LED spiele ich dass erste Mal rum :confused:

EDIT:

Es werden mir im seriellen Monitor auch keine Entfernungswerte angezeigt :frowning:

Wenn entfernung beispielsweise 15 ist, dann ist das sowohl kleiner-gleich 30, als auch kleiner-gleich 50. Versuche mal hier ein zusätzliches else:

} else if (entfernung <= 50){

Das paßt nicht zusammen:

setColor(entfernung, 255, 0);
...
void setColor(int red, int green, int blue)

Hallo,

if (entfernung <= 30 )
 
if (entfernung <= 50)

Trifft doch beides zu- wenn die Entfernung <25 ist?

Du solltest das eingrenzen:
Wenn Entfernung >0 und <31 ist
Wenn Entfernung >30 und <50 ist

Gruß und Spaß
Andreas

Okay, so viel gespielt dass ich darüber gar nicht gestolpert bin ^^

DAS habe ich nun so gelöst:

if (entfernung <= 30)
{
Serial.print(entfernung);
Serial.println(" cm");
setColor(entfernung, 255, 0);
}
if (entfernung > 31){
Serial.print(entfernung);
Serial.println(" cm");
setColor(entfernung, 245,0);
} else {

Serial.print(entfernung);
Serial.println(" cm");
setColor(entfernung, 200,0);

}

Sollte so nun eigentlich richtig sein, oder sehe ich dass falsch?

setColor(entfernung, 255, 0);

void setColor(int red, int green, int blue)

Was genau widerspricht sich denn da?

eBullet:
Sollte so nun eigentlich richtig sein, oder sehe ich dass falsch?

Nö, siehst Du leider falsch.

eBullet:
Was genau widerspricht sich denn da?

eBullet:
Mein Wunsch ist:

<= 30 = ROT
<= 50 = GELB
und sonst grün

Die Variable entfernung hat variable Werte, was nicht zur Aufgabenstellung von festen Farben paßt.

SkobyMobil:
Hallo,

if (entfernung <= 30 )

if (entfernung <= 50)





Trifft doch beides zu- wenn die Entfernung <25 ist?

Du solltest das eingrenzen:
Wenn Entfernung >0 und <31 ist
Wenn Entfernung >30 und <50 ist

Gruß und Spaß
Andreas

Danke dir für die Antwort, habe den Code nochmal geändert und diese Werte eingegrenzt.

Aber egal was ich mache, die LED wechselt ausschließlich zwischen Gelb und Grün.
Dazu kommt, dass merkwürdigerweise keine Werte im Seriellen Monitr angezeigt werden.

Möglicherweise hilft es, wenn Du uns den kompletten Sketch zeigst.

//Variablen für RGB-LED
int redPin = 3;
int greenPin = 4;
int bluePin = 5;

//Ultra
int trigger = 12;
int echo = 11;
long dauer = 0;
long entfernung = 0;

void setup()
{
  //RGB
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(bluePin, OUTPUT);

  pinMode(trigger, OUTPUT);
  pinMode(echo, INPUT);
}

void loop()
{
  delay(100);
  digitalWrite(trigger, LOW);
  delay(5);
  digitalWrite(trigger, HIGH);
  delay(10);
  digitalWrite(trigger, LOW);
  dauer = pulseIn(echo, HIGH);
  entfernung = (dauer/2) / 29.1;

  if (entfernung > 10 && entfernung < 30 )
  {
    Serial.print(entfernung);
    Serial.println(" cm");
    setColor(entfernung, 255, 0);
  } 
  if (entfernung > 31 && entfernung < 100 ){
    Serial.print(entfernung);
    Serial.println(" cm");
    setColor(entfernung, 245,0);
 } else {

    Serial.print(entfernung);
    Serial.println(" cm");
    setColor(entfernung, 200,0);
  
 }
  

}

void setColor(int red, int green, int blue)
{
if(red > 255 || red < 0){
    red = 0;
  }
  if(green > 255 || green < 0){
    green = 0;
  }
  if(blue > 255 || blue < 0){
    blue = 0;
  }

  analogWrite(redPin, red);
  analogWrite(greenPin, green);
  analogWrite(bluePin, blue);
}

Hallo,

 if (entfernung > 10 && entfernung < 30 )

in

 if ((entfernung > 10) && (entfernung < 30) )

Gruß und Spaß
Andreas

Das macht keinen Unterschied. > und < geht vor &&:

http://en.cppreference.com/w/cpp/language/operator_precedence

//Variablen für RGB-LED
int redPin = 3;
int greenPin = 4;
int bluePin = 5;

Vieleicht würde es besser funktionieren, wenn Du alles PWM fähige Ausgänge verwendest. https://www.arduino.cc/en/Reference/AnalogWrite Grüße Uwe

:D Unser Adlerauge Uwe wieder ;)

Stefan