LCD - Lauftext stoppen

Hi,

ich habe folgenden Code:

void LCD_loop() {
  for (int positionCounter = 0; positionCounter < 1; positionCounter++) { // LCD-Display nach links durchlaufen lassen
    // scroll one position left:
      }

  if ((wasserstand_ok == 1) and (maximaleBeleuchtungsdauerErreicht == 0)) {
    lcd.setCursor(0, 0);                       // Cursor in obere linke Ecke setzen
    lcd.print("HyFarm arbeitet ");
    lcd.setCursor(0, 1);                       // Cursor in untere linke Ecke setzen
    lcd.print("fehlerfrei      ");
  }

  if ((wasserstand_ok == 1) and (maximaleBeleuchtungsdauerErreicht == 1)) {
    lcd.scrollDisplayLeft();
    lcd.setCursor(0, 0);                       // Cursor in obere linke Ecke setzen
    lcd.print("Wachstumslampe                  ");
    lcd.setCursor(0, 1);                       // Cursor in untere linke Ecke setzen
    lcd.print("im Ruhemodus                    ");
  }

  if ((wasserstand_ok == 0) and (maximaleBeleuchtungsdauerErreicht == 0)) {
    lcd.scrollDisplayLeft();
    lcd.setCursor(0, 0);                       // Cursor in obere linke Ecke setzen
    lcd.print("Bitte Wassertank                ");
    lcd.setCursor(0, 1);                       // Cursor in untere linke Ecke setzen
    lcd.print("bald nachfuellen                ");
  }

  if ((wasserstand_ok == 0) and (maximaleBeleuchtungsdauerErreicht == 1)) {
    lcd.scrollDisplayLeft();
    lcd.setCursor(0, 0);                       // Cursor in obere linke Ecke setzen
    lcd.print("Bitte den Wassertank nachfuellen");
    lcd.setCursor(0, 1);                       // Cursor in untere linke Ecke setzen
    lcd.print("Wachstumslampe im Ruhemodus     ");
  }
}

ich möchte jetzt , dass im ersten Fall ((wasserstand_ok == 1) and (maximaleBeleuchtungsdauerErreicht == 0)) die Schrift steht, und nicht läuft.
Das klappt aber nicht, wenn einer der anderen Fälle eingetreten war, da dann das lcd.scrollDisplayLeft() aktiviert ist.

Wie bekomme ich es hin, dass das lcd.scrollDisplayLeft() wieder aufhört und ich einen stehenden Text abbilden kann?

LG

Da bleibt Dir wahrscheinlich nur die Lib umzubauen. Das ist aber auch nur geraten, da Du uns nicht sagst, welche Lib Du benutzt. Bitte Link zur Lib einstellen.

Gruß Tommy

Tommy56:
Da bleibt Dir wahrscheinlich nur die Lib umzubauen. Das ist aber auch nur geraten, da Du uns nicht sagst, welche Lib Du benutzt. Bitte Link zur Lib einstellen.

Gruß Tommy

#include <LiquidCrystal_I2C.h>

Du weißt, was ein Link ist? Von der LiquidCrystal_I2C.h gibt es unzählige Varianten.
So wird das nichts.

Gruß Tommy

Standard.User.:
#include <LiquidCrystal_I2C.h>

Warum schaust du nicht selbst in die Library rein ?
Wenn man eine Laufschrift einschalten kann, kann man die sicher auch wieder ausschalten.

Da wir nicht wissen, welche Library du verwendest, können wir dir auch nicht deine Arbeit abnehmen und in die Lib reinschauen.

Du weißt, was ein Link ist? Von der LiquidCrystal_I2C.h gibt es unzählige Varianten. So wird das nichts.

Gruß Tommy

ich weiß leider nicht was du meinst. meinst du die LCD die ich verbaut habe? https://eckstein-shop.de/I2C-1602-Serial-Blue-LCD-Display-Module-5V-16x2-Zeichen-HD44780?curr=EUR&gclid=Cj0KCQiA6enQBRDUARIsAGs1YQj4FXPcFJA9d-CiIx3xYhXLDVaSHWbMBNuWJITyFca5TqT0YB_Tvq0aAk2oEALw_wcB

oder wo finde ich denn die Library, welche ich verwende?

