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

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:

C++:
#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:

C++:
#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("%");



}

}
 
Zuletzt bearbeitet von einem Moderator:

mrBrown

Super-Moderator
Mitarbeiter
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:
C++:
Serial.println(float(P1) * 100) + Serial.print("%");

P1 wird einfach stumpf ersetzt, wenn du P1 als 6 definierst wird dort also dieses ausgeführt:
C++:
Serial.println(6.0 * 100) + Serial.print("%");

Programm 2: Kompiliert gar nicht.
Und die Fehlermeldungen sehen wie aus?
 
Ja, das steht auch auch genau so dort:
C++:
Serial.println(float(P1) * 100) + Serial.print("%");

P1 wird einfach stumpf ersetzt, wenn du P1 als 6 definierst wird dort also dieses ausgeführt:
C++:
Serial.println(6.0 * 100) + Serial.print("%");


Und die Fehlermeldungen sehen wie aus?
Unter Anderem:
expected '}' before 'else'


Kann ich aber nicht machen, da Void Loop sonst schon vor dem Ende des Programms geschlossen ist.
Ja, das steht auch auch genau so dort:
C++:
Serial.println(float(P1) * 100) + Serial.print("%");

P1 wird einfach stumpf ersetzt, wenn du P1 als 6 definierst wird dort also dieses ausgeführt:
C++:
Serial.println(6.0 * 100) + Serial.print("%");


Und die Fehlermeldungen sehen wie aus?
Aber ich hab ihm doch gesagt, dass er die Pumpe entweder 1 oder 0 setzten soll.
 
K

kneitzel

Gast
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:
C++:
    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!
 
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:
C++:
    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!
Stimmt. Vielen Dank für die Antwort, werde morgen dann mal weiter schauen.
 

Thallius

Top Contributor
C++:
    if (pegel < AZ2 && pegel > AZ5)
    {
      do
      {
        P2 == 1;
      } while (pegel < AZ2);

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

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
 
K

kneitzel

Gast
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....
 

Neue Themen


Oben