RTClib

Hallo,

ich bin beim Programmieren der RTC DS1307 auf ein kleines Problem gestoßen. Um genau zu sein verwende ich die RTClib Library und wollte gern damit die Uhrzeit einstellen. Folgender Befehl wird angegeben:

RTC.adjust(DateTime(DATE, TIME));

Dieser Bewirkt, dass die Systemzeit ausgelesen wird und der Baustein daran angepasst wird. Das funktioniert auch soweit ganz gut, doch ich will gern unabhängig der Systemzeit den Baustein nach meinen Wünschen anpassen und die Uhrzeit ändern können. Wie bekomm ich das am besten hin?
Ich hab mir mal TIME ausgeben lassen und folgendes erhalten:

21:29:408224

Ich schließe daraus, dass zum einen die Systemzeit genauer als eine Sekunde ist und einfach gerundet wird und diese zum anderen als Zahlenkette die mit Doppelpunkten abgetrennt ist ausgegeben wird. Sehe ich das richtig, oder ist das eine Fehlinterpretation? Hat jemand eine Idee wie ich nun "künstlich" die Systemzeit übergeben kann die durch mich manipuliert wurde? Hatte überlegt ob man einfach in dieser Form eine Zeit angeben kann

RTC.adjust(DateTime(DATE, 11:11:11)); // oder 111111

Keine der beiden Varianten funktioniert :confused:

Hoffe jemand versteht mich und kann mir bei meinem Problem weiterhelfen.

Viele Grüße
Till

Auf der untersten Ebene geht das über die Wire library. Schau dir mal das an und kopiere einfach die entsprechenden Teile:
http://www.pjrc.com/teensy/td_libs_DS1307RTC.html

Oder verwende gleich diese Klasse.

Die Systemzeit sind die Millisekunden seit dem Einschalten. Gibt auch libs die das dann auf Unix-Zeit umrechnen.

Hier ist ne Klasse, die dir die ganzen Datums und Zeit-Berechnungen abnimmt und sich automatisch mit der RTC synchronisiert:
http://www.pjrc.com/teensy/td_libs_Time.html

till_s90:
Hat jemand eine Idee wie ich nun "künstlich" die Systemzeit übergeben kann die durch mich manipuliert wurde? Hatte überlegt ob man einfach in dieser Form eine Zeit angeben kann

RTC.adjust(DateTime(DATE, 11:11:11)); // oder 111111

Keine der beiden Varianten funktioniert :confused:

Hoffe jemand versteht mich und kann mir bei meinem Problem weiterhelfen.

Da das offenbar Zeichenketten sind, müssen die Werte natürlich als Zeichenkette in doppelte Hochkommas eingeschlossen werden.
Probier's also lieber mal mit:

    RTC.adjust(DateTime(__DATE__, "11:11:11"));

Wie ist es damit?

Danke schonmal für die Antworten, die Time Library sieht ganz interessant aus, beim ausführen des Beispiel-Sketches erhalte ich jedoch folgende Fehler:

TimeRTC.pde: In function 'void setup()':
TimeRTC:14: error: 'RTC' was not declared in this scope

Die Idee die Zahlen in einer Zeichenkette in doppelten Hochkommas zu schreiben funktioniert leider nicht, zwar lässt der Sketch sich kompilieren, aber es hat keine Auswirkungen auf die eingespeicherte Zeit....

Also ich hab es doch einigermaßen hinbekommen:
Ich hab mir mal die Library angeschaut und darin stand man muss es als char* angeben, hab ne variable initialisiert und die Zeichenfolge hinzugefügt, nun kann ich die Anfangszeit beliebig wählen. Dennoch hab ich 2 Fragen.... was ist der Unterschied zwischen char und char*? Und ist es möglich bzw wie ist es möglich in eine Zeichenfolge Variablen einzufügen?

hi,

