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
Zeichen werden auf der LCD verfälscht
06.02.2020, 13:42
Beitrag #1
Zeichen werden auf der LCD verfälscht
Basierend auf meinem Arduino-Projekt "https://forum.arduino.cc/index.php?topic=574644.msg3913661" habe ich ein Problem.
Nach einigen Tagen (30-40) erscheint auf der LCD ein Wirrwarr an Zeichen. Beim Drücken der "linken Taste" aktiviere ich die Hintergrundbeleuchtung der LCD. Nachdem ich die "mittlere Taste" drücke komme ich in die "Info" Anzeige. Auch hier ein Durcheinander an Zeichen. Nach einigen Sekunden wechselt die LCD in die Ausgangsanzeige. Jetzt sieht man noch kurz das Durcheinander, wechselt aber dann zur normalen Anzeige. Dann ist für Tage wieder alles OK.

   
   

Code:
/*----------[ Dosierpumpe Version 4.12 )----------

    Softwareversion 9.12 | Copyright 2016
             By Stefan Schepperle
            stefan@schepperle.info

  -----------[ ATMega 328      [Arduino] )----------*/


/*-----[ Bibliotheken einlesen )-----*/
#include <DS3232RTC.h>
#include <Time.h>
#include <EEPROM.h>
#include <Wire.h>
#define ADDR_RTCDS3231 0x68
#include <LCD.h>
#include <LiquidCrystal.h>
#include <LiquidCrystal_I2C.h>

