Problem mit RTC - LCD

Ich möchte gerne versuchen, ein RTC-Modul (DS3231) zu verwenden und die Zeit auf einem LCD auszugeben. Ich verwende den Beispielcode aus der Library (ReadTest) und wollte ihn um das LCD erweitern. Das funktioniert aber nicht. Es wird nicht mal das Display gelöscht, obwohl ich im Setup lcd.clear(); eingetragen habe. Wenn ich bei einer Zeile, z.B.: lcd.print(tmHour); eingebe lcd.print("Test"); dann wird mir der Text auch ausgegeben, das LCD funktioniert also grundsätzlich. Was mache ich hier falsch?

Irgendwo habe ich gelesen, dass die Library des 1307 auch für den 3231 passen soll (edit: hier DS1307RTC Library, For Accessing Real Time Clock (RTC) Chips). Am seriellen Monitor wird jedenfalls alles so ausgegeben, wie es soll.

#include <Wire.h>
#include <TimeLib.h>
#include <DS1307RTC.h>
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);


void setup() {
  Serial.begin(9600);
  while (!Serial) ; // wait for serial
  delay(200);
  Serial.println("DS1307RTC Read Test");
  Serial.println("-------------------");
 
    // set up the LCD's number of columns and rows: 
  lcd.begin(20, 4);
  lcd.clear();
}

void loop() {
  tmElements_t tm;

  if (RTC.read(tm)) {
    Serial.print("Ok, Time = ");
    print2digits(tm.Hour);
    Serial.write(':');
    print2digits(tm.Minute);
    Serial.write(':');
    print2digits(tm.Second);
    Serial.print(", Date (D/M/Y) = ");
    Serial.print(tm.Day);
    Serial.write('/');
    Serial.print(tm.Month);
    Serial.write('/');
    Serial.print(tmYearToCalendar(tm.Year));
    Serial.println();

  
  lcd.setCursor(0, 0);
  lcd.print(tm.Hour);
  lcd.setCursor(2, 1);
  lcd.print(tm.Minute);
  lcd.setCursor(4, 2);
  lcd.print(tm.Second);
  lcd.setCursor(8, 3);
  lcd.print(tmYearToCalendar(tm.Year));
  
  } else {
    if (RTC.chipPresent()) {
      Serial.println("The DS1307 is stopped.  Please run the SetTime");
      Serial.println("example to initialize the time and begin running.");
      Serial.println();
    } else {
      Serial.println("DS1307 read error!  Please check the circuitry.");
      Serial.println();
    }
    delay(9000);
  }
  delay(1000);
}

void print2digits(int number) {
  if (number >= 0 && number < 10) {
    Serial.write('0');
  }
  Serial.print(number);
}

Ich kenne die Library nicht und bin auch nicht sicher, ob die für das DS3231 geeignet ist.

Woher weißt du, das das LCD nicht gelöscht wird?

Warum nimmst du nicht eine passende Library?

Hier findest du dir richtige Library und auch entsprechende Beispiele.

Ich habe diese Library verwendet, weil dabei steht (siehe mein link), dass sie auch für den DS3231 geeignet ist und weil die beiden Beispielcodes für mich gepasst hatten. Mit dem seriellen Monitor funktioniert auch alles, nur das LCD nicht.

Ich nehme an, dass das LCD nicht gelöscht wird, weil noch immer in jeder Zeile das steht, was ich vorher bei einem Test des LCDs (es ist mein erster vierzeiliger Versuch gewesen) dorthin geschrieben habe. Ich habe auch die Library des DS3232RTC, wie in deinem Link, ausprobiert, da fehlt mir dann aber wieder die Library Streaming.h, um das Beispiel auszuprobieren. Ich werde mit den ganzen Libraries noch wahnsinnig....

Ok, das mit deiner Lib habe ich überlesen.

Wird das LCD auch nicht gelöscht, wenn du den Arduino Spannungslos machst?

Nein, sobald ich USB wieder anstecke, ist die Schrift auch wieder da.
Wenn ich in die Zeilen etwas direkt per Textstring eingebe, funktioniert dies.

buffalo64:
Nein, sobald ich USB wieder anstecke, ist die Schrift auch wieder da.
Wenn ich in die Zeilen etwas direkt per Textstring eingebe, funktioniert dies.

Das ist merkwürdig.
Was ist das für ein LCD?

Ich kenne das nur, das danach die Schrift auch weg ist.

Es heißt WM-C2004M, wo ich es herhabe, weiß ich leider nicht mehr.

