LED's leuchten trotz "LOW"

Hallo zusammen,
ich spiel gerade mit meinem Arduino ein bisschen. Ich hab mir einen Code gebastelt, welcher bei einem Abstand von 80 bis 150cm eine grüne LED leuchten lässt, zwischen 30 und 80cm eine gelbe, und zwischen 0 und 30 eine rote LED leuchten lässt.
Es Leuchten jedoch kontinuierlich alle LED´s, auch wenn die Werte über 150cm liegen:

int trigger=7; //Trigger-Pin des Ultraschallsensors an Pin7 des Arduino-Boards 
int echo=6; // Echo-Pim des Ultraschallsensors an Pin6 des Arduino-Boards 
long dauer=0; // Das Wort dauer ist jetzt eine Variable, unter der die Zeit gespeichert wird, die eine Schallwelle bis zur Reflektion und zurück benötigt. Startwert ist hier 0.
long entfernung=0; // Das Wort „entfernung“ ist jetzt die variable, unter der die berechnete Entfernung gespeichert wird. Info: Anstelle von „int“ steht hier vor den beiden Variablen „long“. Das hat den Vorteil, dass eine größere Zahl gespeichert werden kann. Nachteil: Die Variable benötigt mehr Platz im Speicher.
#define gruen 13
#define gelb 12
#define rot 11
void setup()
{
Serial.begin (9600); //Serielle kommunikation starten, damit man sich später die Werte am serial monitor ansehen kann.
pinMode(trigger, OUTPUT); // Trigger-Pin ist ein Ausgang
pinMode(echo, INPUT); // Echo-Pin ist ein Eingang
pinMode(gruen, OUTPUT);
pinMode(gelb, OUTPUT);
pinMode(rot, OUTPUT);

}
void loop()
{
digitalWrite(trigger, LOW); //Hier nimmt man die Spannung für kurze Zeit vom Trigger-Pin, damit man später beim senden des Trigger-Signals ein rauschfreies Signal hat.
delay(5); //Dauer: 5 Millisekunden
digitalWrite(trigger, HIGH); //Jetzt sendet man eine Ultraschallwelle los.
delay(10); //Dieser „Ton“ erklingt für 10 Millisekunden.
digitalWrite(trigger, LOW);//Dann wird der „Ton“ abgeschaltet.
dauer = pulseIn(echo, HIGH); //Mit dem Befehl „pulseIn“ zählt der Mikrokontroller die Zeit in Mikrosekunden, bis der Schall zum Ultraschallsensor zurückkehrt.
entfernung = (dauer/2) * 0.03432; //Nun berechnet man die Entfernung in Zentimetern. Man teilt zunächst die Zeit durch zwei (Weil man ja nur eine Strecke berechnen möchte und nicht die Strecke hin- und zurück). Den Wert multipliziert man mit der Schallgeschwindigkeit in der Einheit Zentimeter/Mikrosekunde und erhält dann den Wert in Zentimetern.
if (entfernung >= 300 || entfernung <= 0) //Wenn die gemessene Entfernung über 500cm oder unter 0cm liegt,…
{
Serial.println("Kein Messwert"); //dann soll der serial monitor ausgeben „Kein Messwert“, weil Messwerte in diesen Bereichen falsch oder ungenau sind.
digitalWrite(gruen, LOW); // grün
Serial.println("Schlaufe 1 Grün aus");
digitalWrite(gelb, LOW); // gelb
Serial.println("Schlaufe 1 Gelb aus");
digitalWrite(rot, LOW); // rot
Serial.println("Schlaufe 1 Rot aus");
 
}


else //  Ansonsten…
{

 
Serial.print(entfernung); //…soll der Wert der Entfernung an den serial monitor hier ausgegeben werden.
Serial.println(" cm"); // Hinter dem Wert der Entfernung soll auch am Serial Monitor die Einheit "cm" angegeben werden.
if (entfernung>80 && entfernung<150) {
 Serial.println("In Schlaufe grün");
digitalWrite(gruen, HIGH);// grün
Serial.println("Grün an");
digitalWrite(gelb, LOW);// gelb
digitalWrite(rot, LOW);// rot
}
else
{
 digitalWrite(gruen, LOW);// grün
 }
if (entfernung>30 && entfernung<80 ) {
digitalWrite(gelb, HIGH);// gelb
Serial.println("Gelb an");
digitalWrite(gruen, LOW);// grün
digitalWrite(rot, LOW);// rot
}
else
{
digitalWrite(gelb, LOW);//  
 }
if (entfernung>0&&entfernung<30) {
digitalWrite(rot, HIGH);// rot
Serial.println("Rot an");
digitalWrite(gelb, LOW);// gelb
digitalWrite(gruen, LOW);// grün
}
else
{
 digitalWrite(rot, LOW);// rot
}
 }
delay(1000); //Das delay von einer Sekunde sorgt in ca. jeder neuen Sekunde für einen neuen Messwert.
}

