Entfernung auslesen inkl. Ampel (fade)

Hallo ;D

undzwar bin ich ein kompletter Anfänger..
ich hab den Arduino UNO seit gestern und hab mal versucht via Ultraschallsensor
die Entfernung ausgeben zu lassen...
Das war gar kein Problem..
Jetzt wollte ich aber auch noch dafür sorgen, dass wenn etwas
60 cm weit weg ist, eine Grüne LED angeht(relativ dunkel)
und dann bis zu 40 cm ganz hell wird...
ab <40 cm geht dann zusätzlich eine Gelbe LED an..
die dann wieder recht dunkel bis 20 cm ganz hell..
dann geht dazu noch ne rote an usw...

Ich versteh grade nicht wo mein Fehler ist.

Hier mein Code:

int trigger=7;
int echo=6;
int rLedPin = 9;
int yLedPin = 10;
int gLedPin = 11;
long dauer=0;
 
long entfernung=0;
 
 
 
void setup()
{
  Serial.begin (9600);
   
  pinMode(trigger, OUTPUT);
  pinMode(echo, INPUT);
}

void loop()
{
  digitalWrite(trigger, LOW);
  
  delay(5);
  digitalWrite(trigger, HIGH);
  delay(10);
  digitalWrite(trigger, LOW);
  
  dauer = pulseIn(echo, HIGH);
  
  entfernung = (dauer/2) / 29.1;
  
  
  if (entfernung >= 500)
  {
    analogWrite(gLedPin, 0);
    analogWrite(yLedPin, 0);
    analogWrite(rLedPin, 0);
    Serial.println("Kein Messwert");
  }
  else if (entfernung >= 40 || entfernung <= 60)
  {
    
    Serial.print(entfernung);
    Serial.println(" cm");
    
    int fadeValue = 12 * (entfernung - 40) +15;
    
    analogWrite(gLedPin, fadeValue);
    analogWrite(yLedPin, 0);
    analogWrite(rLedPin, 0);
    
  }
  else if (entfernung >= 20 || entfernung <= 40)
  {
    
    Serial.print(entfernung);
    Serial.println(" cm");
    
    int fadeValue = 12 * (entfernung - 20) +15;
    
    analogWrite(yLedPin, fadeValue);
    analogWrite(gLedPin, 255);
    analogWrite(rLedPin, 0);
    
  }
    else if (entfernung == 0 || entfernung <= 20)
  {
    
    Serial.print(entfernung);
    Serial.println(" cm");
    
    int fadeValue = 12 * (entfernung) +15;
    
    analogWrite(rLedPin, fadeValue);
    analogWrite(gLedPin, 255);
    analogWrite(yLedPin, 255);
    
  }
  else
  {
    Serial.print(entfernung);
    Serial.println(" cm");
  }
  
  delay(200);

}

Ich hoffe Ihr könnt mir Helfen ;D!

LG Tom

Um einen Bereich zwischen zwei Werten abzufragen brauchst du &&. Nicht ||

Und das hier ergibt keinen Sinn:

else if (entfernung == 0 || entfernung <= 20)

Entweder soll es 0-20 sein. Oder 0 ist schon in <= 20 enthalten

Falls Serenifly's Hinweis - unwahrscheinlicherweise - noch nicht helfen sollte,
und du ja sowieso in den 3 Bereichen separate Serial.print Anweisungen hast:

Mach die Testausgaben doch so, dass du sie unterscheiden kannst.

Ein Hinweis, der hier sicher nicht hilft, ist mein Lieblingsmeckerpunkt
Dauer und Entfernung sollten [b]unsigned[/b] sein, auch wenns schwer zu tippen ist.

Ohuu hahaha hab ich garnicht drauf geachtet^^
KP wieso ich das vercheckt hab xD

Klappt aber immer noch nicht.. -.-
hat es vllt was mit den Pins zutun?

Mach die Testausgaben doch so, dass du sie unterscheiden kannst.

... und dass sie dir sagen, woran es liegt :wink:

if (entfernung >= 500) // aus
else if (entfernung > 40 && entfernung <= 60) // an dunkel
else if (entfernung > 20 && entfernung <= 40) // an hell
else // an sehr hell

sschultewolter:

if (entfernung >= 500) // aus

else if (entfernung > 40 && entfernung <= 60) // an dunkel
else if (entfernung > 20 && entfernung <= 40) // an hell
else // an sehr hell

zwischen 60 und 500 : sehr hell ???

Hehe,

if(entfernung > 60) // aus

sschultewolter:

if (entfernung >= 500) // aus

else if (entfernung > 40 && entfernung <= 60) // an dunkel
else if (entfernung > 20 && entfernung <= 40) // an hell
else // an sehr hell

Erstmal Danke für die ganzen Antworten ;D!!

Aber ich glaube du hast was falsch verstanden...
Es soll bei :
else if (entfernung > 40 && entfernung <= 60)
bei 60 die grüne LED angehen (Dunkel) und dann soll es wenn es z.B. 59 ist, dann wird die Lampe heller
bis zu 40... dann ist die Lampe ganz hell...
ab <40 geht dann dazu ne gelbe Led an (Dunkel) und dann soll es wenn es z.B. 39 ist, dann wird die Lampe heller
bis zu 20... dann ist die Lampe ganz hell...
und dann unter 20 das selbe mit der Roten LED....

LG^^

Aber ich glaube du hast was falsch verstanden...
Es soll bei :