buffalo64:
Es heißt WM-C2004M, wo ich es herhabe, weiß ich leider nicht mehr.

Das ist wohl kompatibel (HD44780 Chip) zu den sonnst eingesetzten LCD, verhält sich aber merkwürdig.
Dann wird auch nach einem Reset die Schrift nicht gelöscht?

Ich vermute da einen Hardware-Fehler.

Wenn das Teil wunschgemäss Dinge ausgibt (was es ja grundsätzlich tut) ist die Hardware auch okay....

Das ist ein 20x4.
Sicher, dass das mit der LiquidCrystal überhaupt richtig arbeitet?

Teste das, indem du deinen Text (irgendwas) mal in jeder Zeile zu positionieren versuchst und schau auch, ob das an den richtigen Positionen erscheint.
Ich hab so ein Ding nur mit I2C, kann daher nicht probieren, ob es so laufen würde.

Rabenauge:
Das ist ein 20x4.
Sicher, dass das mit der LiquidCrystal überhaupt richtig arbeitet?

Da es HD44780-kompatibel "sein soll", ist das schon richtig

Teste das, indem du deinen Text (irgendwas) mal in jeder Zeile zu positionieren versuchst und schau auch, ob das an den richtigen Positionen erscheint.

Das wurde ja von dem TO getestet, wie ich es verstanden habe.
Aber dieser Text bleibt immer im Display. :astonished: Wohl auch nach einem Reset.

Ja, ich habe den Text richtig positionieren können. Ich hatte ganz einfach "Zeile 1" auf 0,0, "Zeile 2" auf 2,1 usw. geschrieben und es wurde auch richtig versetzt ausgegeben.

Ich verstehe nur nicht, warum 1. das Display bei clear nicht gelöscht wird und 2. die Zeit nicht angezeigt wird.

buffalo64:
Ja, ich habe den Text richtig positionieren können. Ich hatte ganz einfach "Zeile 1" auf 0,0, "Zeile 2" auf 2,1 usw. geschrieben und es wurde auch richtig versetzt ausgegeben.

Ich verstehe nur nicht, warum 1. das Display bei clear nicht gelöscht wird und 2. die Zeit nicht angezeigt wird.

Kannst du denn den erstellten Text nach einem delay mit neuem Text überschreiben?

Versuch mal zwischen lcd.begin(20, 4); und lcd.clear(); ein delay(10) von 10mS.
Die Initialisation braucht ca 5mS. Es gibt ein Bit, mit dem der Kontroller mitteilt, ob er beschäftigt ist oder mit der letzten Befehl fertig ist, da man aber bei Arduino Pins spart und das Display nur schreibt aber nicht liest (R/W auf Masse) kann dieses Bit nicht ausgewertet werden.
Darum ist es besser zu warten.

Grüße Uwe

Ok, danke, werde ich versuchen.

Hast du auch versucht, bestehenden Text nach einem delay(2000) direkt wieder zu überschreiben?

So, einen kleinen Schritt bin ich weiter, ich weiß jetzt zumindest, WO mein Problem liegt:

Nachdem das LCD mit dem LCD-Beispielprogramm alleine funktioniert, hatte ich einfach den Beispielcode des LCD in den RTC-Code kopiert, kein Erfolg, Ausgabe war nur Mist.
Ich hatte daraufhin nur die 3 zusätzlichen Libraries als Gegenprobe in den LCD-Code kopiert, worauf dieser ebenfalls nicht mehr funktionierte (das LCD gab plötzlich verrückte Zeichen aus.

Nachdem ich dann die Libraries einzeln auskommentiert hatte, zeigte sich, dass die DS1307RTC das Problem mit dem LCD verursacht. Nur beim Test-Code, ohne LCD mit Ausgabe am seriellen Monitor, funktioniert sie jedoch problemlos.

Ich als Anfänger finde in der Library jedoch nichts, was auf einen Fehler hindeutet. Habt ihr weitere Vorschläge für mich?

/*
 * DS1307RTC.h - library for DS1307 RTC
 * This library is intended to be uses with Arduino Time library functions
 */

#ifndef DS1307RTC_h
#define DS1307RTC_h

#include <TimeLib.h>

// library interface description
class DS1307RTC
{
  // user-accessible "public" interface
  public:
    DS1307RTC();
    static time_t get();
    static bool set(time_t t);
    static bool read(tmElements_t &tm);
    static bool write(tmElements_t &tm);
    static bool chipPresent() { return exists; }
    static unsigned char isRunning();
    static void setCalibration(char calValue);
    static char getCalibration();

  private:
    static bool exists;
    static uint8_t dec2bcd(uint8_t num);
    static uint8_t bcd2dec(uint8_t num);
};

#ifdef RTC
#undef RTC // workaround for Arduino Due, which defines "RTC"...
#endif

extern DS1307RTC RTC;

#endif

Und wird der Text weiterhin angezeigt, den du zuvor nicht löschen konntest?

Ja, zum Teil. Wenn ich in alle vier Zeilen was reinschreibe und dann wieder den RTC-Code hochlade:

Wenn ich nur das Setup mit delay und clear stehen lasse, bleibt der Text stehen, wie er ist.
Wenn ich in die Zeilen die Uhrzeit schreiben möchte, bleibt er ebenfalls stehen und wird teilweise mit Blödsinn überschrieben.

Dann ist es offensichtlich ein Problem der von dir verwendeten RTC-Library.

Du solltest den Aufbau des Sketches neu vornehmen und als erstes das LCD sauber zum Laufen bringen.
Da gibt es doch in der Library ein Demo-Sketch der das Display schon im Setup beschreibt.

Hier kannst du doch Zeile für Zeile durchtesten und jeweils neu beschreiben.

Beispiel:

#include <LiquidCrystal.h> 
 
// initialize the library with the numbers of the interface pins 
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); 

