INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Einfache IF-Abfrage....(mir) unerklärlicher Fehler
23.03.2019, 11:21
Beitrag #1
Einfache IF-Abfrage....(mir) unerklärlicher Fehler
Hallo Zusammen,

ich verzweifel aktuell an einer vermeindlich leichten IF-Abfrage:

//Membranspülung
if (aktMillis - lastMillis_Me >= Filterwechsel_Membran)

Diese Bedingung wird nicht ausgeführt, der Sketch springt gleich auf else.
Ich bin da nun 3 Stunden am probieren und rätseln.
Irgendwie hab ich da ´n Knoten im Hirn...kann keinen Fehler finden.

Was hab ich da verbockt?

Code:
//  FUNKTION FILTERWECHSEL (DoubleClick)
void Func_Filterwechsel() {

  static unsigned long lastMillis_Me = 0;
  static unsigned long lastMillis_St = 0;
  static unsigned long lastMillis_LED = 0;
  static byte LedStatus = LOW;
  static unsigned long aktMillis;
  static byte status = 0;
  static byte status_LCD = 0;

  //Endlosschleife (Ausstieg mit break)
  while (1)
  {

    aktMillis = millis();

//################################################################################​###########################

    //Taster-LED blinken lassen
    if (LedStatus == LOW) {
      if (aktMillis - lastMillis_LED >= Blink_Interval) {
        digitalWrite(TasterLED, HIGH);
        lastMillis_LED = aktMillis;
        LedStatus = HIGH;
      } //Ende von if
    } //Ende von if LOW
    else {
      if (aktMillis - lastMillis_LED >= Blink_Interval) {
        digitalWrite(TasterLED, LOW);
        LedStatus = LOW;
        lastMillis_LED = aktMillis;
      } //Ende von if
    } //Ende von else

    //################################################################################​###########################

    //Membranspülung
     if (aktMillis - lastMillis_Me >= Filterwechsel_Membran) {

      //Magnetventile schalten
      digitalWrite(Reinwasser, LOW);
      digitalWrite(MembranSpuelung, HIGH);
      digitalWrite(Rohwasser, HIGH);

      status = 1;

      lastMillis_Me = aktMillis;

      if (status_LCD == 0) {

        //Display löschen.
        lcd.clear();

        //LCD-Backlight einschalten
        lcd.backlight();

        //Cursor positionieren (Spalte , Zeile)
        lcd.setCursor ( 1, 0 );

        //Textausgabe
        lcd.print("FILTERWECHSEL");

        //Display löschen.
        lcd.clear();

        //Cursor positionieren (Spalte , Zeile)
        lcd.setCursor ( 1, 1 );

        //Textausgabe
        lcd.print ("Membransp\365lung");

        status_LCD = 1;

      } //Ende if Status_LCD

    } //Ende von if Membranspülung

    else {

      //################################################################################​###########################

      //Stehwasserspülung

      digitalWrite(MembranSpuelung, LOW);
      digitalWrite(StehwasserSpuelung, HIGH);

      lastMillis_St = aktMillis;

      if (status_LCD == 1) {

        //Display löschen.
        lcd.clear();

        //LCD-Backlight einschalten
        lcd.backlight();

        //Cursor positionieren (Spalte , Zeile)
        lcd.setCursor ( 1, 0 );

        //Textausgabe
        lcd.print("FILTERWECHSEL");

        //Cursor positionieren (Spalte , Zeile)
        lcd.setCursor ( 1, 1 );

        //Textausgabe
        lcd.print ("Stehwassersp\365l.");

        status_LCD = 2;

      } //Ende if Status_LCD

    } //Ende von else

    //Abbruchbedingung für while-Endlosschleife
    if (status == 1 && Filterwechsel_Stehw >= aktMillis - lastMillis_St) {
      //Zeitstempel für LastReinwasser
      LastReinwasser = millis();
      break;
    } //Ende der Abbruchbedingung

  } //Ende der while-Endlosschleife

} //Ende Func_Filterwechsel
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.03.2019, 11:43
Beitrag #2
RE: Einfache IF-Abfrage....(mir) unerklärlicher Fehler
Am Anfang dürfte die Bedingung auch nicht erfüllt sein. Für genauere Aussagen fehlen Variablendeklarationen.

Schreibe Dir vor und in die if und else Serial.print-Ausgaben mit den Werten der Variablen rein. Dann siehst Du, was passiert.

Die while(1) ist ungünstig, Du hast doch loop.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.03.2019, 11:57
Beitrag #3
RE: Einfache IF-Abfrage....(mir) unerklärlicher Fehler
Hallo Tommy, besten Dank.

Die Variablendeklarationen, die weiter oben stehen:
const unsigned long Filterwechsel_Membran = (3 * 60 * 100UL);
const unsigned long Filterwechsel_Stehw = (10 * 60 * 10UL);

Warum ist die Bedingung am Anfang nicht erfüllt....beim "Blinkmodus" der Taster-LED mit gleichem Ablauf geht es doch auch?

