If ... else klemmt

Hallo Zusammen

ich möchte mittels Schalterposition die Werte der Variablen verändern. Der Schalter hat fünf Positionen und die Variablen sollten je nach Position einen anderen Wert haben. Bei meiner Programmierung bekomme ich nur die Werte von Else. Wie müsste ich programmieren, dass er beim ersten If anfängt?

unsigned long start;
unsigned long ende;
unsigned long p;  //Pause
unsigned long a;  //Arbeit
int pumpe = 12;
int led = 7;

int prog = 0;
int prog1 = 1;
int prog2 = 2;
int prog3 = 3;
int prog4 = 4;
int prog5 = 5;


void setup() {

Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

  pinMode(pumpe, OUTPUT);

  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);

  pinMode(prog1, INPUT);
  pinMode(prog2, INPUT);
  pinMode(prog3, INPUT);
  pinMode(prog4, INPUT);
  pinMode(prog5, INPUT);

//LED Test

  digitalWrite(pumpe, LOW);
  digitalWrite(led, HIGH);
  delay(250);
  digitalWrite(led, LOW);
  delay(250);
  digitalWrite(8, HIGH);
  delay(250);
  digitalWrite(8, LOW);
  delay(250);
  digitalWrite(9, HIGH);
  delay(250);
  digitalWrite(9, LOW);
  delay(1000);

}


void loop() {

/Hier werden alle If's übersprungen und die Werte von Else wieder gegeben.

  if (digitalRead(prog1) == HIGH) {
    a = 60000;
    p = 1180000;

  }

  if (digitalRead(prog2) == HIGH) {
    a = 120000;
    p = 1160000;

  }
  if (digitalRead(prog3) == HIGH) {
    a = 60000;
    p = 580000;

  }
  if (digitalRead(prog4) == HIGH) {
    a = 120000;
    p = 560000;

  }
  if (digitalRead(prog5) == HIGH) {
    a = 30000;
    p = 290000;

  }

else {        //Programm abbrechen
    a = 0;
    p = 0;
  }

  digitalWrite(pumpe, HIGH);
  delay(a);
  digitalWrite(pumpe, LOW);
        

  for (int i = 0; i >= 3; i++) {
    digitalWrite(led, HIGH);
        

    start = millis();
    for (int j = 0; j >= p ; j =  ende - start) {
      
      digitalWrite(led, HIGH);
      delay(1000);
      digitalWrite(led, LOW);
      delay(1500);
     
      ende = millis();
      
    }
    led = led + 1;
         }
}

Kann mir jemand weiter helfen? Den Schaltplan ist im Anhang.

Danke und Gruss
SuterB

Miss' mit einem Multimeter nach, ob der Schalter so funktioniert wie du dir das vorstellst.

Ich tippe darauf, dass prog5 funktioniert, immerhin ist der Fall das einzige if das ein else hat.

Woraus folgt, kein prog5, dann else, egal welches if vorher noch aktiv gewesen sein sollte.

In deinem Code sehe ich folgendes Problem: Bei deiner Struktur wird das else immer ausgeführt wenn Bedingung digitalRead(prog5) == HIGH nicht zutrifft. Egal ob vorher schon andere Bedingungen gepasst haben. Whandall hats auch schon erklärt.

Ich vermute du willst das hier (Beachte die else ifs) . Nur wenn keiner der Fälle zutrifft wird der untere else-Block ausgeführt:

 if (digitalRead(prog1) == HIGH) {
    a = 60000;
    p = 1180000;
  }
else if (digitalRead(prog2) == HIGH) {
    a = 120000;
    p = 1160000;
  }
else if (digitalRead(prog3) == HIGH) {
    a = 60000;
    p = 580000;
  }
else if (digitalRead(prog4) == HIGH) {
    a = 120000;
    p = 560000;
  }
else if (digitalRead(prog5) == HIGH) {
    a = 30000;
    p = 290000;
  }
else {        //Programm abbrechen
    a = 0;
    p = 0;
  }

...