void setup() {
   // set up the LCD's number of columns and rows: 
   lcd.begin(20, 4); 
   // Print a message to the LCD. 
   lcd.setCursor(0, 1);
   lcd.print("Zeile 1, mein Text!"); 
   lcd.setCursor(0, 2);
   lcd.print("Zeile 2, mein Text!"); 
   lcd.setCursor(0, 3);
   lcd.print("Zeile 3, mein Text!"); 
   lcd.setCursor(0, 4);
   lcd.print("Zeile 4, mein Text!"); 
}

Bei den einzelnen Tests nimmst du jeweils einen anderen Text.
Sollte das so nicht funktionieren, kannst du es evtl. mit einer anderen LCD-Library versuchen.
LCD-Library
Dazu aber die vorhandene Library entfernen.

Wenn das funktioniert, kannst du die Erweiterung um die RTC vornehmen. Dazu nimmst du die Library, die ich im Post #1 verlinkt habe. Hier verwendest du die "TimeRCT.ino". Lass das mit der "DS1307RTC.h"!

Da kannst du in der Ausgabezeile direkt unter die "Serial-Ausgabe" die "lcd-Ausgabe" schreiben.

Beispiel:

Serial.print(hour());
lcd.print(hour());

Das sollte so funktionieren. Genau so auch bei den anderen Ausgaben.

Natürlich muss der komplette RTC-Sketch zuvor eingebaut sein.
Die vorhanden RTC-Library brauchst du erst mal nicht entfernen, da diese einen anderen Namen trägt.

Bei evtl. Problemen einfach wieder melden.

Danke.

Am LCD liegt es definitiv nicht. Jedesmal, wenn ich wieder verzweifle und einen LCD-Code zum Testen lade, funktioniert dieser problemlos.
Ich habe die letzten Tage (gefühlt) alle Beispiele in Verbindung von RTC und LCD ausprobiert, die ich im Netz finden konnte, immer wurde mir Mist angezeigt.

Ich werde jetzt natürlich versuchen, nach deiner Anleitung Schritt für Schritt vorzugehen.

So, vor dem Antworten hat sich wieder das übliche Problem eingestellt:

Der LCD-Code funktioniert, sobald ich lediglich die neu heruntergeladene (und die IDE auch neu gestartet habe) Library DS3232RTC-master mittels #include einbinde, zeigt das Display nur mehr Mist an. Wie gesagt, nichts anderes gemacht, außer die Library eingebunden.

Wenn ich die Library auskommentiere und neu hochlade, funktioniert wieder alles so, wie es soll.

#include <LiquidCrystal.h>
#include <DS3232RTC.h>

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

void setup() {
  
    lcd.begin(20, 4);

    lcd.print("Initialisierung");
    delay(1000);
    
}

void loop() {

  lcd.clear();
  delay(500);

  lcd.setCursor(0,0);
  lcd.print("Zeile 1.....");
  delay(500);

  lcd.setCursor(2,1);
  lcd.print("Zeile 2.....");
  delay(500);

  lcd.setCursor(4,2);
  lcd.print("Zeile 3.....");
  delay(500);

  lcd.setCursor(6,3);
  lcd.print("Zeile 4.....");
  delay(500);

}