While nehme ich gerne raus, aber wie beende ich dann die Func_Filterwechsel richtig nach Abarbeitung aller Zeiten?
Die Variable status hatte ich schon getestet, bleibt bei 0....oder meinst Du andere Variablen?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.03.2019, 12:04
Beitrag #4
RE: Einfache IF-Abfrage....(mir) unerklärlicher Fehler
(23.03.2019 11:57)Lite schrieb:  const unsigned long Filterwechsel_Membran = (3 * 60 * 100UL); <-- 18 Sekunden
const unsigned long Filterwechsel_Stehw = (10 * 60 * 10UL); <-- 6 Sekunden
Die dürften beim ersten Durchlauf noch nicht erreicht sein.

Beenden kannst Du über passende Statusvariablen.
Ich meine, Du sollst Dir die Werte der Variablen anschauen, die am if beteiligt sind.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.03.2019, 12:39
Beitrag #5
RE: Einfache IF-Abfrage....(mir) unerklärlicher Fehler
Also die Werte sind logisch, allerdings scheint mein Sketch genau das Gegenteil von dem zu machen, was ich will.

Ich will, daß die Membranspülung 18s läuft und nach Ablauf der 18s soll die Stehwasserspülung 6s laufen und dann soll die FUNC verlassen werden, also wieder zurück in die Hauftschleife.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.03.2019, 13:10 (Dieser Beitrag wurde zuletzt bearbeitet: 23.03.2019 13:10 von Tommy56.)
Beitrag #6
RE: Einfache IF-Abfrage....(mir) unerklärlicher Fehler
Dann musst Du das auch so programmieren Wink
Ein Else macht nicht immer das, was man sich vorstellt.

Gruß Tommy

Edit: Schau mal nach endlicher Automat bzw. Statemaschine

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.03.2019, 14:23 (Dieser Beitrag wurde zuletzt bearbeitet: 23.03.2019 14:32 von Lite.)
Beitrag #7
RE: Einfache IF-Abfrage....(mir) unerklärlicher Fehler
(23.03.2019 13:10)Tommy56 schrieb:  Dann musst Du das auch so programmieren Wink

Guter Ratschlag, aber begrenzt hilfreich, wenn man nun aktuell seit fast 6 Stunden ohne Unterbrechung daran rumflickt und den dreh einfach nicht findet.

Die Statemachine habe ich mir im Nachbarforum angeschaut und finde zu meinem Konstrukt keine Ansatzpunkte, bzw. Fehler in meinem Code.

Irgendwas ist da grundsätzlich falsch in meinem Code und nach 6 Stunden kann ich wohl sagen: Ich kapiers nicht.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.03.2019, 14:34
Beitrag #8
RE: Einfache IF-Abfrage....(mir) unerklärlicher Fehler
Als Anregung (Pseudocode)
Code:
byte status = 0; // 0 = Anfang aus, 1 = Membran, 2 = Steh, 3 = fertig
uint32_t lastMillis;

void loop() {
uint32_t aktMillis = millis();
  // Die Bedingung zum Einschalten habe ich nicht erkannt
  if (status == 0 && Einschaltbedingung) {
    status = 1;
    membranEin;
    lastMillis = aktMillis;
  }
  if (status == 1 && aktMillis - lastMillis >= dauerMembran) {
   membranAus;
   stehEin;
   status = 2;
   lastMillis = aktMillis;
  }
  if (status == 2 && aktMillis - lastMillis >= dauerSteh) {
   stehAus;
   status = 3;
  }
}
Was nach 4 passieren soll, weiß ich nicht. Du kannst das Ganze auch mit switch/case machen, wenn Dir das besser gefällt.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Fehler bei delay über 32767 Kleingärtner 5 308 07.05.2020 18:51
Letzter Beitrag: Kleingärtner
  Fehler bei eigener Library Samu_wo 4 279 20.04.2020 15:51
Letzter Beitrag: Samu_wo
  Funk Fernbedienung Taster Abfrage kurz oder lange gedrückt Michi_exe 15 596 16.04.2020 17:19
Letzter Beitrag: Tommy56
  Fehler beim Kompilieren Lunge 6 379 09.04.2020 14:07
Letzter Beitrag: MicroBahner
  Undefined reference-Fehler beim Kompilieren MdE 9 533 24.03.2020 21:39
Letzter Beitrag: Tommy56
  Stepper Motor mit zwei Taster bedienen / Fehler ohne Fehlermeldung Milano 6 493 21.03.2020 16:06
Letzter Beitrag: MicroBahner
  Fehler bei Kompilieren ak68 6 794 21.03.2020 13:12
Letzter Beitrag: Tommy56
  Reihenfolge bei && Abfrage Harry 1 350 18.02.2020 19:14
Letzter Beitrag: Tommy56
  Arduino Taster - Welcher Fehler? lil.chem 4 543 10.02.2020 22:39
Letzter Beitrag: Franz54
  Compiler Fehler Meldung TKK-Arduino 40 2.203 09.02.2020 14:28
Letzter Beitrag: TKK-Arduino

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste