DS1307 Lib

Moin moin
Habe nun ein DS1307 RTC und komme mit der Lib nicht klar.
Mit der Time.h ging es so:

      sprintf(lcdline,"%02d:%02d:%02d",hour(10),minute(10),second(10));
      lcd.print(lcdline);

Mit der DS1307.h habe ich dies getestet und nix funktioniert:

  sprintf(lcdline,"%02d:%02d:%02d",t.hour(10),t.min(10),t.sec(10));
  lcd.print(lcdline);

Kann mir jemand zeigen wie es richtig gemacht wird?

Wieso kombinierst du nicht die RTC mit Time? Die arbeiten wunderbar zusammen.

Du musst dazu entweder diese Lib nehmen:
http://www.pjrc.com/teensy/td_libs_DS1307RTC.html

Oder du editierst deine Lib so dass sie einen time_t zurück gibt.

Dann machst du das im Setup:

setSyncProvider(RTC.get);		// the function to get the time from the RTC
setSyncInterval(60);			//time is in seconds

Dann synchronisiert sich der Arduino einmal pro Minute mit der RTC. Und du kannst einfach mit hour() und minute() die Zeit abrufen.

Wollte ungern Libs einbinden die ich "nicht" brauch.

Poste mal einen Link zu deiner RTC Lib. Da gibt es nämlich mehrere.

Müsste diese sein.
Habe auch eine DS1307New und RTClib

skorpi08:
Wollte ungern Libs einbinden die ich "nicht" brauch.

Was heißt hier, Libs die du nicht brauchst? Klar, Libs belegen gerade beim zB. Uno etwas Speicherplatz. Die Libs wären aber defentiv nicht unnütz. Wenns mit dem Speicherplatz nicht reicht, modifziere die RTC Libs.

modifiziert hab ich noch keine Lib und hab auch kein Plan wie es da funktioniert. Hab zwar dran gedacht eine einzelne Lib für ein Projekt zu basteln aber ist noch nicht soweit.

Die Lib hat doch schon eine getTimeStr() Funktion laut Doc. Da musst du sonst nichts mehr machen

lcd.print(rtc.getTimeStr(g_thread_counter));

funktioniert aber nicht, da er nicht von 00:00:00 anfängt

Vielleicht erklär ich mal was ich vorhabe:
ich habe ein g_thread_counter++; der zählt und die lcd.print soll es halt in hour:min:sec anzeigen

Und was ist threadCounter? Ein millis() Wert? Das ginge natürlich nicht.

Du musst mal nachschauen was Funktionen eigentlich als Parameter wollen und nicht willkürlich Dinge übergeben, die zufällig einen kompatiblen Datentyp haben :slight_smile:

Ja genau, ist ein millis Wert.

Wenn ich nur wüsste wonach ich suchen soll, beim nachschauen welche Funktion und welcher Parameter.

Erst mal die Dokumentation der Lib. Auch möglich sind die cpp. und h. Dateien. Wenn der Code gut dokumentiert ist, steht es auch da drin, oder es ist aus dem Code ersichtlich.

Aber dein Ansatz ist völlig falsch. Du kannst mit einer RTC Lib nicht millis() in h:m:s umrechnen. Auch Time macht das nicht, da sie Sekunden als Zeit-Basis hat. time_t ist die Anzahl der Sekunden seit 1970.

Google vielleicht mal nach einem Algorithmus um millis() per Hand umzurechnen.

Dann ist die Frage was dieser millis() Wert darstellen soll? An sich ist das die Uptime des Arduinos. Wenn du da Time Stamps willst, musst du was anderes als millis() nehmen. z.B. einen time_t der Time-Lib. Den kann man problemlos in eine Uhrzeit konvertieren.

Mit der Time.h lief es.

int g_thread_tTimer;

  if (digitalRead(R_2)==HIGH) {
      g_thread_tTimer++;
    }

      char lcdline[17]; 
      lcd.clear();
      lcd.setCursor(0,0);
      sprintf(lcdline,"%02d:%02d:%02d",hour(g_thread_tTimer),minute(g_thread_tTimer),second(g_thread_tTimer));
      lcd.print(lcdline);

Ich werd dann wohl doch mit der Time.h machen müssen

Es geht weil er denkt das sind Sekunden. Und zwar die Sekunden seit 1. Januar 1970. Gib so spaßhalber mal das Datum aus :slight_smile:
hour(time_t t) extrahiert einfach die Stunden aus einem time_t. Genauso mit allen anderen Zeit-Funktionen, die einen time_t (was ein unsigned long ist) als Parameter haben.

Aber nur weil das in Time so ist, kannst du nicht einfach das gleiche in anderen Libs machen. Deine RTC Lib funktioniert ganz anders. Die liest einfach die Zeit aus der RTC und konvertiert dabei nichts.

Du könntest mills() / 1000 machen. Dann hast du die Uptime des Arduinos in h:m:s. Stimmt also doch nicht ganz, dass Time dazu völlig nutzlos ist :slight_smile:

Ich verstehe aber immer noch nicht wozu hier die RTC gut sein soll.

Serenifly:
Ich verstehe aber immer noch nicht wozu hier die RTC gut sein soll.

Zum anzeigen der Zeit.

Die Time.h ist dann nur für diesen Fall.

Du verwendest auch Time nicht korrekt (oder es war nur als Test). Time ist zugegebenerweise recht kompliziert an manchen Stellen. Aber schau dir mal die Beispiele an die da dabei sind.

Wenn du das machst:

sprintf(lcdline,"%02d:%02d:%02d",hour(),minute(),second());

zeigt Time die aktuelle Uhrzeit an. Einfach () und keine Parameter übergeben. Der zählt halt dann lokal auf dem Arduino und verliert die Zeit beim Ausschalten. Deshalb gibt es die sync-Funktion mit einem Zeitgeber.

Bei der RTC geht das einfach so:

lcd.print(rtc.getDateStr());

Du musst du Uhr halt auch erst mal stellen. Das ist bei Time auch der Fall.

Bei Time gibt es auch noch eine andere Möglichkeit, und zwar wenn man erst mal einen time_t in ein leserliches TimeElements struct umwandelt:

TimeElements tm;
time_t time = RTC.now();
breakTime(time, tm);

Dann kann man über tm.Hour, tm.Minute, tm.Day etc. auf alle Werte zugreifen. Wenn man direkt hour(), etc. macht, führt er das jedesmal im Hintergrund aus.

So kann man auch die Uhr stellen:

	TimeElements tm;
	tm.Day = 4;
	tm.Month = 8;
	tm.Year = CalendarYrToTm(2013);
	tm.Wday = 5;
	tm.Hour = 12;
	tm.Minute = 20;
	tm.Second = 0;
	time_t time = makeTime(tm);
	setTime(time);
      sprintf(lcdline,"%02d:%02d:%02d",hour(g_thread_tTimer),minute(g_thread_tTimer),second(g_thread_tTimer));

Da gib ich doch Werte rüber.
Aus dem ersten Post war nur "Test".

Mit RTC hab ichs auch so gemacht, nachdem es anders nicht ging.

Das gute an der DS1307 Lib ist, dass man nichts auskommentieren muss, um die Zeit einzustellen.
einfach den hier machen und schon alles erledigt

rtc.setTime(t.hour++,t.min,t.sec);