# Was ist falsch an meinem Programm? (C++)



## coffeelover615 (14. Jan 2021)

Meine Aufgabenstellung lautet:
In einem Drainageschacht sammelt sich Wasser. Es stehen zwei Pumpen zur Verfügung. Immer wenn ein gewisser Pegel überschritten wird, soll eine Pumpe starten (immer die „andere“, also abwechselnd). Bei einem Minimalpegel wird die Pumpe wieder gestoppt. Steigt der Pegel über einen Alarmpegel sollen beide Pumpen gestartet werden.
Wählen Sie geeignete Komponenten aus, bauen Sie diese entsprechend auf und programmieren Sie ein Steuerungsprogramm dafür.

Ich habe folgendes Programm geschrieben, es kompiliert:


```
#define P1 1
#define P2 1
#define TIGGER_PIN 2
#define ECHO_PIN 3

int oldbut = 1;
int Durchlauf = 1;

unsigned long get_sensor()
{
  digitalWrite(TIGGER_PIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TIGGER_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TIGGER_PIN, LOW);
  delayMicroseconds(2);                         //Schall wird ausgeschickt
  return pulseIn(ECHO_PIN, HIGH, 1000000L);     //Warte, bis Schall zurückkommt
}
void setup() {
  Serial.begin(9600);
  pinMode(P1, OUTPUT);                      //definiere Pumpe 1 als Ausgang
  pinMode(P2, OUTPUT);                      //definiere Pumpe 2 als Ausgang
  pinMode(TIGGER_PIN, OUTPUT);              //definiere Lautsprecher als Ausgang
  pinMode(ECHO_PIN, INPUT);                 //definiere Mikrophon als Eingang
}


void loop() {

  unsigned long sensor = get_sensor();

  int pegel = (sensor / 2) * 0.3432;
  int but = !digitalRead(pegel);

  int AZ2 = 100;                                 /**Einschaltpegel definieren**/
  int Min = 200;                                 /**Minimalen Pegel definieren, bei dem sich die Pumpe(n) ausschalten**/
  int AZ5 = 70;                                  /**Alarmpegel definieren, bei dem sich beide Pumpen einschalten!**/

  if (but == 1 && oldbut == 0) {                  /**Wenn der Taster gedrückt wird, dann noch einen Durchlauf**/
    Durchlauf++;

  }

  if (but == 1 && Durchlauf % 2 == 0) {           /** Wenn Taster gedrückt wird, und der Rest= 0 ist, wird die LED heller**/
    if (pegel < AZ2 && pegel > AZ5)
    {
      do {                                            /** LED wird heller, solange die Zahl kleiner als 255 ist.**/
        P1 == 1;
      } while (pegel < AZ2);

      if (pegel < AZ5)
      { do {
          P1 == 1;
          P2 == 1;
        } while (pegel < AZ5);
      }

      else if (pegel > AZ2)
      {
        P1 == 0;
        P2 == 0;
      }
    }


  }
  else if (but == 1 && Durchlauf % 2 == 1) {  
    if (pegel < AZ2 && pegel > AZ5)
    { do {
     
        P2 == 1;
      } while (pegel < AZ2);
      if (pegel < AZ5)
      { do {
          P1 == 1;
          P2 == 1;
        } while (pegel < AZ5);
      }

      else if (pegel > AZ2)
      {
        P1 == 0;
        P2 == 0;
      }
    }


  }


  oldbut = but;





  Serial.print("Auslastung Pumpe 1: ");
  Serial.println(float(P1) * 100) + Serial.print("%");


  Serial.print("Auslastung Pumpe 2: ");
  Serial.println(float(P2) * 100) + Serial.print("%");
```

Doch als Auslastungswert wird immer der Wert meines am Anfang bei #define festgelegten Ausgangs mit 100 multipliziert und ausgegeben, obwohl es überhaupt nichts damit zu tun hat.

P.S.: Die Pumpen können nur entweder 0 oder 100 Prozent leisten, keine Zwischenstufen.


Hier habe ich noch ein Programm verfasst, es ist ähnlich, kompiliert aber nicht:


```
#define P1 1
#define P2 1
#define TIGGER_PIN 2
#define ECHO_PIN 3

int oldbut = 1;
int Durchlauf = 1;

unsigned long get_sensor()
{
  digitalWrite(TIGGER_PIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TIGGER_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TIGGER_PIN, LOW);
  delayMicroseconds(2);                         //Schall wird ausgeschickt
  return pulseIn(ECHO_PIN, HIGH, 1000000L);     //Warte, bis Schall zurückkommt
}
void setup() {
  Serial.begin(9600);
  pinMode(P1, OUTPUT);                      //definiere Pumpe 1 als Ausgang
  pinMode(P2, OUTPUT);                      //definiere Pumpe 2 als Ausgang
  pinMode(TIGGER_PIN, OUTPUT);              //definiere Lautsprecher als Ausgang
  pinMode(ECHO_PIN, INPUT);                 //definiere Mikrophon als Eingang
}


void loop() {

  unsigned long sensor = get_sensor();

  int pegel = (sensor / 2) * 0.3432;
  int but = !digitalRead(pegel);

  int AZ2 = 100;                                 /**Einschaltpegel definieren**/
  int Min = 200;                                 /**Minimalen Pegel definieren, bei dem sich die Pumpe(n) ausschalten**/
  int AZ5 = 70;                                  /**Alarmpegel definieren, bei dem sich beide Pumpen einschalten!**/

  if (but == 1 && oldbut == 0) {                  /**Wenn der Taster gedrückt wird, dann noch einen Durchlauf**/
    Durchlauf++;

  }

  if (pegel < AZ2 && pegel > AZ5 && Durchlauf % 2 == 0) {           /** Wenn Taster gedrückt wird, und der Rest= 0 ist, wird die LED heller**/
    if (pegel < AZ2 && pegel > AZ5)
    {
      do {                                            /** LED wird heller, solange die Zahl kleiner als 255 ist.**/
        P1 == 1;
      }while(pegel < AZ2);



    } else if(pegel > AZ2)
      {
        P1 == 0;
        P2 == 0;
      }
    }



  else if (pegel < AZ2 && pegel > AZ5 && Durchlauf % 2 == 1) {
    if (pegel < AZ2 && pegel > AZ5)
    { do {

        P2 == 1;
      } while (pegel < AZ2);


      else if (pegel > AZ2)
      {
        P1 == 0;
        P2 == 0;
      }
    }


  }

else if(pegel < AZ5)
  { do {
      P1 == 1;
      P2 == 1;
    } while (pegel < AZ5);
  }

  else (pegel < AZ5)
  { do {
      P1 == 1;
      P2 == 1;
    } while (pegel < AZ5);
  }

  oldbut = but;





  Serial.print("Auslastung Pumpe 1: ");
  Serial.println(float(P1) * 100) + Serial.print("%");


  Serial.print("Auslastung Pumpe 2: ");
  Serial.println(float(P2) * 100) + Serial.print("%");



}

}
```


----------



## mrBrown (14. Jan 2021)

Und was ist das Problem?


----------



## coffeelover615 (14. Jan 2021)

mrBrown hat gesagt.:


> Und was ist das Problem?


Oh, entschuldige, habe vergessen, den Fehler dazu zu schreiben.

Programm 1:

Kompiliert, gibt aber nicht 100 % und 0 % Leistung aus, sondern 600 %. (Zumindest. wenn ich "#define P1 6" schreibe. Die Zahl neben P1 stellt den Ausgang vom Arduino dar.


----------



## coffeelover615 (14. Jan 2021)

mrBrown hat gesagt.:


> Und was ist das Problem?


Programm 2: Kompiliert gar nicht.


----------



## mrBrown (14. Jan 2021)

coffeelover615 hat gesagt.:


> Kompiliert, gibt aber nicht 100 % und 0 % Leistung aus, sondern 600 %. (Zumindest. wenn ich "#define P1 6" schreibe.


Ja, das steht auch auch genau so dort:

```
Serial.println(float(P1) * 100) + Serial.print("%");
```

P1 wird einfach stumpf ersetzt, wenn du P1 als 6 definierst wird dort also dieses ausgeführt:

```
Serial.println(6.0 * 100) + Serial.print("%");
```



coffeelover615 hat gesagt.:


> Programm 2: Kompiliert gar nicht.


Und die Fehlermeldungen sehen wie aus?


----------



## coffeelover615 (14. Jan 2021)

mrBrown hat gesagt.:


> Ja, das steht auch auch genau so dort:
> 
> ```
> Serial.println(float(P1) * 100) + Serial.print("%");
> ...


Unter Anderem:
expected '}' before 'else'


Kann ich aber nicht machen, da Void Loop sonst schon vor dem Ende des Programms geschlossen ist.


mrBrown hat gesagt.:


> Ja, das steht auch auch genau so dort:
> 
> ```
> Serial.println(float(P1) * 100) + Serial.print("%");
> ...


     Aber ich hab ihm doch gesagt, dass er die Pumpe entweder 1 oder 0 setzten soll.


----------



## kneitzel (14. Jan 2021)

Also formatiere Deinen Code vernünftig und schau, wo Du welche Blöcke schließt.

Zu sauber formatiertem Code gehört aus meiner Sicht:
a) eine klare Schreibweise. Also Wo willst Du die { haben? Am Ende der eigentlichen Zeile? In der nächsten Zeile? Egal wie, nicht mischen!
b) Leerzeilen kontrollieren!
c) Funktionen, die immer länger werden in mehrere Funktionen unterteilen! Vor allem, wenn der Code fast gleich ist! ==> Refactoring!

Bei Dir ist das Problem die Stelle:

```
if (pegel < AZ2 && pegel > AZ5)
    { 
      do
      {
        P2 == 1;
      } while (pegel < AZ2);

      else if (pegel > AZ2)
      {
        P1 == 0;
        P2 == 0;
      }
    }
```

Du hast also ein else nach einer while Schleife!


----------



## coffeelover615 (14. Jan 2021)

kneitzel hat gesagt.:


> Also formatiere Deinen Code vernünftig und schau, wo Du welche Blöcke schließt.
> 
> Zu sauber formatiertem Code gehört aus meiner Sicht:
> a) eine klare Schreibweise. Also Wo willst Du die { haben? Am Ende der eigentlichen Zeile? In der nächsten Zeile? Egal wie, nicht mischen!
> ...


Stimmt. Vielen Dank für die Antwort, werde morgen dann mal weiter schauen.


----------



## Thallius (15. Jan 2021)

kneitzel hat gesagt.:


> ```
> if (pegel < AZ2 && pegel > AZ5)
> {
> do
> ...



Ich habe zwar lange kein C++ mehr gemacht aber ich bezweifele mal, dass man mittlerweile Konstanten (defines) Werte zuweisen kann oder?

@TO

Dein Code ist komplett unleserlich da du dich an keine Konventionen hälst. Ich bin zwar auch kein Erbsenzähler was das angeht wie manch andere hier im Forum aber man sollte zumindest seinen Variablen und Kostanten aussagekräftige Namen geben und nicht P1, AZ etc. Ausserdem ist es echt praktisch, wenn man Konstanten (defines) komplett in Großbuchstaben schreibt und Variablen im CamelCase. Dann muss man nicht immer erst suchen was was ist. Eine Zahl in einem Variablennamen läßt zu 99% auf ein schlechtes Konzept schließen.

Gruß

Claus


----------



## kneitzel (15. Jan 2021)

Thallius hat gesagt.:


> Ich habe zwar lange kein C++ mehr gemacht aber ich bezweifele mal, dass man mittlerweile Konstanten (defines) Werte zuweisen kann oder?


Das geht natürlich nicht. Aber das macht er ja auch nicht, denn er nutzt ja == und nicht =. Dadurch übersetzt der Code, aber der Code macht natürlich in keiner Weise, was erwartet wird. Ein "P1 == 1;" macht halt absolut nichts. Der Compiler wird sollte dies als festes 1 == 1; umsetzen und den Ausdruck zumindest in eine Art "true;" umsetzen wobei die Optimierung das hoffentlich auch direkt wegschmeißen wird....


----------