Ja genau das mit dem "if ... else if" habe ich irgend wie nicht geschnallt. Danke für die Korrektur. Ich versuche es in Bälde aus und sage dann wieder Bescheid. :slight_smile:

Gruss SuterB

Ich schätze, du willst was ganz anderes, nämlich, dass dein Programm auf Änderungen reagiert. Das delay versaut alles.
Und den Drehschalter hättest du mit einem Analogpin erschlagen können.
Falls du wirklich einen Leonardo hast, ok. Aber für Arduinos mit 328 uC nimm lieber D1 nicht als Ein-/Ausgang.

Hat der keine Pullups?

suterb:
Kann mir jemand weiter helfen? Den Schaltplan ist im Anhang.

Du machst mehrere Fehler.

  • Die Pins 0 und 1 (TX/RX oder umgekehrt) sollten immer frei bleiben, damit einem nicht möglicherweise irgendeine serielle Kommunikation dazwischenfunken kann. Zumal Du ein Serial.begin() in setup() hast.
  • Benutze immer
 pinMode(..., INPUT_PULLUP)

damit auch „gerade in der Luft hängende“ Anschlüsse einen definierten Pegel haben.

Zudem könntest Du Deinen Code durch bloßes Umstellen/-formatieren erheblich lesbarer und verständlicher machen. Neulich habe ich das hier dazu gesabbelt.

HTH

Gregor

gregorss:
Du machst mehrere Fehler.

  • Die Pins 0 und 1 (TX/RX oder umgekehrt) sollten immer frei bleiben, damit einem nicht möglicherweise irgendeine serielle Kommunikation dazwischenfunken kann. Zumal Du ein Serial.begin() in setup() hast.
  • Benutze immer
 pinMode(..., INPUT_PULLUP)

damit auch „gerade in der Luft hängende“ Anschlüsse einen definierten Pegel haben.

In diesem Fall beides Quatsch.

Es handelt sich um einen Leonardo, es werden externe Pulldowns benutzt.

@gregorss du solltest vielleicht erst lesen und dann maulen...

Whandall:
@gregorss du solltest vielleicht erst lesen und dann maulen...

Wo bitte maule ich?!
Findest Du etwa wirklich, dass man erst einen kompletten Thread gelesen haben muss, um Antworten und vielleicht Nützliches beisteuern zu dürfen?!

Denk nochmal nach.

Gruß

Gregor

gregorss:
Findest Du etwa wirklich, dass man erst einen kompletten Thread gelesen haben muss, um Antworten und vielleicht Nützliches beisteuern zu dürfen?!

Unbedingt, zumindestens wenn man antworten will (das bedingt doch ein Verständnis der Frage).

Das was du da abgesondert hast, ist völlig am Thema vorbei und in der gegebenen Konfiguration unnütz.

Whandall:
Das was du da abgesondert hast, ist völlig am Thema vorbei.

... Oha, einer, der gerne Moderator wäre.

Gruß

Gregor

Wo steht denn, was genau er für einen uC hat? ich habe das bisher nur im Schaltplan gesehen, das kann aber auch falsch sein. Soll sich der TE doch erstmal äussern.

Ich merke seit einiger Zeit, dass die Stimmung und der Umgangston hier im Forum etwas abdriftet. Hat das Gründe?

Hat das Gründe?

  1. Ja, du wirst sensibler 8)

combie:
8) Ja, du wirst sensibler 8)

Das ist bestimmt dann das zunehmende Alter, was aber auch Ruhe und Gelassenheit mit sich bringt. :stuck_out_tongue:

ElEspanol:
Das ist bestimmt dann das zunehmende Alter, was aber auch Ruhe und Gelassenheit mit sich bringt. :stuck_out_tongue:

Genau :slight_smile: Du bist ganz schön alt g

Dass es in Webforen manchmal rustikal zur Sache geht, ist nicht ungewöhnlich. Außerdem ist Wochenende, gell :slight_smile:

Gruß

Gregor

