LED's scheinen nicht wie gewollt.

Hallöchen an Alle,

ich habe vor dass die 3 verschiedenen Pins je nach gemessener Entfernung aufleuchten.
Allerdings leuchtet nur meine Weiße auf, bei entfernung <30. Wo liegt denn mein Fehler? :slight_smile:
Ich hätte vermutet, dass irgendetwas mit den logischen Operatoren nicht ganz hinhaut.
Ich habe noch ein Soundgeber dran, der aber zum testen erstmal überall auf LOW ist.

Vielen Dank schon einmal für die Hilfe und bleibt schön Zuhause und gesund.:slight_smile:

int piezo=5;
int trigger=6; 
int echo=7;
int led_w=10;
int led_b=11;
int led_g=12; 
long dauer=0; 
long entfernung=0; 
void setup()
{
Serial.begin (9600); 
pinMode(trigger, OUTPUT); 
pinMode(echo, INPUT);
pinMode(piezo,OUTPUT); 
}
void loop()
{
digitalWrite(trigger, LOW); 
delay(5); 
digitalWrite(trigger, HIGH); 
delay(10);
digitalWrite(trigger, LOW);
dauer = pulseIn(echo, HIGH); 
entfernung = (dauer/2) * 0.03432; 
if (entfernung >= 500 || entfernung <= 0) 
{
Serial.println("Kein Messwert"); 
}
else 
{
Serial.print(entfernung); 
Serial.println("cm"); 
}
if (entfernung <= 80 && entfernung >70){
  digitalWrite(piezo,LOW);
  digitalWrite(led_g,HIGH);
  digitalWrite(led_b,LOW);
  digitalWrite(led_w,LOW);
}
if(entfernung <=70 && entfernung >30) {
  digitalWrite(piezo,LOW);
  digitalWrite(led_b,HIGH);
  digitalWrite(led_g,LOW);
  digitalWrite(led_w,LOW);
}
if(entfernung <=30 && entfernung >0) {
  digitalWrite(piezo,LOW);
  digitalWrite(led_w,HIGH);
  digitalWrite(led_g,LOW);
  digitalWrite(led_b,LOW);
}
else {
  digitalWrite(piezo,LOW);
  digitalWrite(led_g,LOW);
  digitalWrite(led_b,LOW);
  digitalWrite(led_w,LOW);
}
delay(1000); 
}

LJ350:
Allerdings leuchtet nur meine Weiße auf, bei entfernung <30. Wo liegt denn mein Fehler?

Weil bei allen anderen Entfernungen auch der else-Zweig deiner Abfrage auf <30 ausgeführt wird, Und da schaltest Du alles wieder ab.

LJ350: Ich hätte vermutet, dass irgendetwas mit den logischen Operatoren nicht ganz hinhaut.

Dir fehlen schätzungsweise zwei "else".

LJ350: ... und bleibt schön Zuhause und gesund. :)

Danke für die Wünsche, aber ich spaziere lieber durch die Natur, denn Bäume und Blumen sind nicht ansteckend :grin:

if (entfernung <= 80 && entfernung >70){

switch(entfernung)
{
  case 70 ... 80 : tuwas() ; break;
}

Macht es übersichtlicher.

Ich hasse If Kaskaden! (dafür bin ich zu blöd/faul)
Und in Sachen Einrückungen könntest du evtl. nacharbeiten

PS:
Ich mag den Allman Stil


denn Bäume und Blumen sind nicht ansteckend

Aber Hamster und andere Säuger.

combie: PS: Ich mag den Allman Stil

Mir gefällt One True Brace Style ganz gut.


Ich knutsche die Kühe am Wegesrand nicht, Hamster und Mäuse laufen vor mir weg. Die anderen Säuger sind aktiv, wenn ich schlafe oder solche Texte schreibe.

Danke für die Antworten.
Ich würde es ganz gern mit dem Switch machen.
Wie muss ich das schreiben? Habe gerade folgendes versucht:

switch(entfernung){
  case entfernung <= 80 && entfernung >70:
    digitalWrite(led_g,HIGH);
    digitalWrite(led_b,LOW);
    digitalWrite(led_w,LOW);
    break;
  case entfernung <= 70 && entfernung >30:
    digitalWrite(led_g,LOW);
    digitalWrite(led_b,HIGH);
    digitalWrite(led_w,LOW);
    break;
  case entfernung <=30:
    digitalWrite(led_g,LOW);
    digitalWrite(led_b,LOW);
    digitalWrite(led_w,HIGH);
    break;
}

Funktioniert aber nicht so ganz :smiley:

agmue: Mir gefällt One True Brace Style ganz gut.

Da bin ich strikt gegen. (Also, nicht gegen dich, oder deine Vorlieben, sondern den Stil) Zumindest, was meine "Belange" betrifft, und dank eines Anderen, konnte ich das sogar meinem Arduino Strg-T Formatierer beibringen.

Ich "will", dass die öffnende und schließende Klammer in einer Zeile steht, und wenn das nicht geht, oder praktikabel ist, dann will ich dass sie genau übereinander (in einer Spalte) stehen.

Klicke ich eine an, leuchtet die andere. Sind sie nicht exakt übereinander (und alles dazwischen eingerückt), habe ich Mist gebaut.


Ich würde es ganz gern mit dem Switch machen. Wie muss ich das schreiben? Habe gerade folgendes versucht:

Habe ich dir gezeigt!

Wurde doch schon gesagt:

https://gcc.gnu.org/onlinedocs/gcc/Case-Ranges.html

agmue: Mir gefällt One True Brace Style ganz gut.

Ich reihe mich hier, mit ein.

Gruß Fips

Wenn Du zuerst alle LED ausschaltest und dann nur das einen LED das im Bereich angehen soll anschaltest dann funktioniert das alles. Ungetestet.

loop()
{
digitalWrite(trigger, LOW);
delay(5);
digitalWrite(trigger, HIGH);
delay(10);
digitalWrite(trigger, LOW);
dauer = pulseIn(echo, HIGH);
entfernung = (dauer/2) * 0.03432;
if (entfernung >= 500 || entfernung <= 0)
{
Serial.println("Kein Messwert");
}
else
{
Serial.print(entfernung);
Serial.println("cm");
}
  digitalWrite(piezo,LOW);
  digitalWrite(led_g,LOW);
  digitalWrite(led_b,LOW);
  digitalWrite(led_w,LOW);

if (entfernung <= 80 && entfernung >70){
  digitalWrite(led_g,HIGH);
  }
if(entfernung <=70 && entfernung >30) {
  digitalWrite(led_b,HIGH);
}
if(entfernung <=30 && entfernung >0) {
  digitalWrite(led_w,HIGH);
}
delay(1000);
}

Grüße Uwe

Serenifly: Wurde doch schon gesagt:

https://gcc.gnu.org/onlinedocs/gcc/Case-Ranges.html

Genau dieses Problem hatte ich gerade zu lösen und dann hier die Antwort. Aber mir geht es wie wahrscheinlich dem TO, "..." kommt einem einfach zu primitiv vor.

Das ist übrigens kein Standard C++, sondern eine Erweiterung des GNU Compilers. Deshalb sieht man das nicht oft.

PS:
Ich mag den Allman Stil

Ach! :grin:

Wobei das erst richtig schön wird, wenn man mit den (Befehlszeilen-)Options modifiziert und verfeinert.
Insbesondere die Formatting-Options machen viel Spass.

my_xy_projekt: Ach! :grin:

Irgendwas nicht in Ordnung mit dir?

Sach watt los is! Dann können wir drüber reden.

raznz_snasna: Genau dieses Problem hatte ich gerade zu lösen und dann hier die Antwort. Aber mir geht es wie wahrscheinlich dem TO, "..." kommt einem einfach zu primitiv vor.

Mir kam es ebenfalls zu einfach vor, weswegen mir nicht klar war, dass die Antwort bereits gepostet wurde:D

Kaum macht man es richtig, sieht es ganz einfach aus :)