Warum schaust du nicht selbst in die Library rein ? Wenn man eine Laufschrift einschalten kann, kann man die sicher auch wieder ausschalten.

Da wir nicht wissen, welche Library du verwendest, können wir dir auch nicht deine Arbeit abnehmen und in die Lib reinschauen.

ich schalte die Laufschrift ja mit lcd.scrollDisplayLeft() an, aber weiß eben nicht wie ich das scrollen wieder aufhören lasse

Die Lib findest Du (wenn sie ordentlich installiert wurde) in \libraries. Wenn Du Glück hast, steht da irgendwo eie URL drin, wo die Lib her ist.
Die gehört eigentlich nicht zum Standardumfang der IDE. Du musst sie also irgendwoher installiert haben. Das wo her ist wichtig.

Außerdem wäre es sinnvoll, den kompletten Sketch zu posten, nicht nur einen Ausschnitt.

Besonders dieser Teil macht kaum Sinn (die Schleife ist leer):

  for (int positionCounter = 0; positionCounter < 1; positionCounter++) { // LCD-Display nach links durchlaufen lassen
    // scroll one position left:
      }

Ich sehe in Deinem Code nirgendwo den von Dir genannten Aufruf lcd.scrollDisplayLeft()

Da fehlen einfach Infos von Deiner Seite, damit dir jemand überhaupt helfen kann.

Gruß Tommy

Die Lib findest Du (wenn sie ordentlich installiert wurde) in \libraries. Wenn Du Glück hast, steht da irgendwo eie URL drin, wo die Lib her ist.
Die gehört eigentlich nicht zum Standardumfang der IDE. Du musst sie also irgendwoher installiert haben. Das wo her ist wichtig.

Ich hab diese Library hier:

Mein kompletter Code ist leider zu lange, und ich komme damit über die 9000 Zeichen, daher hier ein erweiterter Ausschnitt (hoffe das reicht? ansonste poste ich ihn auf zwei Posts verteilt):

// Einbinden der Libraries
#include <Wire.h>
#include <LiquidCrystal_I2C.h>            // LCD-Anzeige: Library einbinden
#include "RTClib.h"                       // RTC: Library einbinden
#include <EEPROM.h>                       // Library des EEPROM einbinden

// Konstanten für Relais-Karte setzen:
int Relais1 = 9;                          // Relais1: Relaisausgang 1 mit Pin 9 verbunden
int Relais2 = 10;                         // Relais2: Relaisausgang 2 mit Pin 10 verbunden
int Relais3 = 11;                         // Relais3: Relaisausgang 3 mit Pin 11 verbunden
int Relais4 = 12;                         // Relais4: Relaisausgang 4 mit Pin 12 verbunden

// Konstanten für Taster setzen:
const int buttonPin = 2;                  // Taster: Eingang des Tasters auf Pin 2 legen (=buttonPin)
int buttonState = 0;                      // Taster: Variable um den aktuellen Tasterstatus abzufragen auf definieren und auf 0 setzen
int lastButtonState = 0;                  // Taster: Variable um den letzten Stand des Tasters abzufragen
int buttonPushCounter = 1;                // Taster: Zählvariable zum Zählen wie oft der Taster gedrückt wurde
bool LampeManuellEin = 0;                 // Taster: LampeManuellEin = 1 : Beleuchtung unabhängig von Umgebungsparameter einschalten
int StartSekundeTaster = 0;               // Taster: int um die Sekunde zu speichern in welcher der Taster gedrückt wurde

// Konstanten für LCD-Display setzen:
LiquidCrystal_I2C lcd(0x27, 16, 2);       // LCD-Display: Setzen der Adresse 0x27 für das 16 character mit 2 lines

// Konstanten für Füllstandssensor setzen:
const int trigPin = 8;                    // Füllstandssensor: Setzen von Pin8 als Trigger
const int echoPin = 7;                    // Füllstandssensor: Setzen von Pin7 als Echo
long duration;                            // Füllstandssensor: Definition des long duration (wie lange das Siganl unterwegs ist)
int wasserstand_ist;                      // Füllstandssensor: Definition des int wasserstand_ist (Gibt tatsächlichen Wasserstand an)
int AbstandZuFuellstandssensor;           // Füllstandssensor: Abstand von Wasseroberfläche zu Sensor
int AbstandMinimum = 5;                 // Füllstandssensor: Definition des Sollwertes (Schaltgrenze) des Wasserstandes
int wasserstand_ok = 0;                   // Füllstandssensor: wasserstand_ok = 1: Mindestwasserstand erreicht


