Problem mit DateTime

Hallo,

habe einen UNO und das DFRobots LCD Shield hierfür habe ich mir ein Uhrensketch aus dem Internet geladen, der nach einigem hin und her auch läuft (hatte Schwierigkeiten mit der Installation der Libs. unter OSX), das einzige was nicht geht ist der Jahreswert (DateTime.sync(DateTime.makeTime(0, 41, 12, 15, 10, 2012)); // sec, min, hour, date, month, year), auch wenn da 2012 steht erscheint auf dem UNO mit LCDShield 2010, weiss jemand um das Problem?

#include <LiquidCrystal.h>
#include <DateTime.h>
#include <DateTimeStrings.h>

#define dt_SHORT_DAY_STRINGS
#define dt_SHORT_MONTH_STRINGS

// simple sketch to display a digital clock on an LCD
// see the LiquidCrystal documentation for more info on this

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
int backLight = 13; // pin 13 will control the backlight

void setup()
{
  pinMode(backLight, OUTPUT);
  digitalWrite(backLight, HIGH); // turn backlight on. Replace 'HIGH' with 'LOW' to turn it off.

  DateTime.sync(DateTime.makeTime(0, 41, 12, 15, 10, 2012)); // sec, min, hour, date, month, year // Replace this with the most current time
}

void loop()
{ 
  if(DateTime.available()) 
  {
    unsigned long prevtime = DateTime.now();
    while( prevtime == DateTime.now() ); // wait for the second to rollover
    

    DateTime.available(); //refresh the Date and time properties
    digitalClockDisplay( ); // update digital clock
  }
}

void printDigits(byte digits){
  // utility function for digital clock display: prints preceding colon and leading 0
  lcd.print(":");
  if(digits < 10)
    lcd.print('0');
  lcd.print(digits,DEC);
}



void digitalClockDisplay()
{
  lcd.clear();
  lcd.begin(16,2);
  lcd.setCursor(3,0);

  //lcd.print(DateTimeStrings.dayStr(DateTime.DayofWeek));
  if(DateTime.Day <10)
    lcd.print('0');
  lcd.print(DateTime.Day,DEC);
  lcd.print("/");

  //lcd.print(DateTimeStrings.monthStr(DateTime.Month));
  if(DateTime.Month <10)
    lcd.print('0');
  lcd.print(DateTime.Month,DEC);
  lcd.print("/");
  lcd.print((DateTime.Year,DEC)+2000);

  //lcd.print(" ");
  if(DateTime.Hour <10)
    lcd.setCursor(5,1);
  lcd.setCursor(4,1);

  // digital clock display of current time
  lcd.print(DateTime.Hour,DEC);
  printDigits(DateTime.Minute);
  printDigits(DateTime.Second);
}

Hilfreich wäre zu wissen, welche Lib Du für das DateTime verwendet hast. Ggf. wird das Jahr ja auch als Byte (als 12 statt 2012) angegeben.

die Libs heissen DateTime und DateTimeStrings mit 12 hab ich das auch schon probiert, eigentlich kann man da rein schreiben was man will es kommt immer 2010 als Jahr

wie wärs mit einem link? der name könnte durchaus für verschiedene libs in dem bereich verwendet worden sein. zudem ist auch immer die frage welche version eine lib du verwendest. postest du einen link, kann jeder mit genau der lib testen, die du auch verwendet hast.

Hallo,

hier ist der Link zu der Seite http://hacks2try.blogspot.de/2010/10/date-and-time-on-arduino-lcd-shield.html

und hier der Link zum Download http://www.arduino.cc/playground/uploads/Code/DateTime.zip

Hi,

hab grade mal bischen damit rumgespielt, wenn du die Zeile

[color=blue]lcd.print((DateTime.Year,DEC)+2000);[/color]

änderst in

[color=blue]lcd.print((DateTime.Year)+1900);[/color]

klappt's mit der Jahreszahlanzeige.

Warum? Keine Ahnung - die Jahreszahl kommt jedenfalls als "Jahr - 1900" (also 112 für 2012) von der Library ...

Grüßle Bernd

besten Dank klappt!, bin Anfänger was hat den das DEC zu sagen?

Ausgabe als Dezimalzahl. analog zu Serial.print(): http://arduino.cc/en/Serial/Print Grüße Uwe

Wobei ich mich aber frage, warum die Verwendung von DEC in diesem Fall den Wert von DateTime.Year erbarmungslos aus "10" festnagelt. Was läuft denn da schief?

Vermutlich wegen der Klammer. Ursprünglich war sah die Anweisung vermutlich mal so aus:

lcd.print(DateTime.Year,DEC);

Damit war das "DEC" Teil der Print Anweisung und sagt dem Print, das die Ausgabe zur Basis 10 (also dezimal) erfolgen soll. "DEC" ist vermutlich nur ein #define. Dann wurde aber was ergänzt und es wurde folgendes daraus:

lcd.print((DateTime.Year,DEC)+2000);

Damit ist aber das "(DateTime.Year,DEC)" eine eigenständige Anweisung, deren Ergebnis dann in das lcd.print( ERGEBNIS + 2000) eingefügt wird. Daher wird 2010 ausgegeben. Was der Compiler oder Präprozessor genau aus dem (DateTime.Year,DEC) Ausdruck macht, kann ich aber nicht sagen.

Ah ja, langsam sickerts ... die Addition erfolgt in dem Beispiel einfach nur an der "falschen Stelle" und bringt dadurch irgendwas aus dem Tritt. So funktioniert es wieder "korrekt":

lcd.print(DateTime.Year + 2000,DEC);

Wobei das "2000" in dem Beispiel definitiv falsch ist, es muß "1900" sein.