Das erlebe ich immer wieder und ist ganz normal. Stellt man die Erde in den Mittelpunkt des Universums, bewegen sich die Planeten in komplizierten Bahnen. Beim heliozentrischen Weltbild sind es dann nahezu Kreise.

So. Es funktioniert jetzt so halb.

switch(entfernung){
  case 81 ... 400 :
    digitalWrite(led_g,LOW);
    digitalWrite(led_b,LOW);
    digitalWrite(led_w,LOW);
  case 70 ... 80 :
    digitalWrite(led_g,HIGH);
    break;
  case 31 ... 69 : 
    digitalWrite(led_b,HIGH);
    break;
  case 1 ... 29 :
    digitalWrite(led_w,HIGH);
    digitalWrite(led_g,LOW);
    break;
}

Folgende 2 Frage hätte ich jetzt. 1. Wieso leuchtet meine grüne Led permanent auch bei entfernung > 80cm? 2. Kann es sein, dass der Sensor recht ungenau ist? Mal zeigt mir mein serieller Monitor "Kein Messwert" an und manchmal (obwohl nichts verrückt wurde) zeigt es 346cm an.

"digitalWrite(led_g,LOW)" im case 1 ... 29 steht nur zum test drin, damit sie aus geht.

Bzw. ich habe jetzt die 400 zu einer 700 gemacht. Ergo geht meine grüne Led aus, aber wenn die entfernung zum beispiel 20 cm beträgt, geht wie gewollt die weiße Led an. Jedoch geht sie danach nicht wieder aus :D Mir scheint es so, als würde mein Programm in dem case hängen bleiben. Zeigt mir mein serieller Monitor 27cm an geht die weiße an, zeigt er danach direkt "Kein Messwert" so hängt mein Programm im Case 1...29.

if (entfernung >= 500 || entfernung <= 0) 
{
Serial.println("Kein Messwert");
   digitalWrite(led_g,LOW);
   digitalWrite(led_b,LOW);
   digitalWrite(led_w,LOW);
}
else 
{
Serial.print(entfernung); 
Serial.println("cm"); 
}
switch(entfernung){
  case 70 ... 80 :
    digitalWrite(led_g,HIGH);
    digitalWrite(led_b,LOW);
    digitalWrite(led_w,LOW);
    //digitalWrite(piezo,HIGH);
    break;
  case 31 ... 69 : 
    digitalWrite(led_b,HIGH);
    digitalWrite(led_g,LOW);
    digitalWrite(led_w,LOW);
    //digitalWrite(piezo,HIGH);
    break;
  case 1 ... 29 :
    digitalWrite(led_w,HIGH);
    digitalWrite(led_g,LOW);
    digitalWrite(led_b,LOW);
    //digitalWrite(piezo,HIGH);
    break;
}

Hab es jetzt so gelöst und scheint zu funktionieren

Hi

Welchen Wert hat ‘entfernung’ denn, wenn kein Messwert ausgegeben wird?
Du hast die 30 nicht in der Anfrage drin.
Auch fehlt der default: Zweig der switch-Abfrage für die Werte <1, 30, >400.

MfG

PS: Die 30 ist immer noch nicht enthalten - Du fragst von 1 bis 29 ab und ab 31.
Dort fehlen sowohl die Null, wie die 30, Die einen ‘gültigen Messwert’ darstellen - laut Deiner IF, Die die Anderen aussortiert.