nimm doch die ds1307new, da ist alles in den beispielen (DS1307_Monitor) gezeigt.
oder eben direkt ohne library, ist ganz einfach.

gruß stefan

So, ich klinke mich mal hier rein da ich nicht unbedingt einen neuen Thread erstellen möchte. Ich benutze auch die RTC new Lib und wollte nun mit einem DCF77 den RTC stellen. Klappt auch hervorragend nur der Wochentag wird nicht angezeigt. Ich speichere die Uhrzeit und Datum von DCF in time_t und habe versucht mit

RTC.dow = (weekday(DCFtime));

das ganze zu speichern. Jedoch scheint die weekday = 0 zu sein, bzw. wird gar nicht eintragen? Also Lib benutze ich Standard # DCF77 auf der Arudino Seite. Gehe ich richtig in der Annahme das mit dieser Lib gar kein weekday ins time_t gespeichert wird?

hi,

vielleicht versteh' ich nicht ganz, was Du willst, aber der wochentag errechnet sich doch automatisch aus dem datum.

gruß stefan

Hi,

also habe grade nachgesehen, die Lib ist von Thijs Elenbaas und er selbst schreibt

Hi Robert,

No, the DCF77 library doesn’t, but the time library with which the DCF library interacts does, see: Arduino Playground - HomePage.

In order to have good separation of concerns, I want the DCF library just to receive and output the time, and do time-displaying, -conversion and -manipulation outside of it

also wird das gar nicht erst vom DCF77 ausgelesen. Somit ist klar warum nur Käse beim "Weekday" rauskommt.

Was ich machen wollte ist folgendes.....

Ich habe einen DS1307 und einen DCF77. Ich zeige die Uhrzeit mittels diesem Code hier an:

  RTC.getTime();
  if (RTC.hour < 10){
    lcd.setCursor(5,0); // Cursorbeginn auf Zeichen 7, Zeile 2
  } else {
      lcd.setCursor(4,0); // Cursorbeginn auf Zeichen 6, Zeile 2
    }
  lcd.print(RTC.hour); // Stunden
  printDigits(RTC.minute); // : Minuten
  printDigits(RTC.second); // : Sekunden
  lcd.setCursor(1,1); // Cursorbeginn auf Zeichen 1, Zeile 2
  switch (RTC.dow) {
  case 1:    // your hand is on the sensor
    lcd.print("Mo"); // Wochentag
    break;
  case 2:    // your hand is close to the sensor
    lcd.print("Di"); // Wochentag
    break;
  case 3:    // your hand is a few inches from the sensor
    lcd.print("Mi"); // Wochentag
    break;
  case 4:    // your hand is nowhere near the sensor
    lcd.print("Do"); // Wochentag
    break;
  case 5:    // your hand is nowhere near the sensor
    lcd.print("Fr"); // Wochentag
    break;
  case 6:    // your hand is nowhere near the sensor
    lcd.print("Sa"); // Wochentag
    break;
  case 7:    // your hand is nowhere near the sensor
    lcd.print("So"); // Wochentag
    break;
  } 
  if (day() < 10 && month() < 10){ // Wenn Tag < 10 und Monat < 10  
    lcd.setCursor(5,1); // Cursorbeginn auf Zeichen 7, Zeile 3 
  } else if (RTC.day > 10 && RTC.month < 10 || RTC.day < 10 && RTC.month > 10 ){ // Wenn Tag > 10 und Monat < 10 oder Tag < 10 und Monat > 10
      lcd.setCursor(4,1); // Cursorbeginn auf Zeichen 6, Zeile 3
    } else { // alles andere
        lcd.setCursor(3,1); // Cursorbeginn auf Zeichen 5, Zeile 3
      }
  lcd.print(RTC.day); // Tag
  lcd.print("."); // Text "."
  lcd.print(RTC.month); // Monat
  lcd.print("."); // Text "."
  lcd.print(RTC.year); // Jahr                 "
}

