Problem mit LCD

Hallo!

wie oben erwähnt habe ich einen Fehler in meinem Code (bin noch unerfahren mit C++/ mit dem Arduino)

Mein Aufbau:

Ich habe das LCD1602 Modul für die Ausgabe, das Ds3231 RTC Modul für die Zeit und den Thermistor für die Temperatur angeschlossen

In der 1. Zeile des LCD lasse ich mir die Uhrzeit anzeigen,
In der 2. Zeile des LCD möchte ich in 2.5 Sekunden Abständen das Datum und die Temperatur anzeigen lassen.
Wenn ich mit delay() arbeiten würde, dann aktualisiert meine Uhr nur alle 2.5 Sekunden d.h. verwende ich die millis() funktion

Mein Code:

#include <LiquidCrystal.h>
#include <Wire.h>
#include <DS3231.h>

// Initialisiere die Bibliothek mit den Nummern der Schnittstellenpins
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

//TEMPERATUR
int ThermistorPin = 0;
int Vo;
float R1 = 10000;
float logR2, R2, T, C;
float c1 = 1.009249522e-03, c2 = 2.378405444e-04, c3 = 2.019202697e-07;

//UHR

DS3231 clock;
RTCDateTime dt;

//LCD

// Spalten und Zeilen des lcd
int lcdsize[] = {16, 2};



unsigned long previousMillis = 0;

const long interval = 2500;

void setup() {
  lcd.noDisplay();
  lcd.display();
  lcd.clear();
  lcd.begin(16, 2);
  Serial.begin(9600);

  // Initialize DS3231
  clock.begin();

  //Sketch-Kompilierzeit einstellen
  clock.setDateTime(__DATE__, __TIME__);
  // Set from UNIX timestamp
  // clock.setDateTime(1397408400);
  // Manual (YYYY, MM, DD, HH, II, SS
  // clock.setDateTime(2016, 12, 9, 11, 46, 00);
  dt = clock.getDateTime();
  
  // Richtet die Anzahl der Spalten und Zeilen der LCD ein:
  lcd.begin(lcdsize[0], lcdsize[1]);
  
  // Drucket eine Nachricht an das LCD.
  String s = clock.dateFormat("d F Y",   dt);
  lcd.setCursor(2, 1);
  lcd.print(s);



}
void loop() {
  unsigned long currentMillis = millis();
  dt = clock.getDateTime();
  lcd.display();

  String Uhr = clock.dateFormat("H:i:s", dt);
  lcd.setCursor(4, 0);
  lcd.print(Uhr);
  
  String s = clock.dateFormat("d F Y",   dt);
  
  Vo = analogRead(ThermistorPin);
  R2 = R1 * (1023.0 / (float)Vo - 1.0);
  logR2 = log(R2);
  T = (1.0 / (c1 + c2 * logR2 + c3 * logR2 * logR2 * logR2));
  T = T - 273.15;
  T = (T * 9.0) / 5.0 + 32.0;

  //Celsius
  C = ((T - 32) / 1.8000);

 if (currentMillis - previousMillis >= interval) {
     previousMillis = currentMillis;

    if (lcd.print(s)) {
      lcd.setCursor(1, 1);
      lcd.print("Temp = ");
      lcd.print(C);
      lcd.print(" C");
      lcd.print("");
    } else {
      lcd.setCursor(0, 1);
      lcd.print("");
      lcd.setCursor(2, 1);
      lcd.print(s);
      lcd.print("");
    }
  }
}

Mein Fehler:
Nach der ersten Aktualisierung des LCD steht neben der Uhr das Datum und in der 2. Zeile die Temperatur

Ich verwende in dem If-Statement deswegen lcd.print() da ich sonst nicht weiß wie ich sie sonst aufrufen soll.
Bitte um Hilfe

LG

Wenn Du Deiner Frage einen sinnvolleren Titel gibst (z.B. "Problem mit LCD Anzeige", das kannst Du auch noch nachträglich ändern), bekommst Du mehr Resonanz.

Vermutlich sind da mehrere Fehler drin. Vor allem fällt mir auf, wie oft Du lcd.begin() aufrufst, das soll nur einmal und vor allen weiteren lcd Zugriffen erfolgen. Sieh Dir mal die Beispiele zur LCD Bibliothek an.

lcd.print("") (nicht write) dürfte am Display nichts ändern, einfach weglassen. Das Ergebnis ist nur dann größer Null, wenn tatsächlich Zeichen ausgegeben werden.

Vielleicht schreibst Du Dir 3 Funktionen, zur Anzeige von Uhrzeit, Datum und Temperatur. Jede beginnt mit lcd.setCursor() zur Einstellung der Schreibposition, und dann erfolgt die Ausgabe des Textes. Geändert werden nur die tatsächlich überschriebenen Zeichen, wenn der neue Text kürzer ist als der alte, bleiben Zeichen des alten Textes sichtbar. Mit sprintf() kann man die Stellenzahl des jeweiligen Feldes bequem vorgeben, dann wird jeder Text gleich lang. Die Cursor-Position und Stellenzahl ist natürlich für jeden anzuzeigenden Wert unterschiedlich, die mußt Du selbst richtig in die Aufrufe hineinschreiben.