Und, was passiert bei dir, seit du || in && geändert hast ?
Und wenn es nicht das ist, was du willst, warum ?

Dein fade Algorithumus

    int fadeValue = 12 * (entfernung - 40) +15;

sieht doch nicht verkehrt aus

michael_x:
Dein fade Algorithumus

    int fadeValue = 12 * (entfernung - 40) +15;

sieht doch nicht verkehrt aus

Der Fade-Algorithmus sieht für mich leider komplett falsch aus, wenn er den fadeValue als PWM-Wert nehmen möchte.

Der Grund liegt darin, dass das Auge Helligkeiten eher lorarithmisch als linear warnimmt.

D.h. die PWM-Werte 0, 1, 2, 4, 8 lassen sich von der Helligkeit her sehr gut als dunkel und vier verschiedene Helligkeiten wahrnehmen. Aber PWM-Werte von 245 bis 255 führen allesamt zu einer Helligkeit, die sich per Augenschein überhaupt nicht auseinander halten läßt.

Was er als Algorithmus braucht, ist eine Linearisierung in verschiedene Helligkeitsstufen. Zum Beispiel kann er einen von-bis Bereich in 10 verschiedene Helligkeitsstufen unterteilen:
0 - 1 - 2 - 4 -8 - 16 - 32 - 64 -128 -255

Und dann muß er nicht alle 2 cm den PWM-Wert um einen gleichen Betrag erhöhen, sondern er muss alle 2cm den PWM-Wert um eine Helligkeitsstufe erhöhen.

Der Ansatz, lineare Entfernungsänderungen in lineare PWM-Wertänderungen umzusetzen, funktioniert so nicht, weil das Auge Helligkeitsänderungen nicht so wahrnimmt.

Die Lampel leuchten einfach garnicht.. ich hab es mit einem normalen fade getestet da gehtz...
also liegt es nicht an der schaltung....
und die zahlen.. reichen eig auch.. es soll kein großer unterschied sein zwischen dunkel und hell...
das hab ich schon getestet das reicht mir so...

Wenn du sagst ich soll das von 0 8 16 32 usw machen..
wie wäre den da der algorythmus?

LG

WhiteCollar:
und die zahlen.. reichen eig auch.. es soll kein großer unterschied sein zwischen dunkel und hell...
das hab ich schon getestet das reicht mir so...

Wenn Dir das reicht, dann mache es doch so!

Beispielcode (ungetestet):

int trigger=7;
int echo=6;
int rLedPin = 9;
int yLedPin = 10;
int gLedPin = 11;
long dauer=0;
long entfernung=0;
 
 
void setup()
{
  Serial.begin (9600);
  pinMode(trigger, OUTPUT);
  pinMode(echo, INPUT);
}


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

void ausgabe()
{
  byte green=0, yellow=0, red=0;
  if (entfernung<=20)
  {
    green=255;
    yellow=255;
    red=(20.0-entfernung)/20*255;
  }  
  else if (entfernung<=40)
  {
    green=255;
    yellow=(40.0-entfernung)/20*255;
  }
  else if (entfernung<=60)
  {
    green = (60.0-entfernung)/20*255;
  }
  analogWrite(gLedPin, green);
  analogWrite(yLedPin, yellow);
  analogWrite(rLedPin, red);
  Serial.print(entfernung);
  Serial.print('\t');
  Serial.print(green);
  Serial.print('\t');
  Serial.print(yellow);
  Serial.print('\t');
  Serial.print(red);
  Serial.println();
}


void loop()
{
  eingabe();  
  ausgabe();
  delay(200);
}

jurs:

WhiteCollar:
und die zahlen.. reichen eig auch.. es soll kein großer unterschied sein zwischen dunkel und hell...
das hab ich schon getestet das reicht mir so...

Wenn Dir das reicht, dann mache es doch so!

Beispielcode (ungetestet):

int trigger=7;

int echo=6;
int rLedPin = 9;
int yLedPin = 10;
int gLedPin = 11;
long dauer=0;
long entfernung=0;

void setup()
{
  Serial.begin (9600);
  pinMode(trigger, OUTPUT);
  pinMode(echo, INPUT);
}

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

void ausgabe()
{
  byte green=0, yellow=0, red=0;
  if (entfernung<=20)
  {
    green=255;
    yellow=255;
    red=(20.0-entfernung)/20255;
  } 
  else if (entfernung<=40)
  {
    green=255;
    yellow=(40.0-entfernung)/20
255;
  }
  else if (entfernung<=60)
  {
    green = (60.0-entfernung)/20*255;
  }
  analogWrite(gLedPin, green);
  analogWrite(yLedPin, yellow);
  analogWrite(rLedPin, red);
  Serial.print(entfernung);
  Serial.print('\t');
  Serial.print(green);
  Serial.print('\t');
  Serial.print(yellow);
  Serial.print('\t');
  Serial.print(red);
  Serial.println();
}

void loop()
{
  eingabe(); 
  ausgabe();
  delay(200);
}

Hey^^
danke ;D
Funktinoiert aber nur die Rote LED...
hab ich vllt die beiden andren falsch angeschlossen?
fehlt mir da irgend was? an den Pins 10 und 11 ?

WhiteCollar:
Funktinoiert aber nur die Rote LED...
hab ich vllt die beiden andren falsch angeschlossen?
fehlt mir da irgend was? an den Pins 10 und 11 ?

Vielleicht mal die Größe des Vorwiderstands und die Polung der LED prüfen.

OK alles funktioniert danke danke ;D!!