was auch ganz gut klappt.

Die Uhrzeit wird mittels DCF77 gesetzt mit diesem Code hier:

void DCFtoRTCsync() 
{
  if((millis() - prev) > interval) { // Delay mit Millis damit der µC nach andere Dinge paralell abarbeiten kann 
    time_t DCFtime = DCF.getTime(); // Zeit holen
    if (DCFtime!=0) { // Prüfen ob neue Zeit vorhanden ist (Wenn Return 0 dann wurde noch keine neue Zeit empfangen)
      prev = millis(); // Aktuelle millis Zeit in "prev_update" speichern
      RTC.stopClock();
      RTC.second = (second(DCFtime)); // DON'T USE '00' IF YOU MEAN '0' SECONDS!!!
      RTC.minute = (minute(DCFtime));
      RTC.hour = (hour(DCFtime));
      RTC.dow = (weekday(DCFtime)); // SUN=7,MON=1...
      RTC.day = (day(DCFtime));
      RTC.month = (month(DCFtime));
      RTC.year = (year(DCFtime));
      RTC.setTime();
      RTC.startClock();
    }
  }
}

das klappt auch alles wunderbar. Nur RTC.dow = (weekday(DCFtime)); // SUN=7,MON=1... nciht......

Ich wollte einfach nur zusätzlich den Wochentag ausgeben. Oder wie soll ich das sonst machen?

Sorry,

vergiss was ich gefragt habe, ich habe echt Tomaten auf den Augen heute.....

Problem gelöst.....Wer lesen kann ist klar im Vorteil. Ich habe Switch Case falsch gehabt bzw. deren Zuordung.

Sorry nochmal, glaube jetzt geht´s

till_s90:
TimeRTC.pde: In function 'void setup()':
TimeRTC:14: error: 'RTC' was not declared in this scope

Diese RTC Klasse ist statisch definiert, also du musst da keine Instanz mehr erstellen, bzw. die Klasse erstellt sich am Ende selbst: DS1307RTC RTC = DS1307RTC();

Bei mir konnte ich sie danach mit "RTC" ansprechen. Habe auch gerade mal nachgeschaut und ich habe an der Stelle nichts geändert.

Um die Zeit meiner Uhr mit einer Fernbedienung zu steuern habe ich folgenden Sketch geschrieben:

if (irrecv.decode(&results))
{
Serial.println(results.value);
switch (results.value)
{
case 2011254930: // Oben
if (settime = true)
{RTC.set(RTC.get()+300);}
break;

case 2011246738: // Unten
if (settime == true)
{RTC.set(RTC.get()-300);}
break;

case 2011283602: // MENU
if (settime == false)
{
settime = true;
}
break;
}
irrecv.resume();
}

Allerdings funktioniert es nicht ganz so, wenn ich die Taste nach "Oben" drücke stellt sich "settime" auch auf true, weiß jemand woran das liegen kann? Wenn man die Taste nach "Unten" drückt passiert das nicht... irgendwie merkwürdig

Flüchtigkeitsfehler:

if (settime = true)

In den anderen case-Anweisungen hast du richtigerweise == geschrieben.

Ich habe schon versucht VisualStudio so einzustellen dass bei sowas ne Warnung angezeigt wird, aber nichts gefunden :frowning:

Serenifly:
Ich habe schon versucht VisualStudio so einzustellen dass bei sowas ne Warnung angezeigt wird, aber nichts gefunden :frowning:

Geht ganz einfach: sich angewöhnen, die Variable beim Vergleich nach rechts zu setzen.
Also anstelle von

if (variable == true)
if (variable == 5)

schreibst Du einfach

if (true == variable)
if (5 == variable)

Wenn Du dann aus Versehen = anstelle von == schreibst gibt es einen Compilerfehler.
Wenn Du allerdings zwei Variablen vergleichen solltest, gibt es leider keine Lösung. Aber besser als nichts.