Probleme mit if/else-Verarbeitung

Hallo Gemeinde,

beschäftige mich seit kurzen mit meinem neuen Genuino Uno. Habe einige C Kentnisse, jedoch komme ich momentan nicht weiter. Hoffe dass mir jemand helfen kann.
Mein Quellcode ist auch nicht sonderlich lange, zum Verständnis, wenn die rote LED Namens "LEDrot" mit HIGH angesteuert wird, soll mein Sounder "buzzer" solang piepsen, wie meine LED leuchtet.

Jedoch passiert gar nichts. Die LED´s leuchten wie im Quellcode nacheinander für je 150ms, jedoch ertönt der Sounder nicht, wenn "LEDrot = HIGH" ist. Hat jemand eine Idee, warum meine If-Bedingung nicht beachtet wird? Danke im voraus.

int LEDrot  = 2;
int LEDgelb = 3;
int LEDgrun = 4;
int buzzer  = 5;



void setup()
{
  pinMode(LEDrot, OUTPUT);
  pinMode(LEDgelb, OUTPUT);
  pinMode(LEDgrun, OUTPUT);
  pinMode(buzzer, OUTPUT);

  if (LEDrot == HIGH) 
  {
    digitalWrite(4, HIGH);
  } 
  else 
  {
    digitalWrite(4, LOW);
  }
}

void loop()
{

  delay(150);
  digitalWrite(LEDrot, HIGH);
  delay(150);
  digitalWrite(LEDrot, LOW);
  delay(150);
  digitalWrite(LEDgelb, HIGH);
  delay(150);
  digitalWrite(LEDgelb, LOW);
  delay(150);
  digitalWrite(LEDgrun, HIGH);
  delay(150);
  digitalWrite(LEDgrun, LOW);
  delay(150);

}

Ich würde die if..else in die loop schreiben und nicht in die setup.
Bei dir wird die if schleife einmal im setup ausgeführt und dann nie wieder.
gruß

und mit den delay klappt es eh nicht, dann müsstest du nach jedem delay neu abfragen.

if (LEDrot == HIGH)

Da "int LEDrot = 2;" ist "LEDrot == HIGH" immer true.
Und da im Setup, wirds sowieso nur einmal gemacht.

Ich glaube, du versuchst eine Ablaufsteuerung zu bauen.
Dein LED Umschalter, sieht fast wie eine Schrittkette aus.

Ablaufsteuerung

Meine Standardantwort zu Ablaufsteuerungen:
Eine Stichworte Sammlung für Google Suchen:
Endlicher Automat,
State Machine,
Multitasking,
Coroutinen,
Ablaufsteuerung,
Schrittkette,
BlinkWithoutDelay,

Blink Without Delay
Der Wachmann

Multitasking Macros
Intervall Macros

Nachtrag:
:o if schleife :o

Hallo,

:slight_smile: :slight_smile: :slight_smile:

setup wird nur einmalig ausgeführt. Deine Abfrage läuft ins leere.
Nur loop wird ständig durchlaufen.

wenn du mit delays arbeitest, mußte auch direkt hinter dem einschalten der roten LED auch den Buzzer einschalten und irgendwann wieder ausschalten. Und wenn dir die delay irgendwann lästig werden, verwende millis. Dann blockiert auch nichts und du kannst in der loop jederzeit Zustände abfragen und verarbeiten.

Theseus erklärt millis()

Diese wird nur einmal bearbeitet beim Starten des Arduino außerdem ist zu dem Zeitpunkt noch keine LEDrot HIGH. Die Abfrage muss in loop, außerdem würde ich dir raten das Blinken wie im Beispiel "Blink without delay" zu machen sonst wird deine Abfrage nur nach über ner Sekunde bearbeitet.

Gruß

EDIT: Mensch Doc wieder 6 Sekunden schneller :slight_smile:

Hallo,

die anderen waren noch schneller. :slight_smile:
Für den TO sollte das nun klar sein.

Danke euch für die vielen Antworten!

Anfangs war meine if/else-Bedingung im Loop, funktionierte auch nicht.
Anscheinend liegt es wirklich an den 'delays'.
Werde mich nochmal einlesen und es ohne diese probieren.

Anscheinend liegt es wirklich an den 'delays'.
Werde mich nochmal einlesen und es ohne diese probieren.

Ja, meist sind Delays arg unpraktisch, da sie nebenläufige Programmstränge wirksam verhindern.

Hallo,

wenn ich mir das zusammen reime was du vielleicht im Besten Fall hattest, dann komme ich auf das hier.
Dabei habe ich in if/else noch den Pin 4 auf buzzer Pin korrigiert.

int LEDrot  = 2;
int LEDgelb = 3;
int LEDgrun = 4;
int buzzer  = 5;

void setup()
{
  pinMode(LEDrot, OUTPUT);
  pinMode(LEDgelb, OUTPUT);
  pinMode(LEDgrun, OUTPUT);
  pinMode(buzzer, OUTPUT);
}

void loop()
{

  digitalWrite(LEDrot, HIGH);
  if (LEDrot == HIGH) {
    digitalWrite(buzzer, HIGH);
  }
  else {
    digitalWrite(buzzer, LOW);
  }
  delay(150);
  digitalWrite(LEDrot, LOW);
  delay(150);
  digitalWrite(LEDgelb, HIGH);
  delay(150);
  digitalWrite(LEDgelb, LOW);
  delay(150);
  digitalWrite(LEDgrun, HIGH);
  delay(150);
  digitalWrite(LEDgrun, LOW);
  delay(150);

}

Davon ausgehend kann das nicht funktionieren wie gedacht. Weil du hast gar keine Variable die du auf HIGH vergleichen kannst.
Du hast nur den Pin 2 mit dem Namen LEDrot deklariert und initialisiert. Das heißt die Variable LEDrot hat den Wert 2. Und nur diesen Pin schaltest du direkt vorher mit digitalWrite ein. Das hat nichts damit zu tun das die Variable LEDrot den Wert "HIGH" bekommt. Diese bleibt bei 2. Sonst könntest du den Pin 2 mit LEDrot als Namen auch nie wieder ausschalten. Weil LOW ist 0 und HIGH ist 1.

Also wenn man solchen Unsinn schreiben würde ...

int LEDrot = HIGH;

welcher Pin würde dann mit digitalWrite geschalten? :slight_smile:

  digitalWrite(LEDrot, HIGH);
  if (LEDrot == HIGH) {
    digitalWrite(buzzer, HIGH);
  }
  else {
    digitalWrite(buzzer, LOW);
  }

Das ist alles ziemlicher Unsinn.
Was soll denn der Code tun.

LEDrot == HIGH ist erstmal immer False. Es sei denn das HIGH zufällig mit 2 definiert wäre.
Ich glaube du meinst

if (digitialRead(LEDrot) == HIGH) // ist equivalent zu if (digitalRead(LEDrot))

Ist semantisch aber immer noch Blödsinn weil du ja etwas testest was du doch genau weisst.
Nämlich das IO-Port 2 auf HIGH steht. Hast du ja eine Zeile vorher gemacht und da ist nichts
bedingtes dazwischen.
Was willst du eigentlich ?

Ulli