Jarny:
In deinem Code sehe ich folgendes Problem: Bei deiner Struktur wird das else immer ausgeführt wenn Bedingung digitalRead(prog5) == HIGH nicht zutrifft. Egal ob vorher schon andere Bedingungen gepasst haben. Whandall hats auch schon erklärt.

Ich vermute du willst das hier (Beachte die else ifs) . Nur wenn keiner der Fälle zutrifft wird der untere else-Block ausgeführt:

 if (digitalRead(prog1) == HIGH) {

a = 60000;
   p = 1180000;
 }
else if (digitalRead(prog2) == HIGH) {
   a = 120000;
   p = 1160000;
 }
else if (digitalRead(prog3) == HIGH) {
   a = 60000;
   p = 580000;
 }
else if (digitalRead(prog4) == HIGH) {
   a = 120000;
   p = 560000;
 }
else if (digitalRead(prog5) == HIGH) {
   a = 30000;
   p = 290000;
 }
else {        //Programm abbrechen
   a = 0;
   p = 0;
 }

...

Danke für den Hinweis. Die If Abfrage funktioniert nun. Leider geht das Programm nach der If Abfrage nicht in die Schleife. Hast du mir hier noch ein Tipp?

unsigned long start;
unsigned long ende;
unsigned long p;  //Pause
unsigned long a;  //Arbeit
int pumpe = 12;
int led = 7;

int pin;
int pin1;
int pin2;
int pin3;
int pin4;
int pin5;
int i=0;
int j=0;

int button1 = 1;
int button2 = 2;
int button3 = 3;
int button4 = 4;
int button5 = 5;                       // Variable für Pin 8
int buttonStatus1;
int buttonStatus2;
int buttonStatus3;
int buttonStatus4;
int buttonStatus5;                          // in dieser Variable wird die Information
// abgespeichert ob der Taster gerade gerückt
// wird oder nicht


void setup() {

  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }



  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(12, OUTPUT);

  pinMode(pin1, INPUT);
  pinMode(pin2, INPUT);
  pinMode(pin3, INPUT);
  pinMode(pin4, INPUT);
  pinMode(pin5, INPUT);



  pinMode(button1, INPUT);                   // definiere Pin 8 als Eingang
  digitalWrite(button1, HIGH);               // aktiviert den Pull- Up- Widerstand
  pinMode(button2, INPUT);
  digitalWrite(button2, HIGH);
  pinMode(button3, INPUT);
  digitalWrite(button3, HIGH);
  pinMode(button4, INPUT);
  digitalWrite(button4, HIGH);
  pinMode(button5, INPUT);
  digitalWrite(button5, HIGH);


  digitalWrite(8, HIGH);
  delay(250);
  digitalWrite(8, LOW);
  delay(250);
  digitalWrite(9, HIGH);
  delay(250);
  digitalWrite(9, LOW);
  delay(1000);

}