// Konstanten für LDR_I (Lichtsensor Innen [im Pflanzbereich]) setzen:
int valLDR_I = 0;                         // Lichtsensor_Innen: übergebner Analogwert von LDR
int LDR_I = 0;                            // Lichtsensor_Innen: Definition, dass LDR Wert mit Analogeingang 0 verbunden ist
int HelligkeitInnen_soll = 850;            // Lichtsensor_Innen: Sollwert der Helligkeit im Pflanzbereich definieren und auf minimalen Wert zur Photosynthese stellen (370 =1000 Lux)
bool HelligkeitInnen_ok = 0;               // Lichtsensor_Innen: HelligkeitInen_ok = 1: Helligkeitswert im Pflanzbereich > Sollwert

// Konstanten für LDR_A (Lichtsensor Außen [außerhalb des Pflanzbereich]) setzen:
int valLDR_A = 0;                         // Lichtsensor_Außen: übergebner Analogwert von LDR
int LDR_A = 1;                            // Lichtsensor_Außen: Definition, dass LDR Wert mit Analogeingang 1 verbunden ist
int HelligkeitAussen_min = 850;           // Lichtsensor_Außen: minimaler Wert der außerhalb des Pflanzbereichs ermittelt werden muss, sodass der Wert des HellikeitInnenSoll erreicht wird

// RTC definieren:
 RTC_DS1307 rtc;;

// Konstanten der Status LED setzen:
const int ledPin =  6;                   // Status LED: Pin 6 des Arduinos für den Ausgang der LED vergeben

// Variablen und Konstanten für Berechnung der Beleuchtungsdauer:
int vergangeneSekunde;
int BeleuchtungsdauerSekunden = EEPROM.read(20);     // zählt die Sekunden jeweils von 0-253 und zählt dann den EEPROMZaehler hoch
//int BeleuchtungsdauerSekunden = 0;                // zum Manuellen zurücksetzen des Sekundenzählers auf 0
int EEPROMZaehler = EEPROM.read(21);              // aktuelle Beleuchtungsdauer aus EEPROM Adresse 21 auslesen
//int EEPROMZaehler = 0;                          // zum Manuellen zurücksetzen des EEPROMZaehlers auf 0
int heutigeBeleuchtungsdauerGesamt = 0;           // ist der wirkliche Wert wie lange pro Tag die min. Helligkeit im Pflanzenbereich erreicht wurde
long BeleuchtungsdauerMax = 64768;                 // Festlegen der maximalen täglichen Beleuchtungszeit
bool maximaleBeleuchtungsdauerErreicht = 0;        // maximaleBeleuchtungsdauerErreicht = 1: LDR_I hat maximale Beleuchtungszeit (64768 sec) erkannt

// Variablen und Konstanten für Abfrage der Helligkeit:
bool LampeBenoetigt = 0;                             // LampeBenötigt = 1: LDR_I hat zu geringen Wert erkannt, die Wachstumslampe soll zugeschalten werden
/*Ende Deklaration*/

void setup() {
  Serial.begin(9600);                     // Serielle Kommunikation starten; Baud-Rate 9600
  Relais_Task();                          // Relais-Karte: setup Routine aufrufen
  Taster_Task_v1();                       // Taster: setup Routine aufrufen
  Fuellstandssensor_Task();               // Füllstandssensor: setup Routine aufrufen
  LCD_Task();                             // LCD-Anzeige: setup Routine aufrufen
  RTC_Task();                             // RTC: setup Routine aufrufen
  StatusLED_Task();                       // Status-LED: setup Routine aufrufen
}

