DS3231 problem

Hallo,
ich bin neu mit dem Arduino UNO und habe jetzt ein Programm geschrieben bei dem die Uhrzeit auf dem Display ausgegeben werden soll. Das funktioniert soweit auch bis auf die anzeige der Sekunden. Sekunden zählen bis 60, fangen dann bei 9 an und zählen dann in 10er schritten bis 99 - also 9 - 19 -29...
danach fangen sie wieder bei 9 an und zählen in 1 Sekunden schritten bis 60 und fangen danach wieder in 10er schritten bei 9 an. Und immer so weiter in diesem Wechsel. Woran liegt das? Das Beispiel Programm mit der Ausgabe im Serial Monitor funktioniert ganz normal. Außerdem geht die Uhr falsch nachdem ich das usb kabel abgeklemmt habe und ich den Arduino mit einer Batterie betreibe.
Danke im voraus.

Da hast du wohl einen Fehler im Sketch.

Zeige uns deinen Sketch, dann können wir sicher helfen.

Hast du nicht ein Beispiel aus der RTC-Library verwendet ?

Und wie falsch geht die Uhr ?
Die DS3231 ist eigentlich sehr genau. Ich habe mehrere Projekte damit laufen und die sind Stabil.

Stephan90:
Hallo,
Woran liegt das?

Das liegt am Programm!

Ein Programm arbeitet exakt so wie eine Mülltonne:

Packst Du Müll rein, kommt auch Müll wieder heraus.

Was erwartest Du sonst?

Die DS3231 ist eigentlich sehr genau. Ich habe mehrere Projekte damit laufen und die sind Stabil.

Meine auch....
Nachdem ich bemerkt habe, dass meine mit Batterien ausgestattet waren, aber eine Akkuladeeinrichtung verbaut war.
Das hat meine Batterien getötet.

Aber wie es so schön geht:
Problem erkennen, Lösung finden, und durchsetzen.

#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

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

DS3231 clock;
RTCDateTime dt;

void setup()
{
clock.begin();
clock.setDateTime(DATE, TIME);
lcd.begin(16, 2);
}

void loop()
{
dt = clock.getDateTime();

lcd.setCursor(0, 0);
lcd.print(dt.year);
lcd.setCursor(4,0);
lcd.print("-");
lcd.setCursor(5,0);
lcd.print(dt.month);
lcd.setCursor(7,0);
lcd.print("-");
lcd.setCursor(8,0);
lcd.print(dt.day);
lcd.setCursor(0,1);
lcd.print(dt.hour);
lcd.setCursor(2,1);
lcd.print(":");
lcd.setCursor(3,1);
lcd.print(dt.minute);
lcd.setCursor(5,1);
lcd.print(":");
lcd.setCursor(6,1);
lcd.print(dt.second);

}

Das ist das Programm. Wird denn die Uhr über DFC gestellt?

Ich kenne die von dir verwendete RTC-Library nicht, aber so wie es aussieht, wir die RTC im Setup immer neu gesetzt. Vermutlich durch die PC-Zeit. Da der PC nicht angeschlossen ist, stimmt die Zeit nicht.

P.S.
Setze deinen Sketch bitte in Code-Tags, dann ist dieser besser zu lesen.

Edit:
Was ist DFC ?

Stephan90:
Wird denn die Uhr über DFC gestellt?

Was hat der Deutsche Flugroller Club mit Deinem RTC-Modul zu tun?

Hast Du jemanden vom Deutschen Flugroller Club bestellt, daqmit er Deine Uhr richtig einstellt?

ODER WAS SOLL DIE FRAGE NACH DEM DFC im Zusammenhang mit dem Stellen der Uhr?

Sorry ich meinte DCF, bzw. DCF77 mit dem die Funkuhren gestellt werden.

Stephan90:
Sorry ich meinte DCF, bzw. DCF77 mit dem die Funkuhren gestellt werden.

Und wie soll das gehen, wenn du keinen DCF77 Empfänger dran hast.

Lies bitte mein Post #6 (Uhr stellen) und setze den Sketch in Code-Tags.

Stephan90:
Sorry ich meinte DCF, bzw. DCF77 mit dem die Funkuhren gestellt werden.

Dein DS3231 hat nichts mit DCF77 am Hut!

clock.setDateTime(DATE, TIME);

Das stellt die Uhr bei jedem Programmstart auf die Zeit, zu der das Programm kompiliert wurde.
Willst du das?
Wohl nein!
Tipp: Dann lass das doch.

Stephan90:
Sorry ich meinte DCF, bzw. DCF77 mit dem die Funkuhren gestellt werden.

Also doch nichts mit Deutscher Flugroller Club DFC?

Aber von alleine bebkommt Dein RTC Uhrenmodul eine Zeit weder vom Deutschen Flugroller-Club DFC noch vom deutschen Zeitzeichensender DCF77 eingestellt.

Dazu braucht es mehr als nur ein RTC-Modul. Zum Beispiel zusätzlich ein DCF77-Modul.

