ich nutze einen Mega mit einem DS3231, auch nicht das erste mal... Ich kann mit dem Beispiel- Sketch "set.RTC seriell" Datum und Zeit erfolgreich setzen, doch sobald die Schaltung stromlos ist verliert sie auch die Zeit. Ich habe schon 2 verschiedene Module getestet und auch die Batterie erneuert... leider ohne Erfolg.
MaHa76:
der geht immer direkt auf den 1.1.1970- also so als wenn das Modul die Spannung verliert...
Der 01.01.1970 00:00 UTC ist der Startzeitpunkt der Linux-Zeit ("Sekunden seit diesem Zeitpunkt").
Deine RTC arbeitet intern gar nicht mit dieser Zeit, sondern mit getrennten Registern für Tag, Monat, Jahr, Stunde, Minute, Sekunde.
Wenn Deine Uhr stromlos ist und auch die Backup-Batteriestromversorgung versagt, dann sollte Deine Uhr mit dieser Zeitangabe starten:
01.01.00 um 00:00:00 Uhr.
Je nach verwendeter Library könnte das interpretiert werden als:
01.01.1900 um 00:00:00 Uhr.
oder
01.01.2000 um 00:00:00 Uhr.
letztere Zeitangabe ließe sich auch in eine Linux-Zeitangabe umwandeln.
Also wenn Deine Zeit immer am 01,01.1970 startet, dann vermute ich eher, dass Du die Zeit nicht von einem RTC-Modul beziehst (weder einem mit richtiger Zeit gestellten noch einem bei 0 startenden Modul), sondern dass Du einfach die Zeit aus einer nicht initialisierten Time-Library rausziehst, die intern mit Linux-Zeit arbeitet.
Das mit dem 01.01.1970 sieht mir eher nach einem Softwarefehler als nach einem Hardwareproblem aus.
Es könnte allerdings auch sein, dass die von Dir verwendete Zeit-Library ein Problem mit der RTC erkennt, und es sich beim Start am 01.01.1970 um eine Art "Fehlerbehandlung" handelt.
MaHa76:
ich bin in 2h zu Hause und setze mal den Code den ich habe hier rein...
mein Rechner läuft auf Linux... also holt er sich eventl. da die zeit?
Nein, kein PC gibt seine Daten einfach so von alleine preis, auch nicht Datum und Uhrzeit.
Damit Dein Arduino seine Zeit von einem Linux-PC holen kann, müßte auf Deinen PC ein Programm aktiv laufen, das die Zeit zum Arduino sendet.
Die falsche Startzeit Unixtime "0" (= 01.01.1970 00:00 Uhr) wird sich Dein Arduino schon selber holen, entweder durch falsche oder fehlende Initialisierung einer verwendeten Library, oder als Fall-Back Option im Fehlerfall, dass die RTC nicht korrekt ausgelesen werden kann.
So, das hier ist der Code... mir ist aufgefallen, dass es schon reicht den seriellen Monitor zu und auf zu machen, dass die Zeit auf 1970 gesetzt wird....
Das setzen der Zeit klappt aber ohne Probleme....
/*----------------------------------------------------------------------*
* Display the date and time from a DS3231 or DS3232 RTC every second. *
* Display the temperature once per minute. (The DS3231 does a *
* temperature conversion once every 64 seconds. This is also the *
* default for the DS3232.) *
* *
* Set the date and time by entering the following on the Arduino *
* serial monitor: *
* year,month,day,hour,minute,second, *
* *
* Where *
* year can be two or four digits, *
* month is 1-12, *
* day is 1-31, *
* hour is 0-23, and *
* minute and second are 0-59. *
* *
* Entering the final comma delimiter (after "second") will avoid a *
* one-second timeout and will allow the RTC to be set more accurately. *
* *
* No validity checking is done, invalid values or incomplete syntax *
* in the input will result in an incorrect RTC setting. *
* *
* Jack Christensen 08Aug2013 *
* *
* Tested with Arduino 1.0.5, Arduino Uno, DS3231/Chronodot, DS3232. *
* *
* This work is licensed under the Creative Commons Attribution- *
* ShareAlike 3.0 Unported License. To view a copy of this license, *
* visit http://creativecommons.org/licenses/by-sa/3.0/ or send a *
* letter to Creative Commons, 171 Second Street, Suite 300, *
* San Francisco, California, 94105, USA. *
*----------------------------------------------------------------------*/
#include <DS3232RTC.h> //http://github.com/JChristensen/DS3232RTC
#include <Streaming.h> //http://arduiniana.org/libraries/streaming/
#include <Time.h> //http://playground.arduino.cc/Code/Time
#include <Wire.h> //http://arduino.cc/en/Reference/Wire
void setup(void)
{
Serial.begin(115200);
//setSyncProvider() causes the Time library to synchronize with the
//external RTC by calling RTC.get() every five minutes by default.
setSyncProvider(RTC.get);
Serial << F("RTC Sync");
if (timeStatus() != timeSet) Serial << F(" FAIL!");
Serial << endl;
}
void loop(void)
{
static time_t tLast;
time_t t;
tmElements_t tm;
//check for input to set the RTC, minimum length is 12, i.e. yy,m,d,h,m,s
if (Serial.available() >= 12) {
//note that the tmElements_t Year member is an offset from 1970,
//but the RTC wants the last two digits of the calendar year.
//use the convenience macros from Time.h to do the conversions.
int y = Serial.parseInt();
if (y >= 100 && y < 1000)
Serial << F("Error: Year must be two digits or four digits!") << endl;
else {
if (y >= 1000)
tm.Year = CalendarYrToTm(y);
else //(y < 100)
tm.Year = y2kYearToTm(y);
tm.Month = Serial.parseInt();
tm.Day = Serial.parseInt();
tm.Hour = Serial.parseInt();
tm.Minute = Serial.parseInt();
tm.Second = Serial.parseInt();
t = makeTime(tm);
RTC.set(t); //use the time_t value to ensure correct weekday is set
setTime(t);
Serial << F("RTC set to: ");
printDateTime(t);
Serial << endl;
//dump any extraneous input
while (Serial.available() > 0) Serial.read();
}
}
t = now();
if (t != tLast) {
tLast = t;
printDateTime(t);
if (second(t) == 0) {
float c = RTC.temperature() / 4.;
float f = c * 9. / 5. + 32.;
Serial << F(" ") << c << F(" C ") << f << F(" F");
}
Serial << endl;
}
}
//print date and time to Serial
void printDateTime(time_t t)
{
printDate(t);
Serial << ' ';
printTime(t);
}
//print time to Serial
void printTime(time_t t)
{
printI00(hour(t), ':');
printI00(minute(t), ':');
printI00(second(t), ' ');
}
//print date to Serial
void printDate(time_t t)
{
printI00(day(t), 0);
Serial << monthShortStr(month(t)) << _DEC(year(t));
}
//Print an integer in "00" format (with leading zero),
//followed by a delimiter character to Serial.
//Input value assumed to be between 0 and 99.
void printI00(int val, char delim)
{
if (val < 10) Serial << '0';
Serial << _DEC(val);
if (delim > 0) Serial << delim;
return;
}
Habs... war mutmaßlich die Libary... habe eine bestehende funktionierende Schaltung genommen und getestet- selber Fehler... auf blauen Dunst die Libray neu installiert- siehe da es geht.
Vielen Dank für Eure schnelle und tolle Hilfe!!! Das Forum ist echt klasse!