versuch mal entfernung als float zu deklarieren

Deine “if-Abfrage” ist sehr unübersichtlich und hat zu viele else-Anweisungen die so nicht funktionieren können.

Das solltest du noch mal optimieren.

Z.B. so o.ä.

  if (entfernung < 15) {   
  // dein Code
  }

  if (entfernung > 14 && entfernung < 71) { 
  // dein Code
  }

  if (entfernung > 70 && entfernung < 120) {                    
  // dein Code
  }

  if (entfernung > 119) {                   
  // dein Code
  }
  else   // dein Code
}

Und interessant wäre noch, wie du deine Leds angeschlossen hast.

Hallo joker88,

obwohl dein Code etwas unübersichtlich ist (vor allem wegen der vielen “else”) funktioniert er grundsätzlich so, wie du es bescheibst (ich habe das mit einem Arduino UNO und einem Ultraschallsensor getestet).

Wenn also alle LEDs immer leuchten, dann liegt das Problem wohl am Anschluss der LEDs.
Jede LED braucht einen eigenen Vorwiderstand (z.B. passen zum Testen Werte zwischen 500 und 1000 Ohm).

Hier auch noch eine “schlankere” Version des Codes (aber wie gesagt: dein Code funktioniert grundsätzlich):

#define gruen 13
#define gelb 12
#define rot 11
const int trigger = 7;
const int echo = 6; 
long dauer; 
int entfernung;

void setup() {
  Serial.begin (9600); 
  pinMode(trigger, OUTPUT); 
  pinMode(gruen, OUTPUT);
  pinMode(gelb, OUTPUT);
  pinMode(rot, OUTPUT);
}

void loop() {
  digitalWrite(trigger, HIGH);
  delay(10); 
  digitalWrite(trigger, LOW);
  dauer = pulseIn(echo, HIGH); 
  entfernung = dauer / 2 * 0.03432;    // 0.03432 scheint mir ein wenig viel, aber...

  digitalWrite(gruen, LOW);
  digitalWrite(gelb, LOW);
  digitalWrite(rot, LOW);  

  if (entfernung >= 300) {
    Serial.println("Messwert ungueltig"); 
  }
  else {
    Serial.print(entfernung);
    Serial.println(" cm");
    if (entfernung > 80  &&  entfernung < 150) {
      digitalWrite(gruen, HIGH);// grün
      Serial.println("Gruen an");
    }
    if (entfernung > 30 && entfernung <= 80) {
      digitalWrite(gelb, HIGH);// gelb
      Serial.println("Gelb an");
    }
    if (entfernung > 0 && entfernung <= 30) {
      digitalWrite(rot, HIGH);// rot
      Serial.println("Rot an");
    }
  }
  delay(1000); 
}

Hallo! Vielen Dank euch allen! :slight_smile:
Ja an meiner Ordnung muss ich noch etwas arbeiten! :!

Ich hab jetzt vor jeder LED ein 1kOhm Widerstand, ich hab immer noch das Problem, dass die LED´s immer leuchten, selbst wenn sie in der Schlaufe "Kein Messwert" sind. Es scheint so, als ob die LED´s immer an sind wenn LOW und immer aus sind wenn High gesetzt ist.

Habe ich evtl. eine Falsche Board/Programmer Einstellung?

Habe einen Funduino Mega 2560!

Für eine normale Logik (HIGH bedeutet Leuchten) muss die LED mit Vorwiderstand zwischen Pin und GND
angeschlossen werden, anscheinend hast du das anders gemacht,
nämlich die eine gemeinsame Seite der LEDs an 5V angeschlossen.

Jetzt kannst du die Hardware oder das Programm ändern.

Wenn du die Hardware änderst, musst du jeweils den anderen Pin benutzen:

jetzt 5V → Pin, jetzt Pin → GND

Hättest du einen Schaltplan, oder eine Beschreibung deiner Anschlussweise gepostet,
hätte man dir früher und viel einfacher helfen können.

Das wars! :smiley:
Vielen Dank euch allen!

Finde es schön, dass einem auch bei Anfänger-Fragen so schön und einfach geholfen wird! Tolles Forum!

joker88:
Finde es schön, dass einem auch bei Anfänger-Fragen so schön und einfach geholfen wird! Tolles Forum!

Ja, darauf sind auch wir stolz.
Grüße Uwe

joker88:
Finde es schön, dass einem auch bei Anfänger-Fragen so schön und einfach geholfen wird! Tolles Forum!

Und wenn ein "Fragender" so gut mitarbeitet, wie du, dann machen wir es besonders gern.