Ich verwende in dem If-Statement deswegen lcd.print() da ich sonst nicht weiß wie ich sie sonst aufrufen soll.

Tut mir leid, kapiere ich nicht. lcd.print() liefert die Anzahl der ausgegebenen Zeichen zurück. Das If wird also ausgeführt sobald nur irgendwas angezeigt wird. Das else also nie.

Ulli

Hat es einen besonderen Grund, dass du nicht mit einer Library für deine RTC arbeitest ? Ich verwende die DS3232RTC.h, damit wird der Sketch deutlich einfacher und die Beispiele zeigen dir, wie es funktioniert.

HotSystems:
Hat es einen besonderen Grund, dass du nicht mit einer Library für deine RTC arbeitest ?
Ich verwende die DS3232RTC.h, damit wird der Sketch deutlich einfacher und die Beispiele zeigen dir, wie es funktioniert.

Diesen Abschnitt habe ich von dem Elegoo Tutorial übernommen, sonst gitbt es keinen Grund.

LG

beeblebrox: Tut mir leid, kapiere ich nicht. lcd.print() liefert die Anzahl der ausgegebenen Zeichen zurück. Das If wird also ausgeführt sobald nur irgendwas angezeigt wird. Das else also nie.

Ulli

Das if-Statement soll wie folgt funktionieren: Wenn das Datum angezeigt wird, soll nach 2.5 Sekunden die Temperatur angezeigt werden (und umgekehrt).

Mein Problem: Ich weiß nicht wie ich dem if-Statement sagen soll, dass gerade das Datum/die Temperatur angezeigt wird (deswegen auch der Versuch mit lcd.print()).

LG

indem du ein Status "mitspeicherst". bollean Datumstate

if (Datumstate==1) {was mit Datum anzeigen; Datumstate=0 ; } ... ...

if (Datumstate==0) {was mit Temperatur anzeigen; Datumstate=1 ; }

stoeger: Diesen Abschnitt habe ich von dem Elegoo Tutorial übernommen, sonst gitbt es keinen Grund.

LG

Und warum postest du nicht mal einen Link, dann kann man mal Vergleiche ziehen ?

StefanBoth:
indem du ein Status “mitspeicherst”.
bollean Datumstate

if (Datumstate==1)
{was mit Datum anzeigen;
Datumstate=0 ; }

if (Datumstate==0)
{was mit Temperatur anzeigen;
Datumstate=1 ; }

Mit dieser Methode hat es funktioniert.

Ich danke allen für eure Bemühungen!

LG

HotSystems: Und warum postest du nicht mal einen Link, dann kann man mal Vergleiche ziehen ?

Habe das Programm auf Google Docs. gestellt:

https://docs.google.com/document/d/1k3FD1DRnqbK2H3IaO0POKVTfrSER3Q3oW0YL52n4taw/edit?usp=sharing

Und warum postest du es nicht hier im Forum ?

:( Schade... Das ist auf Dauer ein wenig frustrierend.

Stefan

@stoeger
Ok, da es offensichtlich zu viel Arbeit macht, habe ich den Sketch mal für dich hier eingestellt.
Solltest du zukünftig selbst machen.

Danke…

//www.elegoo.com
//2016.12.9

#include <Wire.h>
#include <DS3231.h>

DS3231 clock;
RTCDateTime dt;

void setup()
{
  Serial.begin(9600);
  // Initialize DS3231
  Serial.println("Initialize DS3231");;
  clock.begin();
  //Sketch-Kompilierzeit einstellen
  clock.setDateTime(__DATE__, __TIME__);
  // Set from UNIX timestamp
  // clock.setDateTime(1397408400);
  // Manual (YYYY, MM, DD, HH, II, SS
  // clock.setDateTime(2016, 12, 9, 11, 46, 00);
}



void loop()
{
  dt = clock.getDateTime();
  Serial.print("Long number format:          ");
  Serial.println(clock.dateFormat("d-m-Y H:i:s", dt));
  Serial.print("Long format with month name: ");
  Serial.println(clock.dateFormat("d F Y H:i:s",  dt));
  Serial.print("Short format witch 12h mode: ");
  Serial.println(clock.dateFormat("jS M y, h:ia", dt));
  Serial.print("Today is:                    ");
  Serial.print(clock.dateFormat("l, z", dt));
  Serial.println(" days of the year.");
  Serial.print("Actual month has:            ");
  Serial.print(clock.dateFormat("t", dt));
  Serial.println(" days.");
  Serial.print("Unixtime:                    ");
  Serial.println(clock.dateFormat("U", dt));
  Serial.println();
  delay(1000);
}

Dieser Sketch hat aber mit dem Thema nichts zu tun - keine Spur einer LCD Anzeige.

DrDiettrich: Dieser Sketch hat aber mit dem Thema nichts zu tun - keine Spur einer LCD Anzeige.

Das stimmt, sollte aber das Tutorial sein, nachdem er den Sketch aufgebaut hat. LCD hat er dann wohl nachträglich selbst hinzugebastelt.