void loop() {
  Taster_Loop();                          // Taster: loop Routine aufrufen in der der Taster als Schalter funktioniert
  Relais_Loop();                          // Relais-Karte: loop Routine aufrufen
  Fuellstandssensor_loop();              // Füllstandssensor: loop Routine aufrufen
  LCD_loop();                             // LCD-Anzeige: loop Routine aufrufen
  RTC_loop();                             // RTC: loop Routine aufrufen
  LDR_I_loop();                           // LDR_I: loop Routine aufrufen
  LDR_A_loop();                           // LDR_A: loop Routine aufrufen
  BeleuchtungsdauerBerechnen_loop();      // BeleuchtungsdauerBerechnen: loop Routine aufrufen
  Helligkeitsabfrage_loop();              // Helligkeitsabfrage: loop Routine aufrufen
  StatusLED_loop();                       // StatusLED: loop Routine aufrufen
  }

/*Beginn Task Routinen der Bauteile*/

void LCD_Task() {
  lcd.begin();
}

/*Beginn Loop Routinen der Bauteile*/

void LCD_loop() {
  for (int positionCounter = 0; positionCounter < 1; positionCounter++) { // LCD-Display nach links durchlaufen lassen
    // scroll one position left:
      }

  if ((wasserstand_ok == 1) and (maximaleBeleuchtungsdauerErreicht == 0)) {
    lcd.setCursor(0, 0);                       // Cursor in obere linke Ecke setzen
    lcd.print("HyFarm arbeitet ");
    lcd.setCursor(0, 1);                       // Cursor in untere linke Ecke setzen
    lcd.print("fehlerfrei      ");
  }

  if ((wasserstand_ok == 1) and (maximaleBeleuchtungsdauerErreicht == 1)) {
    lcd.scrollDisplayLeft();
    lcd.setCursor(0, 0);                       // Cursor in obere linke Ecke setzen
    lcd.print("Wachstumslampe                  ");
    lcd.setCursor(0, 1);                       // Cursor in untere linke Ecke setzen
    lcd.print("im Ruhemodus                    ");
  }

  if ((wasserstand_ok == 0) and (maximaleBeleuchtungsdauerErreicht == 0)) {
    lcd.scrollDisplayLeft();
    lcd.setCursor(0, 0);                       // Cursor in obere linke Ecke setzen
    lcd.print("Bitte Wassertank                ");
    lcd.setCursor(0, 1);                       // Cursor in untere linke Ecke setzen
    lcd.print("bald nachfuellen                ");
  }

  if ((wasserstand_ok == 0) and (maximaleBeleuchtungsdauerErreicht == 1)) {
    lcd.scrollDisplayLeft();
    lcd.setCursor(0, 0);                       // Cursor in obere linke Ecke setzen
    lcd.print("Bitte den Wassertank nachfuellen");
    lcd.setCursor(0, 1);                       // Cursor in untere linke Ecke setzen
    lcd.print("Wachstumslampe im Ruhemodus     ");
  }
}

LG

Du hast das Scroll so im Code verteilt, dass man es nicht sinnvoll ausschalten kann.

Baue Dir eine Funktion, die nur das Scrollen um einen Schritt ausführt. Wenn Du das nicht willst, dann schreibe die Daten neu und rufe die Funktion nicht auf.

Gruß Tommy

Baue Dir eine Funktion, die nur das Scrollen um einen Schritt ausführt. Wenn Du das nicht willst, dann schreibe die Daten neu und rufe die Funktion nicht auf.

Danke für dein Feedback, wie kann ich das denn machen? Wie würde denn die Funktion aussehen?

Ich würde es so machen:

// globale Variable
boolean isScroll = false;
uint32_t scrollIntervall = 500; // 0,5 Sekunden

void scrollLeft1Step() {
static uint32_t lastScroll = 0;   
uint32_t aktMillis = millis();
if (aktMillis - lastScroll >= scrollIntervall) {
  lastScroll = aktMillis;
  if (isScroll) lcd.scrollDisplayLeft();
}

void loop() {

....
  scrollLeft1Step();
....
  
}

Je nachdem, ob Du scrollen willst oder nicht setzt Du die Variable isScroll auf true oder false.

Ob das zu Deinem Code passt, kann ich aus den Fragmenten nicht erkennen. Die anderen Vorkommen von lcd.scrollDisplayLeft(); musst Du dann löschen.

Wenn es nicht zu Deinem Aufbau passt, dann Grundlagen lernen und selbst bauen.

Gruß Tommy