void loop() {


  buttonStatus1 = digitalRead(1);       // prüfe ob Taster gedrückt oder nicht und
  buttonStatus2 = digitalRead(2);     // speicher die Information in
  buttonStatus3 = digitalRead(3);
  buttonStatus4 = digitalRead(4);
  buttonStatus5 = digitalRead(5);

  Serial.print("pin1 :");
  Serial.println(buttonStatus1);
  Serial.print("pin2 :");
  Serial.println(buttonStatus2);
  Serial.print("pin3 :");
  Serial.println(buttonStatus3);
  Serial.print("pin4 :");
  Serial.println(buttonStatus4);
  Serial.print("pin5 :");
  Serial.println(buttonStatus5);
  Serial.println("______________________");


  if (digitalRead(1) == LOW) {
    a = 2000;
    p = 6000;
    //a = 60000;
    //p = 1180000;
    
  
    goto Programm;
    Serial.println("Es wird das Programm 1 ausgeführt");
    Serial.println("1min pumpen 1H Pause");
    Serial.println("______________________");

  }
  else if (digitalRead(2) == LOW) {
    a = 120000;
    p = 1160000;
    goto Programm;
    Serial.println("Es wird das Programm 2 ausgeführt");
    Serial.println("2min pumpen 1H Pause");
    Serial.println("______________________");
  }
  else if (digitalRead(3) == LOW) {
    a = 60000;
    p = 580000;
    goto Programm;
    Serial.println("Es wird das Programm 3 ausgeführt");
    Serial.println("1min pumpen 0.5H Pause");
    Serial.println("______________________");
  }
  else if (digitalRead(4) == LOW) {
    a = 30000;
    p = 290000;
    goto Programm;
    Serial.println("Es wird das Programm 4 ausgeführt");
    Serial.println("0.5min pumpen 0.25H Pause");
    Serial.println("______________________");
  }
  else if (digitalRead(5) == LOW) {
    a = 120000;
    p = 28760000;
    goto Programm;
    Serial.println("Es wird das Programm 5 ausgeführt");
    Serial.println("2min pumpen 24H Pause");
    Serial.println("______________________");
  }
  else {
    a = 0;
    p = 0;
    goto ProgrammEnde; //Programm abbrechen
    Serial.println("Das Programm wird beendet.");
    Serial.println("48H Pause");
    Serial.println("______________________");
  }

// Dieser Block wird ausgeführt

Programm:

  Serial.print("Wert a: ");
  Serial.print(a);
  Serial.print("/ Wert b: ");
  Serial.println(p);

  digitalWrite(pumpe, HIGH);
  Serial.println("Pumpe ein ");
  delay(a);
  digitalWrite(pumpe, LOW);
  Serial.println("Pumpe aus ");
 
// Ab hier wird alles ausgelassen und zurück zum Anfang gesprungen

  for (i = 0; i >= 3; i++) {
    digitalWrite(led, HIGH);
    Serial.print("Pin HIGH: ");
    Serial.println(led);
    delay(3000);

    start = millis();
    Serial.print("Start: ");
    Serial.println(start);
    for (j = 0; j >= p ; j =  ende - start) {

      digitalWrite(led, HIGH);
      delay(1000);
      digitalWrite(led, LOW);
      delay(1500);

      ende = millis();

      Serial.print("Start: ");
      Serial.print(start);
      Serial.print(" / Ende: ");
      Serial.print(ende);
      Serial.print("/ j : ");
      Serial.println(j);



    }


    led = led + 1;
    Serial.print("LED Pin : ");
    Serial.println(led);
    Serial.print("i : ");
    Serial.println(i);
  }

ProgrammEnde:
  delay(0);

}

gregorss:
Genau :slight_smile: Du bist ganz schön alt g

Sooo alt nun auch wieder nicht. Ich hab aber schon viel mitgemacht. Und irgendwann lernt man, dass Zurückhaltung und Besonnenheit stärker die Nerven schont.
Und mein erster eigener Akustik-Koppler 1200/300 Baud liegt noch bei mir in der Garage. Dann kannst du ja in etwa ausrechnen, wieviele Foren, etc. ich schon gesehen haben könnte.
Falls jemand überhaupt noch weiss, was ein Akustik-Koppler ist :slight_smile:

Ich glaube, dem TO gefallen die Antworten hier nicht. Er versucht es jetzt nebenan.

Gruß Tommy

@Tommy56 Na ja, vielleicht hat es ihn irritiert dass niemand auf die Menge von "förderungswürdigen" gotos eingegangen ist.

Gibt es keine Warnungen für "unreachable code"?

@suterb entferne all die goto Zeilen und deren Ziele, die bringen es nicht.

Noch eine Bemerkung zum Rest des Kodes:
Das Timing würde ich nicht mit delays lösen und für den eigentlichen Ablauf eine Statemachine benutzen.

ElEspanol:
Ich schätze, du willst was ganz anderes, nämlich, dass dein Programm auf Änderungen reagiert. Das delay versaut alles.

Ja mein Programm soll auf Änderungen reagieren. Aber ohne Delay ist es mir zu kompliziert. Ich Wähle zuerst die Schalterposition und mache dann manuell einen Reset.