Und ein störungsfreier Raum zum Betreiben, weit weg von PCs, Monitoren, Schaltnetzteilen und Lampen-Vorschaltgeräten. Und nicht zuletzt eine Software, dieZeitstempel aus einem DCF77 Modul auslesen und danach ein RTC-Modul auf die richtige Zeit einstellen kann.

Ohne DCF77-Modul kannst Du eine "Zeiteinstellung mit DCF" komplett abhaken.

Und mit DCF77-Modul würde Dir immer noch eine Software fehlen.
Und möglicherweise fehlt auch ein ausreichend sfunkstörungsfreier Aufstellort für das DCF77-Modul.

clock.setDateTime(DATE, TIME);

ok, das habe ich jetzt raus genommen, die Zeit stimmt jetzt. Allerdings habe ich noch immer das Problem das die ersten 10 Sekunden in 10er schritten laufen.

Stephan90:
Hallo,
Das funktioniert soweit auch bis auf die anzeige der Sekunden. Sekunden zählen bis 60, fangen dann bei 9 an und zählen dann in 10er schritten bis 99 - also 9 - 19 -29...

Deine Uhr zählt bis 60 Sekunden? :o
Das mit dem 9-19-29 wird durch Deine Ausgabe kommen:
Du gibst die Sekunden nicht 2 Stellig aus, d.h. wenn die Sekunden unter 10 sind, schreibst du die Einersekunden an die Stelle, an der sonst die 10er Sekunden sind.

Stephan90:
Allerdings habe ich noch immer das Problem das die ersten 10 Sekunden in 10er schritten laufen.

Warum versuchst Du, Dein LCD-Display unendlich oft pro Sekunde zu aktualisieren, wenn Du doch ein RTC-Modul verwendest, das seine Zeit nur einmal pro Sekunde weiterzählt?

Würde es Dir dann nicht reichen, folgende Programmlogik in der loop anzuwenden

  • lies das RTC-Modul hundert mal pro Sekunde aus!
  • wenn sich die Sekunde seit dem letzten Auslesen geändert hat, dann gib die neue Zeit auf LCD aus

Würde das nicht reichen, um stets innerhalb von 10 Millisekunden nach einem Sekundenwechsel die aktuelle Zeit auf das Display zu bekommen?

Du erwartest Hilfe von uns, aber selbst unterstützt du uns nicht.

Da bei deinem Sketch immer noch die Code-Tags fehlen, kann ich den auf dem Tablet sehr schlecht lesen.

Daher muss ich raten und sehe es wie Moko, du setzt keine füllende 0 (Null) vor die einer Sekunde:

Beispiel

  if (digits < 10)
    lcd.print('0');
  lcd.print(digits);

Ähnliche Problem wirst du sicher später auch bei anderen Stellen haben.

Hallo Stephan90, Guten Abend !

versuch es mal hiermit. Du verwendest eine DS3231… die musst Du autauschen in der include funktion gegen die DS1307. und an weiteren Stellen …

hier ist auch ein prima Tutorial zum Thema.

#include "Wire.h"
#include <LiquidCrystal.h>
#define DS1307_I2C_ADDRESS 0x68  // Du verwendest die DS3231 also #define DS3231_I2C_ADDRESS 0x68
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);       // bei Dir ist das 7,8,9,10,11,12
 
byte bcdToDec(byte val)
{
  return ( (val/16*10) + (val%16) );
}
 
void getDateDs1307(byte *second,byte *minute,byte *hour,byte *dayOfWeek,byte *dayOfMonth,byte *month,byte *year)    // ändern
{
  Wire.beginTransmission(DS1307_I2C_ADDRESS);   // ändern 
  Wire.write(0);
  Wire.endTransmission();
 
  Wire.requestFrom(DS1307_I2C_ADDRESS, 7);  // ändern
 
  *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 setup()
{
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
  Wire.begin();
  // AMEND IF YOUR USING A DIFFERENT LCD SCREEN //
  lcd.begin(16, 2);
}
 
void loop()
{
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
  String s, m, d, mth, h;
   
  getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);  // ändern
 
  if (second < 10) { s = "0" + String(second); } else { s = String(second); }
  if (minute < 10) { m = "0" + String(minute); } else { m = String(minute); }
  h = String(hour);
  if (dayOfMonth < 10) { d = "0" + String(dayOfMonth); } else { d = String(dayOfMonth); }
  if (month < 10) { mth = "0" + String(month); } else { mth = String(month); }
   
  char* days[] = { "NA", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun" };
   
  lcd.clear();
  // JUMP TO CENTER ON A 16X2 SCREEN //
  lcd.setCursor(4,0);
  // CHANGE THE FOLLOWING TO SET THE DATE IN TO YOUR PREFERED ORDER //
  lcd.print(h + ":" + m + ":" + s);
  // NEXT LINE, 1 SPACE IN FROM THE LEFT //
  lcd.setCursor(1,1);
  // PREFIX THE 20 AS THE RTC CHIP ONLY USES 2 DIGITS FOR THE YEAR //
  lcd.print(String(days[dayOfWeek]) + " " + d + "/" + mth + "/20" + year);
  delay(1000); // Wait 1 second                                                                       
}

Grüße und viel Erfolg beim Probieren !

Stefan