//LiquidCrystal_I2C lcd(0x3f,20,4); // set the LCD address to 0x27 for a 20 chars and 4 line display
LiquidCrystal_I2C lcd(0x3f, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address

byte decToBcd(byte val) {
  return ( (val / 10 * 16) + (val % 10) );
}
byte bcdToDec(byte val)  {
  return ( (val / 16 * 10) + (val % 16) );
}


/*-----[ Variablen deklarieren )-----*/
const int tasterm  = 12;     // Taster Mitte
const int tastero  = 11;     // Taster oben
const int tasterl  = 10;     // Taster links  //Taster an Pin 10 NEU
const int tasteru =  9;     // Taster unten
const int tasterr =  8;     // Taster rechts

bool DisplaySchalter = 0;    // Variable für den Zustand des Display-Tasters NEU
unsigned long DisplayAus = 0;        // NEU

int pumpe1  =  7;     // Pumpe 1 Ausgang
int pumpe2  =  6;     // Pumpe 2 Ausgang
int pumpe3  =  5;     // Pumpe 3 Ausgang

int pumpschutz1 = 0;
int pumpschutz2 = 0;
int pumpschutz3 = 0;

int x = 1; int y = 0;
long pumpleistung1; long pumpleistung2; long pumpleistung3;

int pumpe1_time_h = EEPROM.read(3); int pumpe2_time_h = EEPROM.read(4); int pumpe3_time_h = EEPROM.read(5);
int pumpe1_time_m = EEPROM.read(6); int pumpe2_time_m = EEPROM.read(7); int pumpe3_time_m = EEPROM.read(8);
int pumpe1_ml = EEPROM.read(0); int pumpe2_ml = EEPROM.read(1); int pumpe3_ml = EEPROM.read(2);
int pumpe1_ml_s = EEPROM.read(9); int pumpe2_ml_s = EEPROM.read(10); int pumpe3_ml_s = EEPROM.read(11);


int Std = 0; int Min = 0; int Tag = 1; int Mon = 1; int Jahr = 2000;

char pause_hour = 0; char pause_min = 0; char pause_day = 0; char pause_month = 0;

/*-----[ Zeitmodul DS3231 einlesen und aktivieren )-----*/
void setDS3231time(int second, int minute, int hour, int ndofweek, int dday, int dmonth, int dyear)
{
  Wire.beginTransmission(ADDR_RTCDS3231);
  Wire.write(0);
  Wire.write(decToBcd(second));   // Sekunden setzen
  Wire.write(decToBcd(minute));   // Minuten setzen
  Wire.write(decToBcd(hour));     // Stunden setzen
  Wire.write(decToBcd(ndofweek)); // Wochentag setzen
  Wire.write(decToBcd(dday));     // Tag setzen
  Wire.write(decToBcd(dmonth));   // Monat setzen
  Wire.write(decToBcd(dyear));    // Jahr Setzen
  //Wire.endTransmission();
}

/*-----[ Einstellungen einlesen )-----*/
void setup(void)
{
  Serial.begin(9600);
  setSyncProvider(RTC.get);   // Funktion zum RTC Modul
  if (timeStatus() != timeSet)
    Serial.println("Zum synchronisieren mit dem RTC Modul");
  else
    Serial.println("Zeit und Datum wurden gespeichert");

  // Ausgänge festlegen
  pinMode(pumpe1, OUTPUT); digitalWrite(pumpe1, HIGH);
  pinMode(pumpe2, OUTPUT); digitalWrite(pumpe2, HIGH);
  pinMode(pumpe3, OUTPUT); digitalWrite(pumpe3, HIGH);

  // Eingänge Festlegen
  pinMode(tasterm, INPUT);
  pinMode(tastero, INPUT);
  pinMode(tasterl, INPUT);
  pinMode(tasteru, INPUT);
  pinMode(tasterr, INPUT);

  //lcd.int();              //LCD starten NEU
  lcd.backlight();        // LCD Hintergrundbeleuchtung NEU
  lcd.begin(20, 4);        // LCD Inizialisieren

  /*-----[ Bildschirm aufbauen )-----*/
  lcd.setCursor(0, 1);
  lcd.print(" Arduino V1.4.1 ");
  lcd.setCursor(2, 2);
  lcd.print("Aqua Dosierpumpe");
  lcd.setCursor(0, 3);
  lcd.print(" ~ Setup      o Info");

  DisplayAus = now() + 30;    // NEU
  //pinMode(tasterl, INPUT);    // Port definieren NEU
}

void loop() {
if (hour() < 10) { // wenn kleiner 10 schreibe eine 0 davor
  lcd.setCursor(0, 0); lcd.print("0"); pause_hour = 1;
}
else pause_hour = 0;

if (minute() < 10) { // wenn kleiner 10 schreibe eine 0 davor
  lcd.setCursor(3, 0); lcd.print("0"); pause_min = 4;
}
else pause_min = 3;

if (day() < 10) { // wenn kleiner 10 schreibe eine 0 davor
  lcd.setCursor(10, 0); lcd.print("0"); pause_day = 11;
}
else pause_day = 10;

if (month() < 10) { // wenn kleiner 10 schreibe eine 0 davor
  lcd.setCursor(13, 0); lcd.print("0"); pause_month = 14;
}
else pause_month = 13;
lcd.setCursor(5, 0); lcd.print(" ");
lcd.setCursor(pause_hour, 0); //Start at character 4 on line 0
lcd.print(hour()); lcd.print(":");
lcd.setCursor(pause_min, 0); lcd.print(minute());
lcd.setCursor(pause_day, 0); lcd.print(day()); lcd.print(".");
lcd.setCursor(pause_month, 0); lcd.print(month()); lcd.print("."); lcd.print(year());

if (digitalRead(tasterr) == HIGH)hauptmenue(1);
if (digitalRead(tasterm) == HIGH)uebersicht(1) ;

DisplaySchalter = digitalRead(tasterl);     //NEU
  if (DisplaySchalter == HIGH) {             //NEU
  DisplayAus = now();                 //NEU
  }                                        //NEU
if (now() - DisplayAus >=30) { lcd.noBacklight(); } else { lcd.backlight(); }   //NEU
                                                                        

// Ermittung wann und wielange gepumpt werden muss
pumpleistung1 = 1020.0 / (pumpe1_ml_s / 100.0); pumpleistung2 = 1020.0 / (pumpe2_ml_s / 100.0); pumpleistung3 = 1020.0 / (pumpe3_ml_s / 100.0);

if (pumpschutz1 == 0) {
  if (hour() == pumpe1_time_h && minute() == pumpe1_time_m) {
    pumpschutz1 = 1;
    digitalWrite(pumpe1, LOW);
    delay (pumpleistung1 * pumpe1_ml);
    digitalWrite(pumpe1, HIGH);
  }
}
if (minute() + 1 == pumpe1_time_m) {
  pumpschutz1 = 0;
}

if (pumpschutz2 == 0) {
  if (hour() == pumpe2_time_h && minute() == pumpe2_time_m) {
    pumpschutz2 = 1;
    digitalWrite(pumpe2, LOW);
    delay (pumpleistung2 * pumpe2_ml);
    digitalWrite(pumpe2, HIGH);
  }
}
if (minute() + 1 == pumpe2_time_m) {
  pumpschutz2 = 0;
}

if (pumpschutz3 == 0) {
  if (hour() == pumpe3_time_h && minute() == pumpe3_time_m) {
    pumpschutz3 = 1;
    digitalWrite(pumpe3, LOW);
    delay (pumpleistung3 * pumpe3_ml);
    digitalWrite(pumpe3, HIGH);
  }
}
if (minute() + 1 == pumpe3_time_m) {
  pumpschutz3 = 0;
}


}

//FUNKTIONEN
/*-----[ Programm neu Starten und in Loop zurück springen )-----*/
void Start(unsigned int Startscreen) {
  switch (Startscreen) {
    case 1:
      lcd.clear();
      if (hour() < 10) { // wenn kleiner 10 schreibe eine 0 davor
        lcd.setCursor(0, 0); lcd.print("0"); pause_hour = 1;
      }
      else pause_hour = 0;

      if (minute() < 10) { // wenn kleiner 10 schreibe eine 0 davor
        lcd.setCursor(3, 0); lcd.print("0"); pause_min = 4;
      }
      else pause_min = 3;

      lcd.setCursor(pause_hour, 0); //Start at character 4 on line 0
      lcd.print(hour()); lcd.print(":");
      lcd.setCursor(pause_min, 0); //Start at character 4 on line 0
      lcd.print(minute());
      lcd.setCursor(11, 0); //Start at character 4 on line 0
      lcd.print(day()); lcd.print("."); lcd.print(month()); lcd.print("."); lcd.print(year());

      lcd.setCursor(0, 1);
      lcd.print("-   Arduino   -");
      lcd.setCursor(2, 2);
      lcd.print("Aqua Dosierpumpe");
      lcd.setCursor(0, 3);
      lcd.print(" ~ Setup      o Info");
      loop;
      break;
  }
}

/*-----[ Ãœbersich darstellen )-----*/
void uebersicht(unsigned int Menuepunkt) {
  switch (Menuepunkt) {
    case 1:
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Uebersicht");
      lcd.setCursor(0, 1); lcd.print("Pumpe1:"); lcd.setCursor(8, 1); lcd.print(pumpe1_ml); lcd.setCursor(10, 1); lcd.print("ml"); lcd.setCursor(14, 1); lcd.print(pumpe1_time_h); lcd.setCursor(16, 1); lcd.print(":"); lcd.setCursor(17, 1); lcd.print(pumpe1_time_m);
      lcd.setCursor(0, 2); lcd.print("Pumpe2:"); lcd.setCursor(8, 2); lcd.print(pumpe2_ml); lcd.setCursor(10, 2); lcd.print("ml"); lcd.setCursor(14, 2); lcd.print(pumpe2_time_h); lcd.setCursor(16, 2); lcd.print(":"); lcd.setCursor(17, 2); lcd.print(pumpe2_time_m);
      lcd.setCursor(0, 3); lcd.print("Pumpe3:"); lcd.setCursor(8, 3); lcd.print(pumpe3_ml); lcd.setCursor(10, 3); lcd.print("ml"); lcd.setCursor(14, 3); lcd.print(pumpe3_time_h); lcd.setCursor(16, 3); lcd.print(":"); lcd.setCursor(17, 3); lcd.print(pumpe3_time_m);
      delay (5000);
      Start(1);
      break;
  }
}

/*-----[ Reset ausführung )-----*/
void Reset(unsigned int Resetten) {
  switch (Resetten) {
    case 1: // alles aus
      {
        asm volatile ("  jmp 0");
      }
      break;
  }
}

/*-----[ Uhrzeit und Datum speichern )-----*/
void timesaveave(unsigned int Timeset) {
  switch (Timeset) {
    case 1:
      setDS3231time(00, Min, Std, 3,  Tag, Mon, Jahr - 48); // Zeit und Datum werden Gespeichert
      Reset(1);
  }
}

/*-----[ Dosiermenge je Pumpe speichern )-----*/
void mengesetzen(unsigned int MS) {
  switch (MS) {
    case 1:
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Menge      speichern");
      lcd.setCursor(0, 1); lcd.print("--------------------");
      lcd.setCursor(0, 2); lcd.print(String(" ") + String(pumpe1_ml) + String("ml   ") + String(pumpe2_ml) + String("ml   ") + String(pumpe3_ml) + String("ml"));
      lcd.setCursor(0, 3); lcd.print("[~]Zurueck   [o]Save");
      delay(2000);
      for (int i = 0; i <= 255; i = 0) {
        if (digitalRead(tasterm) == HIGH) {
          EEPROM.write(0, pumpe1_ml);
          EEPROM.write(1, pumpe2_ml);
          EEPROM.write(2, pumpe3_ml);
          Reset(1);
        }
        if (digitalRead(tasterr) == HIGH) {
          Reset(1);
        }
      }
  }
}

/*-----[ kallibrierung Speichern )-----*/
void kallisetzen(unsigned int kallset) {
  switch (kallset) {
    case 1:
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("ml/s speichern");
      lcd.setCursor(0, 1); lcd.print("--------------------");
      lcd.setCursor(0, 2); lcd.print(String("0,") + String(pumpe1_ml_s) + String("ml ") + String("0,") + String(pumpe2_ml_s) + String("ml ") + String("0,") + String(pumpe3_ml_s) + String("ml"));
      lcd.setCursor(0, 3); lcd.print("[~]Zurueck   [o]Save");
      delay(2000);

      for (int i = 0; i <= 255; i = 0) {
        if (digitalRead(tasterm) == HIGH) {
          EEPROM.write(9, pumpe1_ml_s);
          EEPROM.write(10, pumpe2_ml_s);
          EEPROM.write(11, pumpe3_ml_s);
          Reset(1);
        }
        if (digitalRead(tasterr) == HIGH) {
          Reset(1);
        }
      }
  }
}

/*-----[ Uhrzeit der Dosierung speichern )-----*/
void pumptimesetzen(unsigned int PTS) {
  switch (PTS) {
    case 1:
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Pumpzeit     speichern");
      lcd.setCursor(0, 1); lcd.print("--------------------");
      lcd.setCursor(0, 2); lcd.print(String(pumpe1_time_h) + String(":") + String(pumpe1_time_m) + String("  ") + String(pumpe2_time_h) + String(":") + String(pumpe2_time_m) + String("  ") + String(pumpe3_time_h) + String(":") + String(pumpe3_time_m));
      lcd.setCursor(0, 3); lcd.print("[~]Zurueck   [o]Save");
      delay(2000);
      for (int i = 0; i <= 255; i = 0) {

        if (digitalRead(tasterm) == HIGH) {
          EEPROM.write(3, pumpe1_time_h);
          EEPROM.write(4, pumpe2_time_h);
          EEPROM.write(5, pumpe3_time_h);
          EEPROM.write(6, pumpe1_time_m);
          EEPROM.write(7, pumpe2_time_m);
          EEPROM.write(8, pumpe3_time_m);
          Reset(1);
        }
        if (digitalRead(tasterr) == HIGH) {
          Reset(1);
        }
      }


  }
}

//HAUPTMENUE
/*-----[ Hauptmenü darstellen )-----*/
void hauptmenue(unsigned int Menuepunkt2) {
  switch (Menuepunkt2) {
    case 1:
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Setup:     [o]=Enter");
      lcd.setCursor(0, 1); lcd.print("~ Pumpen einstellen");
      lcd.setCursor(0, 2); lcd.print("  Datum und Uhrzeit");
      lcd.setCursor(0, 3); lcd.print("  Pumpen kalibrieren");

      for (int i = 0; i <= 255; i = 0) {

        if (digitalRead(tastero) == HIGH) x = x - 1; delay (100);
        if (digitalRead(tasteru) == HIGH) x = x + 1; delay (100);
        if (digitalRead(tasterm) == HIGH) pumpmenue(1); delay (100);
        if (x != 1) hauptmenue(x);
        if (x < 1) x = 1;
      }
    case 2:
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Setup:     [o]=Enter");
      lcd.setCursor(0, 1); lcd.print("  Pumpen einstellen");
      lcd.setCursor(0, 2); lcd.print("~ Datum und Uhrzeit");
      lcd.setCursor(0, 3); lcd.print("  Pumpen kalibrieren");

      for (int i = 0; i <= 255; i = 0) {

        if (digitalRead(tastero) == HIGH) x = x - 1; delay (100);
        if (digitalRead(tasteru) == HIGH) x = x + 1; delay (100);
        if (digitalRead(tasterm) == HIGH)zeit(1) ;
        if (x != 2) hauptmenue(x);
      }
    case 3:
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Setup:     [o]=Enter");
      lcd.setCursor(0, 1); lcd.print("  Pumpen einstellen");
      lcd.setCursor(0, 2); lcd.print("  Datum und Uhrzeit");
      lcd.setCursor(0, 3); lcd.print("~ Pumpen kalibrieren");

      for (int i = 0; i <= 255; i = 0) {
        if (digitalRead(tastero) == HIGH) x = x - 1; delay (100);
        if (digitalRead(tasteru) == HIGH) x = x + 1; delay (100);
        if (digitalRead(tasterm) == HIGH) kalibireren(1); delay (100);
        if (x != 3) hauptmenue(x);
        if (x > 3) x = 3;
      }

  }
}

//PUMPEN EINSTELLEN
/*-----[ Hauptmenü der Pumpeneinstellung darstellen )-----*/
void pumpmenue(unsigned int pumpen) {
  switch (pumpen) {
    case 1:
      {
        int i = 0;
      }
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Pumpsetup: [o]=Enter");
      lcd.setCursor(0, 1); lcd.print("~ Schlauch fuellen");
      lcd.setCursor(0, 2); lcd.print("  Dosiermenge");
      lcd.setCursor(0, 3); lcd.print("  Dosierzeit");

      for (int i = 0; i <= 255; i = 0) {

        if (digitalRead(tastero) == HIGH) x = x - 1; delay (100);
        if (digitalRead(tasteru) == HIGH) x = x + 1; delay (100);
        if (digitalRead(tasterm) == HIGH) fuellen(1); delay (100);
        if (x != 1) pumpmenue(x);
        if (x < 1) x = 1;
      }
    case 2:
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Pumpsetup: [o]=Enter");
      lcd.setCursor(0, 1); lcd.print("  Schlauch fuellen");
      lcd.setCursor(0, 2); lcd.print("~ Dosiermenge");
      lcd.setCursor(0, 3); lcd.print("  Dosierzeit");

      for (int i = 0; i <= 255; i = 0) {

        if (digitalRead(tastero) == HIGH) x = x - 1; delay (100);
        if (digitalRead(tasteru) == HIGH) x = x + 1; delay (100);
        if (digitalRead(tasterm) == HIGH)dosiermenge(1) ;
        if (x != 2) pumpmenue(x);
      }
    case 3:
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Pumpsetup: [o]=Enter");
      lcd.setCursor(0, 1); lcd.print("  Schlauch Fuellen");
      lcd.setCursor(0, 2); lcd.print("  Dosiermenge");
      lcd.setCursor(0, 3); lcd.print("~ Dosierzeit");

      for (int i = 0; i <= 255; i = 0) {
        if (digitalRead(tastero) == HIGH) x = x - 1; delay (100);
        if (digitalRead(tasteru) == HIGH) x = x + 1; delay (100);
        if (digitalRead(tasterm) == HIGH)pumptime(1) ;
        if (x != 3) pumpmenue(x);
        if (x > 3) x = 3;
      }
  }
}

/*-----[ Menü Schlauch füllen darstellen )-----*/
void fuellen(unsigned int fuellmenue) {
  switch (fuellmenue) {
    case 1:
      x = 1;
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("~Zurueck  [o]Fuellen");
      lcd.setCursor(0, 1); lcd.print("------"); lcd.setCursor(0, 3); lcd.print("------");
      lcd.setCursor(0, 2); lcd.print("Pumpe1 Pumpe2 Pumpe3");

      for (int i = 0; i <= 255; i = 0) {
        if (digitalRead(tastero) == HIGH) x = x - 1; delay (100);
        if (digitalRead(tasteru) == HIGH) x = x + 1; delay (100);
        if (digitalRead(tasterr) == HIGH) Reset(1); delay (100);
        if (x != 1) fuellen(x);
        if (x < 1) x = 1;
        if (digitalRead(tasterm) == HIGH) {
          digitalWrite(pumpe1, LOW);
        }
        else {
          digitalWrite(pumpe1, HIGH);
        };
      }
    case 2:
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("~Zurueck  [o]Fuellen");
      lcd.setCursor(7, 1); lcd.print("------"); lcd.setCursor(7, 3); lcd.print("------");
      lcd.setCursor(0, 2); lcd.print("Pumpe1 Pumpe2 Pumpe3");

      for (int i = 0; i <= 255; i = 0) {
        if (digitalRead(tastero) == HIGH) x = x - 1; delay (100);
        if (digitalRead(tasteru) == HIGH) x = x + 1; delay (100);
        if (digitalRead(tasterr) == HIGH) Reset(1); delay (100);
        if (x != 2) fuellen(x);
        if (digitalRead(tasterm) == HIGH) {
          digitalWrite(pumpe2, LOW);
        }
        else {
          digitalWrite(pumpe2, HIGH);
        };
      }
    case 3:
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("~Zurueck  [o]Fuellen");
      lcd.setCursor(14, 1); lcd.print("------"); lcd.setCursor(14, 3); lcd.print("------");
      lcd.setCursor(0, 2); lcd.print("Pumpe1 Pumpe2 Pumpe3");

      for (int i = 0; i <= 255; i = 0) {
        if (digitalRead(tastero) == HIGH) x = x - 1; delay (100);
        if (digitalRead(tasteru) == HIGH) x = x + 1; delay (100);
        if (digitalRead(tasterr) == HIGH) Reset(1); delay (100);
        if (x != 3) fuellen(x); if (x > 3) x = 3;
        if (digitalRead(tasterm) == HIGH) {
          digitalWrite(pumpe3, LOW);
        }
        else {
          digitalWrite(pumpe3, HIGH);
        };
      }
  }
}

/*-----[ Einstellmenü Dosiermenge darstellen )-----*/
void dosiermenge(unsigned int menge) {
  switch (menge) {
    case 1:
      x = 1;
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Menge   [o]Speichern");
      lcd.setCursor(0, 1); lcd.print("------");
      lcd.setCursor(0, 2); lcd.print("Pumpe1 Pumpe2 Pumpe3");

      for (int i = 0; i <= 255; i = 0) {
        if (digitalRead(tasterr) == HIGH) pumpe1_ml = pumpe1_ml + 1; delay (100);
        if (digitalRead(tasterl) == HIGH) pumpe1_ml = pumpe1_ml - 10; delay (100);
        lcd.setCursor(0, 3); lcd.print(String(" ") + String(pumpe1_ml) + String("ml   ") + String(pumpe2_ml) + String("ml   ") + String(pumpe3_ml) + String("ml"));

        if (digitalRead(tastero) == HIGH) x = x - 1; delay (100);
        if (digitalRead(tasteru) == HIGH) x = x + 1; delay (100);
        if (x != 1) dosiermenge(x);
        if (x < 1) x = 1;
        if (digitalRead(tasterm) == HIGH) mengesetzen(1);
      }
    case 2:
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Menge   [o]Speichern");
      lcd.setCursor(7, 1); lcd.print("------");
      lcd.setCursor(0, 2); lcd.print("Pumpe1 Pumpe2 Pumpe3");

      for (int i = 0; i <= 255; i = 0) {
        if (digitalRead(tasterr) == HIGH) pumpe2_ml = pumpe2_ml + 1; delay (100);
        if (digitalRead(tasterl) == HIGH) pumpe2_ml = pumpe2_ml - 10; delay (100);
        lcd.setCursor(0, 3); lcd.print(String(" ") + String(pumpe1_ml) + String("ml   ") + String(pumpe2_ml) + String("ml   ") + String(pumpe3_ml) + String("ml"));
        if (digitalRead(tastero) == HIGH) x = x - 1; delay (100);
        if (digitalRead(tasteru) == HIGH) x = x + 1; delay (100);
        if (x != 2) dosiermenge(x);
        if (digitalRead(tasterm) == HIGH) mengesetzen(1);
      }
    case 3:
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Menge   [o]Speichern");
      lcd.setCursor(14, 1); lcd.print("------");
      lcd.setCursor(0, 2); lcd.print("Pumpe1 Pumpe2 Pumpe3");

      for (int i = 0; i <= 255; i = 0) {
        if (digitalRead(tasterr) == HIGH) pumpe3_ml = pumpe3_ml + 1; delay (100);
        if (digitalRead(tasterl) == HIGH) pumpe3_ml = pumpe3_ml - 10; delay (100);
        lcd.setCursor(0, 3); lcd.print(String(" ") + String(pumpe1_ml) + String("ml   ") + String(pumpe2_ml) + String("ml   ") + String(pumpe3_ml) + String("ml"));
        if (digitalRead(tastero) == HIGH) x = x - 1; delay (100);
        if (digitalRead(tasteru) == HIGH) x = x + 1; delay (100);
        if (x != 3) dosiermenge(x);
        if (x > 3) x = 3;
        if (digitalRead(tasterm) == HIGH) mengesetzen(1);
      }
  }
}

/*-----[ Einstellmenü der Dosierzeit darstellen)-----*/
void pumptime(unsigned int PT) {
  switch (PT) {
    case 1:
      x = 1;
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Zeit    [o]Speichern");
      lcd.setCursor(0, 1); lcd.print("------");
      lcd.setCursor(0, 2); lcd.print("Pumpe1 Pumpe2 Pumpe3");
      for (int i = 0; i <= 255; i = 0) {
        if (digitalRead(tasterl) == HIGH) pumpe1_time_h = pumpe1_time_h + 1; delay (100);
        if (digitalRead(tasterr) == HIGH) pumpe1_time_m = pumpe1_time_m + 1; delay (100);
        if (pumpe1_time_h > 23) pumpe1_time_h = 0; if (pumpe1_time_m > 59) pumpe1_time_m = 0;
        lcd.setCursor(0, 3); lcd.print(String(pumpe1_time_h) + String(":") + String(pumpe1_time_m) + String("  ") + String(pumpe2_time_h) + String(":") + String(pumpe2_time_m) + String("  ") + String(pumpe3_time_h) + String(":") + String(pumpe3_time_m));

        if (digitalRead(tastero) == HIGH) x = x - 1; delay (100);
        if (digitalRead(tasteru) == HIGH) x = x + 1; delay (100);
        if (x != 1) pumptime(x);
        if (x < 1) x = 1;
        if (digitalRead(tasterm) == HIGH) pumptimesetzen(1);
      }
    case 2:
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Zeit    [o]Speichern");
      lcd.setCursor(7, 1); lcd.print("------");
      lcd.setCursor(0, 2); lcd.print("Pumpe1 Pumpe2 Pumpe3");

      for (int i = 0; i <= 255; i = 0) {
        if (digitalRead(tasterl) == HIGH) pumpe2_time_h = pumpe2_time_h + 1; delay (100);
        if (digitalRead(tasterr) == HIGH) pumpe2_time_m = pumpe2_time_m + 1; delay (100);
        if (pumpe2_time_h > 23) pumpe2_time_h = 0; if (pumpe2_time_m > 59) pumpe2_time_m = 0;
        lcd.setCursor(0, 3); lcd.print(String(pumpe1_time_h) + String(":") + String(pumpe1_time_m) + String("  ") + String(pumpe2_time_h) + String(":") + String(pumpe2_time_m) + String("  ") + String(pumpe3_time_h) + String(":") + String(pumpe3_time_m));
        if (digitalRead(tastero) == HIGH) x = x - 1; delay (100);
        if (digitalRead(tasteru) == HIGH) x = x + 1; delay (100);
        if (x != 2) pumptime(x);
        if (digitalRead(tasterm) == HIGH) pumptimesetzen(1);
      }
    case 3:
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Zeit    [o]Speichern");
      lcd.setCursor(14, 1); lcd.print("------");
      lcd.setCursor(0, 2); lcd.print("Pumpe1 Pumpe2 Pumpe3");

      for (int i = 0; i <= 255; i = 0) {
        if (digitalRead(tasterl) == HIGH) pumpe3_time_h = pumpe3_time_h + 1; delay (100);
        if (digitalRead(tasterr) == HIGH) pumpe3_time_m = pumpe3_time_m + 1; delay (100);
        if (pumpe3_time_h > 23) pumpe3_time_h = 0; if (pumpe3_time_m > 59) pumpe3_time_m = 0;
        lcd.setCursor(0, 3); lcd.print(String(pumpe1_time_h) + String(":") + String(pumpe1_time_m) + String("  ") + String(pumpe2_time_h) + String(":") + String(pumpe2_time_m) + String("  ") + String(pumpe3_time_h) + String(":") + String(pumpe3_time_m));
        if (digitalRead(tastero) == HIGH) x = x - 1; delay (100);
        if (digitalRead(tasteru) == HIGH) x = x + 1; delay (100);
        if (x != 3) pumptime(x);
        if (x > 3) x = 3;
        if (digitalRead(tasterm) == HIGH) pumptimesetzen(1);
      }
  }
}

/*-----[ Einstellmenü Pumpenkallibrierung darstellen )-----*/
void kalibireren(unsigned int kalli) {
  switch (kalli) {
    case 1:
      x = 1;
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Menge/s [o]Speichern");
      lcd.setCursor(0, 1); lcd.print("------");
      lcd.setCursor(0, 2); lcd.print("Pumpe1 Pumpe2 Pumpe3");
      for (int i = 0; i <= 255; i = 0) {
        if (digitalRead(tasterr) == HIGH) pumpe1_ml_s = pumpe1_ml_s + 100; delay (100);
        if (digitalRead(tasterl) == HIGH) pumpe1_ml_s = pumpe1_ml_s - 1; delay (100);
        lcd.setCursor(0, 3); lcd.print(String("0,") + String(pumpe1_ml_s) + String(" ") + String("0,") + String(pumpe2_ml_s) + String(" ") + String("0,") + String(pumpe3_ml_s) + String(""));

        if (digitalRead(tastero) == HIGH) x = x - 1; delay (100);
        if (digitalRead(tasteru) == HIGH) x = x + 1; delay (100);
        if (x != 1) kalibireren(x);
        if (x < 1) x = 1;
        if (digitalRead(tasterm) == HIGH) kallisetzen(1);
      }
    case 2:
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Menge/s [o]Speichern");
      lcd.setCursor(7, 1); lcd.print("------");
      lcd.setCursor(0, 2); lcd.print("Pumpe1 Pumpe2 Pumpe3");

      for (int i = 0; i <= 255; i = 0) {
        if (digitalRead(tasterr) == HIGH) pumpe2_ml_s = pumpe2_ml_s + 100; delay (100);
        if (digitalRead(tasterl) == HIGH) pumpe2_ml_s = pumpe2_ml_s - 1; delay (100);
        lcd.setCursor(0, 3); lcd.print(String("0,") + String(pumpe1_ml_s) + String(" ") + String("0,") + String(pumpe2_ml_s) + String(" ") + String("0,") + String(pumpe3_ml_s) + String(""));
        if (digitalRead(tastero) == HIGH) x = x - 1; delay (100);
        if (digitalRead(tasteru) == HIGH) x = x + 1; delay (100);
        if (x != 2) kalibireren(x);
        if (digitalRead(tasterm) == HIGH) kallisetzen(1);
      }
    case 3:
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Menge/s [o]Speichern");
      lcd.setCursor(14, 1); lcd.print("------");
      lcd.setCursor(0, 2); lcd.print("Pumpe1 Pumpe2 Pumpe3");

      for (int i = 0; i <= 255; i = 0) {
        if (digitalRead(tasterr) == HIGH) pumpe3_ml_s = pumpe3_ml_s + 100; delay (100);
        if (digitalRead(tasterl) == HIGH) pumpe3_ml_s = pumpe3_ml_s - 1; delay (100);
        lcd.setCursor(0, 3); lcd.print(String("0,") + String(pumpe1_ml_s) + String(" ") + String("0,") + String(pumpe2_ml_s) + String(" ") + String("0,") + String(pumpe3_ml_s) + String(""));
        if (digitalRead(tastero) == HIGH) x = x - 1; delay (100);
        if (digitalRead(tasteru) == HIGH) x = x + 1; delay (100);
        if (x != 3) kalibireren(x);
        if (x > 3) x = 3;
        if (digitalRead(tasterm) == HIGH) kallisetzen(1);
      }
  }
}

//ZEIT UND DATUM SETZEN
/*-----[ Menü Datum und Uhrzeit einstellen )-----*/
void zeit(unsigned int Zeitmenue) {
  switch (Zeitmenue) {
    case 1:
      x = 1;
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Zeit    [o]Speichern");
      lcd.setCursor(0, 1); lcd.print("---");
      lcd.setCursor(0, 2); lcd.print("Std Min Tag Mon Jahr");

      for (int i = 0; i <= 255; i = 0) {
        if (digitalRead(tasterr) == HIGH) Std = Std + 1; delay (100);
        if (digitalRead(tasterl) == HIGH) Std = Std - 1; delay (100);
        if (Std <= 0) Std = 0; if (Std >= 23) Std = 23;
        lcd.setCursor(0, 3); lcd.print(Std); lcd.setCursor(4, 3); lcd.print(Min); lcd.setCursor(8, 3); lcd.print(Tag); lcd.setCursor(12, 3); lcd.print(Mon); lcd.setCursor(16, 3); lcd.print(Jahr);

        if (digitalRead(tastero) == HIGH) x = x - 1; delay (100);
        if (digitalRead(tasteru) == HIGH) x = x + 1; delay (100);
        if (x != 1) zeit(x);
        if (x < 1) x = 1;
        if (digitalRead(tasterm) == HIGH) Zeitsetzen(1);
      }
    case 2:
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Zeit    [o]Speichern");
      lcd.setCursor(4, 1); lcd.print("---");
      lcd.setCursor(0, 2); lcd.print("Std Min Tag Mon Jahr");

      for (int i = 0; i <= 255; i = 0) {
        if (digitalRead(tasterr) == HIGH) Min = Min + 1; delay (100);
        if (digitalRead(tasterl) == HIGH) Min = Min - 1; delay (100);
        if (Min <= 0) Min = 59; if (Min >= 59) Min = 0;
        lcd.setCursor(0, 3); lcd.print(Std); lcd.setCursor(4, 3); lcd.print(Min); lcd.setCursor(8, 3); lcd.print(Tag); lcd.setCursor(12, 3); lcd.print(Mon); lcd.setCursor(16, 3); lcd.print(Jahr);
        if (digitalRead(tastero) == HIGH) x = x - 1; delay (100);
        if (digitalRead(tasteru) == HIGH) x = x + 1; delay (100);
        if (x != 2) zeit(x);
        if (digitalRead(tasterm) == HIGH) Zeitsetzen(1);
      }
    case 3:
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Zeit    [o]Speichern");
      lcd.setCursor(8, 1); lcd.print("---");
      lcd.setCursor(0, 2); lcd.print("Std Min Tag Mon Jahr");

      for (int i = 0; i <= 255; i = 0) {
        if (digitalRead(tasterr) == HIGH) Tag = Tag + 1; delay (100);
        if (digitalRead(tasterl) == HIGH) Tag = Tag - 1; delay (100);
        if (Tag <= 1) Tag = 31; if (Tag >= 31) Tag = 1;
        lcd.setCursor(0, 3); lcd.print(Std); lcd.setCursor(4, 3); lcd.print(Min); lcd.setCursor(8, 3); lcd.print(Tag); lcd.setCursor(12, 3); lcd.print(Mon); lcd.setCursor(16, 3); lcd.print(Jahr);
        if (digitalRead(tastero) == HIGH) x = x - 1; delay (100);
        if (digitalRead(tasteru) == HIGH) x = x + 1; delay (100);
        if (x != 3) zeit(x);
        if (digitalRead(tasterm) == HIGH) Zeitsetzen(1);
      }
    case 4:
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Zeit    [o]Speichern");
      lcd.setCursor(12, 1); lcd.print("---");
      lcd.setCursor(0, 2); lcd.print("Std Min Tag Mon Jahr");

      for (int i = 0; i <= 255; i = 0) {
        if (digitalRead(tasterr) == HIGH) Mon = Mon + 1; delay (100);
        if (digitalRead(tasterl) == HIGH) Mon = Mon - 1; delay (100);
        if (Mon < 1) Mon = 12; if (Mon > 12) Mon = 1;
        lcd.setCursor(0, 3); lcd.print(Std); lcd.setCursor(4, 3); lcd.print(Min); lcd.setCursor(8, 3); lcd.print(Tag); lcd.setCursor(12, 3); lcd.print(Mon); lcd.setCursor(16, 3); lcd.print(Jahr);
        if (digitalRead(tastero) == HIGH) x = x - 1; delay (100);
        if (digitalRead(tasteru) == HIGH) x = x + 1; delay (100);
        if (x != 4) zeit(x);
        if (digitalRead(tasterm) == HIGH) Zeitsetzen(1);
      }
    case 5:
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Zeit    [o]Speichern");
      lcd.setCursor(16, 1); lcd.print("----");
      lcd.setCursor(0, 2); lcd.print("Std Min Tag Mon Jahr");

      for (int i = 0; i <= 255; i = 0) {
        if (digitalRead(tasterr) == HIGH) Jahr = Jahr + 1; delay (100);
        if (digitalRead(tasterl) == HIGH) Jahr = Jahr - 1; delay (100);
        if (Jahr < 2000) Jahr = 2000;
        lcd.setCursor(0, 3); lcd.print(Std); lcd.setCursor(4, 3); lcd.print(Min); lcd.setCursor(8, 3); lcd.print(Tag); lcd.setCursor(12, 3); lcd.print(Mon); lcd.setCursor(16, 3); lcd.print(Jahr);
        if (digitalRead(tastero) == HIGH) x = x - 1; delay (100);
        if (digitalRead(tasteru) == HIGH) x = x + 1; delay (100);
        if (x != 5) zeit(x);
        if (x > 5) x = 5;
        if (digitalRead(tasterm) == HIGH) Zeitsetzen(1);
      }
  }
}

/*-----[ Menü zur Speicherung von Datum und Uhrzeit )-----*/
void Zeitsetzen(unsigned int Timeset) {
  switch (Timeset) {
    case 1:
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Zeit Setzen");
      lcd.setCursor(0, 1); lcd.print("--------------------");
      lcd.setCursor(0, 2); lcd.print(String(Std) + String(":") + String(Min) + String("     ") + String(Tag) + String(".") + String(Mon) + String (".") + String(Jahr));
      lcd.setCursor(0, 3); lcd.print("[~]Zurueck   [o]Save");
      delay(2000);

      for (int i = 0; i <= 255; i = 0) {
        if (digitalRead(tasterr) == HIGH) {
          Reset(1);
        }
        if (digitalRead(tasterm) == HIGH) {
          timesaveave(1);
        }
      }
  }
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
06.02.2020, 13:53
Beitrag #2
RE: Zeichen werden auf der LCD verfälscht
Was sagt der Compiler denn, wieviel RAM verbraucht wird?
Du benutzt den Datentyp 'String' der ist ziemlich ressourcenfressend, und braucht den RAM, der lt. Compilermeldung noch 'Frei' ist für lokale und dynamische Variable. Wenn der dann nicht reicht, können die wildesten Effekte auftreten.
'String' sollte man auf den kleinen Prozessoren nicht einsetzen, und in einem so umfangreichen Sketch schon erst recht nicht.

Ausserdem sollte Du Stringkonstante ins Flash legen ( Stichwort 'F-Makro' ).

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
06.02.2020, 14:59 (Dieser Beitrag wurde zuletzt bearbeitet: 06.02.2020 15:02 von Tom2Bit.)
Beitrag #3
RE: Zeichen werden auf der LCD verfälscht
(06.02.2020 13:53)MicroBahner schrieb:  Was sagt der Compiler denn, wieviel RAM verbraucht wird?

"Der Sketch verwendet 23754 Bytes (73%) des Programmspeicherplatzes. Das Maximum sind 32256 Bytes.
Globale Variablen verwenden 1264 Bytes (61%) des dynamischen Speichers, 784 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes."

Das betrifft nur die LCD. Trotzdem ein Wirrwarr auf der LCD ist, funktioniert aber sonst alles einwandfrei.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
06.02.2020, 15:29 (Dieser Beitrag wurde zuletzt bearbeitet: 06.02.2020 15:30 von Tommy56.)
Beitrag #4
RE: Zeichen werden auf der LCD verfälscht
Du solltest trotzdem die Ratschläge vom Microbahner beherzigen.
Die Vornull bei den Zahlen kannst Du doch einmalig in einer Funktion erfüllen:
Code:
char *vornull2(int wert) {
static char buf[3];
if (wert > 10) return itoa(wert,buf,10);
buf[0] = '0';
buf[1] = wert+'0';
buf[2] = '\0';
return buf;
}

// Bennutzung:
lcd.print(vornull2(hour));

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
07.02.2020, 14:19
Beitrag #5
RE: Zeichen werden auf der LCD verfälscht
(06.02.2020 15:29)Tommy56 schrieb:  Du solltest trotzdem die Ratschläge vom Microbahner beherzigen.
Die Vornull bei den Zahlen kannst Du doch einmalig in einer Funktion erfüllen:
Code:
char *vornull2(int wert) {
static char buf[3];
if (wert > 10) return itoa(wert,buf,10);
buf[0] = '0';
buf[1] = wert+'0';
buf[2] = '\0';
return buf;
}

// Bennutzung:
lcd.print(vornull2(hour));

Gruß Tommy

Da muss ich mich erst einmal wieder belesen. Denn so tief stecke ich nun auch nicht in der Arduino-Materie. In Grunde stehe ich auf dem Schlauch.
Aber eigentlich ist die "Dosierpumpe" gut ein Jahr gelaufen und nur durch Zufall habe ich mal auf das Display gesehen. Aber bevor etwas schief geht wollte ich das bereinigen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.02.2020, 18:37
Beitrag #6
RE: Zeichen werden auf der LCD verfälscht
Komme mal wieder nicht weiter.
Was ist mit "wert" im Code gemeint?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.02.2020, 18:41
Beitrag #7
RE: Zeichen werden auf der LCD verfälscht
(09.02.2020 18:37)Tom2Bit schrieb:  Komme mal wieder nicht weiter.
Was ist mit "wert" im Code gemeint?

Steht doch in der ersten Zeile des Beispiels.
Es ist eine integer Variable.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.02.2020, 18:43
Beitrag #8
RE: Zeichen werden auf der LCD verfälscht
Hast du in deinem Aufbau für I2C auch Pullup-Widerstände eingesetzt ?
Wie lang sind deine I2C-Kabel ?

Das sieht mir nach einem Problem mit I2C aus bei einem Projekt.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  LCD 16*2 display zeigt sinnlose Zeichen Schneggl 15 1.258 04.10.2019 18:58
Letzter Beitrag: Tommy56
  Das Zeichen "°" (Grad) ausgeben Rockman 6 1.436 16.06.2019 16:39
Letzter Beitrag: Rockman
  Nur seltsam Zeichen Serial TeimeN 5 793 30.05.2019 10:32
Letzter Beitrag: Tommy56
  Analog Eingang _ Werte verfälscht Traktor 16 3.493 30.03.2018 08:36
Letzter Beitrag: Bitklopfer
  Code muss um 73Bytes reduziert werden! Wie? torsten_156 13 3.431 25.01.2018 21:56
Letzter Beitrag: torsten_156
  ASCII Zeichen Seriell ausgeben huber5093 3 3.238 07.10.2017 20:35
Letzter Beitrag: Tommy56
  Werden ungenutzte Funktionen weg optimiert? BennIY 1 1.157 03.10.2017 09:06
Letzter Beitrag: Tommy56
  Empfange nur "Geister"zeichen vom BT-Modul dabbamonkeyyy 2 1.349 23.10.2016 11:34
Letzter Beitrag: Harry Hirsch
  LCD Display plötzlich komische Zeichen Jessi97 2 2.702 28.07.2016 11:34
Letzter Beitrag: Bitklopfer
  Sketch konnte nicht angelegt werden Sarius 2 3.452 16.07.2016 15:59
Letzter Beitrag: Sarius

Gehe zu:


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