Variable wird unerklärlicherweise 0

Hallo zusammen,

habe für meinen Pool eine Steuerung mit einem Arduino Uno gebaut.
Dieser Steuert meine zwei Pumpen und gibt auf einem 4x20 LCD einige Werte aus.

Und genau da liegt jetzt das Problem. Ich kann mir einfach nicht erklären warum der Arduino so reagiert.

Ich lasse mir auf dem Display unter anderem die Filterzeiten der Filterpumpe ausgeben.
Wenn dass Wasser kälter ist reduziere ich zum Stromsparen die Pumpenzeit auf einen gewissen Prozentsatz(50% - 100%);

wenn ich mir diesen Prozentsatz auf dem Display ausgeben lasse beträgt dieser allerdings null :confused:

Zugehörige Variablenteil:

int Filterpumpe_start[] = {900, 1600};                                // Die Einschaltzeiten für die Filterung (9.00 Uhr, 16.00 Uhr, ...)
int Filterpumpe_stopp[] = {1200, 1900};                               // Die Auschschaltzeiten für die Filterung (12.00 Uhr, 19.00 Uhr, ...)
int Filterpumpe_stopp_berechnet[] = {};                               // Die berechnete Auschschaltzeiten für die Filterung
float Filterpumpe_halbe_Filterzeit = 18.00;                           // Unter dieser Temperatur wird nur die halbe Zeit gefiltert
float Filterpumpe_ganze_Filterzeit = 24.00;                           // Über dieser Temperatur wird die komplette Zeit gefiltert
float Filterpumpe_prozent = 0;                                        // Prozentuale Verkürzung der Filterzeit

float Temperatur_Wasser = 0;                                          // Wassertemperatur

Berechnung des Prozentsatzes inklusive neuer Filterzeit:

void Filterpumpe_neu(){
  int Filterpumpe_Variable1 = 0;
  float Filterpumpe_aufloesung = 50 / (Filterpumpe_ganze_Filterzeit - Filterpumpe_halbe_Filterzeit);
  Filterpumpe_prozent = Filterpumpe_aufloesung * (Temperatur_Wasser - Filterpumpe_halbe_Filterzeit) + 50;
  if(Filterpumpe_prozent < 50){
    Filterpumpe_prozent = 50.00;
  }
  if(Filterpumpe_prozent > 100){
    Filterpumpe_prozent = 100.00;
  }
  for(int i = 0; i < sizeof(Filterpumpe_start) / sizeof(Filterpumpe_start[0]); i++){
    byte Filterpumpe_stunde_start = Filterpumpe_start[i] / 100;
    byte Filterpumpe_minute_start = Filterpumpe_start[i] - Filterpumpe_stunde_start * 100;
    byte Filterpumpe_stunde_stopp = Filterpumpe_stopp[i] / 100;
    byte Filterpumpe_minute_stopp = Filterpumpe_stopp[i] - Filterpumpe_stunde_stopp * 100;
    int Filterpumpe_dauer_vorher_in_min = (Filterpumpe_stunde_stopp - Filterpumpe_stunde_start) * 60 + Filterpumpe_minute_stopp - Filterpumpe_minute_start;
    int Filterpumpe_dauer_nachher_in_min = Filterpumpe_dauer_vorher_in_min * Filterpumpe_prozent / 100;
    int Filterpumpe_Variable2 = Filterpumpe_stunde_start * 60 + Filterpumpe_minute_start + Filterpumpe_dauer_nachher_in_min;
    Filterpumpe_stunde_stopp = Filterpumpe_Variable2 / 60;
    Filterpumpe_minute_stopp = Filterpumpe_Variable2 - Filterpumpe_stunde_stopp * 60;
    Filterpumpe_stopp_berechnet[i] = Filterpumpe_stunde_stopp *100 + Filterpumpe_minute_stopp;
    if(hour() * 100 + minute() >= Filterpumpe_start[i] && hour() * 100 + minute() < Filterpumpe_stopp_berechnet[i]){
      Filterpumpe_Variable1 = 100;
    }
    else{
      Filterpumpe_Variable1--;
    }
  }
  if(Filterpumpe_Variable1 > 0){
    Filterpumpe_an_auto = 1;
  }
  else{
    Filterpumpe_an_auto = 0;
  }
}

Ausgabe der Filterzeit:

      lcd.setCursor(0,1);
      lcd.print("Filterzeit von-bis");
      for(int i = 0; i < sizeof(Filterpumpe_start) / sizeof(Filterpumpe_start[0]); i++){
        lcd.setCursor(0,i + 2);
        lcd.print("          ");
        if(Filterpumpe_start[i] < 1000){
          lcd.print("0");
        }
        lcd.print(Filterpumpe_start[i]);
        lcd.print("-");
        if(Filterpumpe_stopp_berechnet[i] < 1000){
          lcd.print("0");
        }
        lcd.print(Filterpumpe_stopp_berechnet[i]);
      }
      lcd.setCursor(0,0);
      lcd.print("Reduktion auf ");
      lcd.print(Filterpumpe_prozent);
      lcd.print("%");

und genau in diesem Block liegt das Problem. Wenn ich

      lcd.setCursor(0,0);
      lcd.print("Reduktion auf ");
      lcd.print(Filterpumpe_prozent);
      lcd.print("%");

nach oben setze, also vor lcd.setCursor(0,1) zeigt es mir als Prozent 0.00 an. Klammere ich jetzt

        if(Filterpumpe_stopp_berechnet[i] < 1000){
          lcd.print("0");
        }
        lcd.print(Filterpumpe_stopp_berechnet[i]);

aus funktioniert es komischerweise wieder :confused:

es ist kein Problem den Programmcode so zu lassen damit er funktioniert, aber ich möchte verstehen warum er die Variable Filterpumpe_prozent auf 0.00 schreibt.

Habt ihr irgendwelche Ideen?

mfg
Skyliiine

Unerklärliches Verhalten kann seine Ursache ganz woanders haben.
z.B. das schreiben über Arraygrenzen hinweg ist eine übliche Ursache.

Hier ist so ein Kandidat:

int Filterpumpe_stopp_berechnet[] = {};  

// -----
 Filterpumpe_stopp_berechnet[i] = Filterpumpe_stunde_stopp *100 + Filterpumpe_minute_stopp;

Das kann nur ins Versagen führen.

:blush:

verdammtes Copy & Paste :blush:
hab einfach die Zeile int Filterpumpe_stopp = {1200, 1900}; kopiert und die Werte raus ohne die die länge des Arrays zu definieren :confused:

Jetzt funktionierts auch :smiley:

Vielen Dank, hätte mir ewig einen Wolf gesucht, da wär ich so schnell nicht drauf gekommen.

mfg
Skyliiine

Hi

Dinge, Die fest zueinander gehören, kann man in einem struct zusammen fassen - dort hättest Du dann für jede Filterpumpe start,stop,berechnet - egal, ob Du dafür einen Wert vorgibst.

MfG

Danke für den Hinweis, kommt auf meine lange to-do Liste :smiley:

mfg
Skyliiine