Zeiten, LCD Anzeige und Formatierungsprobleme

Hallo,
vorab, ich versuche seit 2 Monaten eine automatische Gartenbewässerung zu realisieren.
Da doch insgesamt meine Vorstellung zu meinem Können zu komplex war, hab ich das ganze mal zurückgestuft auf ein “Tropfsystem”.

Hierzu sollen um 6 Uhr die Füllstandssensoren eingeschaltet werden (Korrosionsschutz) diese werden über ein Mosfet Modul geschaltet.

Anschließend soll ausgewertet werden ob die Fässer voll sind.
Ist dies nicht der Fall, soll so lange Pumpe 1 (Relais Modul) laufen bis das Fass 1 voll ist.

Nun soll Pumpe 2 (Relais Modul) für 5 Minuten Wasser in das Fass umpumpen, an das das Tropfsystem angeschlossen ist.

Anzeigen will ich auf dem LCD die Uhrzeit in Zeile 1 und in Zeile 2 den aktuellen Zustand der Fässer.

Zusätzlich soll jederzeit, wenn ein Taster gedrückt wird, Fass 1 gefüllt werden, bis der Füllstandssensor erreicht wird. (Um z.B. mit der Gießkanne Wasser zu entnehmen)

Leider komme ich nicht mehr weiter.
Die Probleme:

Die Zeit auf dem Display hält an, wenn z.B. Pumpe 1 an ist, läuft aber im Hintergrund weiter. Woran liegt das?

Die Gliederung des Codes ist wohl unter aller Sau, da ich für die Zeitsache von anderen Programmen kopiert und probiert habe bis es lief x_x

Ich versteh noch nicht so ganz wie man das in einzelne Unterpunkte aufgliedert, die dann aufgerufen werden. Eventuell könnte da jemand helfen.

Das mit dem Einschalten um die bestimmte Uhrzeit klappt auf dem Breadboard soweit, nur wie ich den 5 Minuten Timer für das Umpumpen realisiere versteh ich nicht…

anbei der Code, den ich so gut wie möglich auskommentiert habe.

//TODO:

//LCD Anzeige aus Schleife raus in Unterprogramm machen
// Schalte um 6 Uhr Sensoren an und teste Bach, dann Fass
// Danach schalte für 5 Minuten Pumpe 2 an


#include <LiquidCrystal.h>
#include "Wire.h"
#define DS3231_I2C_ADDRESS 0x68


LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

byte hour;
byte minute;
byte second;
byte dayOfWeek;
byte dayOfMonth;
byte day;
byte month;
byte year;
int f; //Test Merker wenn Uhrzeit da war aber Fass 1 noch nicht voll

byte decToBcd(byte val)
{
  return( (val/10*16) + (val%10) );
}
// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
  return( (val/16*10) + (val%16) );
}

void setup()
{

lcd.begin(16, 2);
lcd.clear(); // clear display

pinMode( 6, INPUT); //Fass 1 SENSOR PIN 6 und an Gehäuseanschluss 16
pinMode( 7, INPUT); //Bach SENSOR PIN7 und an Gehäuseanschluss 13
pinMode( 8, OUTPUT); //Mosfet für Sensorspannung schalten (HIGH ist ein)
pinMode( 9 , OUTPUT); // Relais Pumpe 1 (Bach - Fass) an/aus (Relais ist an wenn D9 LOW ist)
pinMode( 10 , OUTPUT); //Relais Pumpe 2 (Fass - Fass)
pinMode( 13 , INPUT); //Taster Fass 1 manuell auf Knopfdruck füllen

digitalWrite( 8 , LOW ); //Sensorspannung in Grundstellung "aus" bringen
digitalWrite( 9 , HIGH ); //Relais 1 in Grundstellung "aus" bringen
digitalWrite( 10 , HIGH ); //Relais 2 in Grundstellung "aus" bringen

  //ZUM EINMALIGEN EINSTELLEN DER ZEIT
  Wire.begin();
  Serial.begin(9600);
  // set the initial time here:
  // DS3231 seconds, minutes, hours, day, date, month, year
  //setDS3231time(00,11,2,5,13,8,16);
}

void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte
dayOfMonth, byte month, byte year)
{
  // sets time and date data to DS3231
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0); // set next input to start at the seconds register
  Wire.write(decToBcd(second)); // set seconds
  Wire.write(decToBcd(minute)); // set minutes
  Wire.write(decToBcd(hour)); // set hours
  Wire.write(decToBcd(dayOfWeek)); // set day of week (1=Sunday, 7=Saturday)
  Wire.write(decToBcd(dayOfMonth)); // set date (1 to 31)
  Wire.write(decToBcd(month)); // set month
  Wire.write(decToBcd(year)); // set year (0 to 99)
  Wire.endTransmission();
}
void readDS3231time(
byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year)
{
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0); // set DS3231 register pointer to 00h
  Wire.endTransmission();
  Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
  // request seven bytes of data from DS3231 starting from register 00h
  *second = bcdToDec(Wire.read() & 0x7f);
  *minute = bcdToDec(Wire.read());
  *hour = bcdToDec(Wire.read() & 0x3f);
  *dayOfWeek = bcdToDec(Wire.read());
  *dayOfMonth = bcdToDec(Wire.read());
  *month = bcdToDec(Wire.read());
  *year = bcdToDec(Wire.read());
}

void loop()
{

 //ZEIT AUF LCD ANZEIGEN
  readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,
  &year);
  lcd.setCursor(0, 0);
  if(hour <10)
  lcd.print ("0");
  lcd.print(hour);
  lcd.print(":");
  if(minute <10)
  lcd.print ("0");
  lcd.print(minute);
   lcd.print(":");
  if(second <10)
  lcd.print ("0");
  lcd.print(second);


//Wenn Fass voll und Bach leer LCD-Ausgabe
while ( ( !( digitalRead( 7) ) && digitalRead( 6) ) )
{
lcd.setCursor(0, 1);
lcd.print("FASS VOLL      ");
}



  //Taster Pumpe manuell ON bis bis Fass voll (automatische Abschaltung)
if (digitalRead( 13))
{
while ( ( !( digitalRead( 6) ) && digitalRead( 7) ) )  //solange Fass leer und Bach voll
{
lcd.setCursor(0, 1);
lcd.print("Pumpe 1 manuell ");
digitalWrite( 8 , HIGH );  //Sensor dauerhaft einschalten
digitalWrite( 9 , LOW );  //Pumpe 1 einschalten
}}

  //_______________________________________________________
       //Ab hier if 6 Uhr -> einschalten zum Fass und Bach test
       //45 Minuten an lassen (Bzw so lange bis Fass voll
if (hour == 6 && minute == 00)
{
digitalWrite( 8 , HIGH );  //Sensor einschalten
if (digitalRead( 7))  //Bach auf Wasser testen
{
if (digitalRead( 6))  //Wenn Bach ==1, Fass testen
{

lcd.setCursor(0, 1);
lcd.print("Fass ist voll   ");
digitalWrite( 8 , LOW );  //Sensor aussschalten
digitalWrite( 9 , HIGH );  //Pumpe 1 ausschalten
}
else 
{
while ( ( !( digitalRead( 6) ) && digitalRead( 7) ) )  //Solange Fass leer und Bach voll
{

lcd.setCursor(0, 1);
lcd.print("Pumpe 1 ist an  ");
digitalWrite( 9 , LOW );  //Pumpe einschalten
}

}
}
else  //Wenn Bach kein Wasser hat
{

lcd.setCursor(0, 1);
lcd.print("Bach leer!      ");
digitalWrite( 8 , LOW );  //Sensor ausschalten
digitalWrite( 9 , HIGH );  //Pumpe 1 ausschalten
}


  //Meine Uhrzeit Tests

  //Ab hier um / Uhr: Wenn Fass ==1, Pumpe 2 für 5 Minuten anschalten
if (hour == 6 && minute == 15)
{f = 1; //Merker für Zeit war da

}
if (f) 
{
  lcd.setCursor(0,1);
  lcd.print("1"); 
}
if (!(f) )
{
  lcd.setCursor(0,1);
  lcd.print("0"); 
}
if ((f) && (digitalRead( 6)))
{
  digitalWrite(8, HIGH); 
}

//if 10 ist low, lese zeit rechne + 5 minuten (FASS zu FASS)dann schalte 10 aus
}}

Durch die Dokumentation kommt man einigermaßen durch, aber da du alles in der Loop hast, ist es dennoch sehr unübersichtlich.

Du solltest einzelne Routinen in Funktionen unterbringen und diese aus der Loop aufrufen.

Beispiel:

//aufruf aus der Loop
Funktion();

// deine Funktion
void Funktion(){

// dein code
}

Dein Problem mit der nichtlaufenden Uhr liegt sicher an den While-Schleifen, diese blockieren den Sketch. Die solltest du durch geeignet if-Anweisungen ersetzen.