DS3231 RTCmit PC synchronisieren

OP #4945422
Lesenswert?

Hallo, ich möchte bei einer RTC DS3231 erstmalig die Zeit einstellen.
Die RTC hängt an einem Arduino Nano. Bis jetzt habe ich immer in einem 
Sketch die Zeit von Hand eingetragen und somit den DS3231 "gestellt".
Ich habe nun diese Anleitung gefunden:
http://www.instructables.com/id/Synchronise-DS3221-RTC-with-PC-via-Arduino/step2/Send-the-time-from-PC-to-Arduino/
Leider sieht die Ausgabe der Batch-Datei bei mir nicht so wie gewünscht 
aus (siehe Anhang). Kann mir bitte jemand bei der Fehlersuche helfen, 
bzw. gibt es eine andere einfache Möglichkeit die PC-Zeit zu übertragen? 
Da soll nur einmalig, bei der ersten Inbetriebnahme bzw. nach einem 
Batteriewechsel geschehen. Vielleicht gibt es ja schon eine gute 
funktionierende Anleitung.
Vielen Dank
Angehängte Dateien:
(Firma: Vescomp) #4945541
Lesenswert?

Klaus M. schrieb:
> Da soll nur einmalig, bei der ersten Inbetriebnahme bzw. nach einem
> Batteriewechsel geschehen.

 Localtime Format bei dir entsprechend verändern, wirkt manchmal
 Wunder...

 P.S.
 Oder folgendes als z.B. ChkTime.bat probieren, sehen was dein
 PC dazu meint:
1
@echo off
2
for /F "usebackq tokens=1,2 delims==" %%i in (`wmic os get LocalDateTime /VALUE 2^>NUL`) do if '.%%i.'=='.LocalDateTime.' set ldt=%%j
3

4
@echo Datum:%ldt:~6,2%.%ldt:~4,2%.%ldt:~0,4%
5
@echo  Zeit:%ldt:~8,2%:%ldt:~10,2%:%ldt:~12,2%

 Wenn es nicht stimmt, Format verändern.
OP #4945567
Lesenswert?

Marc V. schrieb:
> Klaus M. schrieb:
>> Sorry, aber jetzt bin ich irgendwie überfordert... :(
>
>  Womit ?
mit dem Beitrag von Joachim :)
Die Batch-Datei gibt die Zeit und das Datum so aus:
Datum:21.03.2017
Zeit:11:10:14
Das muß jetzt auf die richtige Com-Schnittstelle umgeleitet werden >COMx 
?
Dann muß wahrscheinlich auf dem Arduino noch ein Sketch laufen, wo die 
Werte eingelesen und in der RTC gespeichert wird. Gibt es da vielleicht 
schon ein fertiges Skript? Ich wundere mich nur. Meistens soll man die 
Zeit von Hand eintragen und dann auf den Arduino übertragen. so in der 
Form:
setup
{
setTime(15, 04, 00, 18, 3, 2017);   //set the system time to 23h31m30s 
on 13Feb2009
RTC.set(now());                     //set the RTC from the system time
}
Vielleicht hab ich mir das aber auch zu einfach vorgestellt.
(Firma: Vescomp) #4945604
Lesenswert?

Klaus M. schrieb:
> Das muß jetzt auf die richtige Com-Schnittstelle umgeleitet werden >COMx
> ?

 Nein.
 Dein Arduino erwartet die Daten so:
1
Sxx,
2
Dxx,
3
Hxx,
4
Txx,
5
Mxx,
6
Jxxxx,
 Wofür auch die Komma gut sein soll...


> Dann muß wahrscheinlich auf dem Arduino noch ein Sketch laufen, wo die
> Werte eingelesen und in der RTC gespeichert wird.

 Selbstverständlich, irgendwo auf der verlinkten Seite muss es auch
 einen Sketch geben, oder ?
#4945612
Lesenswert?

Klaus M. schrieb:
> Sorry, aber jetzt bin ich irgendwie überfordert... :(

na denn, programmieren lernen

gcc gibt dir sehr schön compile Datum und Zeit aus, das kann man prima 
nutzen um auch gleich die RTC beim Sketch aufpielen zu stellen +- 
Tranfertempo

Man kann auch mit einem beliebigen Computer und Terminal Programm die 
Uhr per Kommando stellen

time11:56:35 und oder date2017/03/21

wenn dich das überfordert, erst mal lernen.
OP #4945613
Lesenswert?

Ja, diesen Sketch gibt es. Diesen kann man auch fehlerfrei auf den 
Arduino flashen. Wenn du die Ausgabe der Batch-Datei anschaust und mit 
dem Bild in meinem  ersten Post vergleichst, siehst du was ich meine. 
Die Ausgabe der verlinkten Batch-Datei funktioniert bei mir nicht 
richtig, und somit wird die Zeit auch nicht übertragen.
OP #4945824
Lesenswert?

Funktioniert auch nicht. Ist der gleiche Fehler. Sieht man auch ohne 
Arduino.
Entweder alle Com Zeilen auskommentieren oder Com1 (falls vorhanden 
nehmen).
Der Fehler ist der Gleiche. Wenn man mehrmals hintereinander probiert 
kommt auch eine andere Fehlermeldung. Habe leider keinen Screenshot 
gemacht, aber es hat irgenwas mit dem Zahlenformat zu tun. Entweder es 
wird eine Dezimalzahl angezeigt, wo eine Hex erwartet wird oder 
umgekehrt. Wie gesagt kam nur einmal und lässt sich nicht provozieren.
(Firma: Vescomp) #4945877
Lesenswert?

Klaus M. schrieb:
> Ist im Anhang.

 Irgendwas stimmt nicht mit Abfragen.
 Probieren:
1
mode COM5 BAUD=9600 PARITY=n DATA=8
2
@echo off
3
for /F "usebackq tokens=1,2 delims==" %%i in (`wmic os get LocalDateTime /VALUE 2^>NUL`) do if '.%%i.'=='.LocalDateTime.' set ldt=%%j
4
set hours=%ldt:~8,2%
5
set minutes=%ldt:~10,2%
6
set seconds=%ldt:~12,2%
7

8
echo S%ldt:~12,2% >\\.\COM5
9
echo D%ldt:~10,2% >\\.\COM5
10
echo H%ldt:~8,2% >\\.\COM5
11

12
echo T%ldt:~6,2% >\\.\COM5
13
echo M%ldt:~4,2% >\\.\COM5
14
echo J%ldt:~0,4% >\\.\COM5
15

16
@echo Datum:%ldt:~6,2%.%ldt:~4,2%.%ldt:~0,4%
17
@echo  Zeit:%ldt:~8,2%:%ldt:~10,2%:%ldt:~12,2%

 Sollte durchgehen...
(Firma: Vescomp) #4945974
Lesenswert?

Klaus M. schrieb:
> stecken, dann die Batch ausführen und fertig. Ist doch viel eleganter
> als immer die neue Zeit von Hand eingeben. Danke für die Hilfe

 Falls du Zeit hast, probiere mal folgendes:
1
mode COM5 BAUD=9600 PARITY=n DATA=8
2
@echo off
3
for /F "usebackq tokens=1,2 delims==" %%i in (`wmic os get LocalDateTime /VALUE 2^>NUL`) do if '.%%i.'=='.LocalDateTime.' set ldt=%%j
4
set hours=%ldt:~8,2%
5
set minutes=%ldt:~10,2%
6
set /A seconds=%ldt:~12,2%+1
7
set miliSeconds=%ldt:~15,3%
8
:loop
9
if %TIME% LSS "%hours%:%minutes%:%seconds%.00" goto loop
10
for /F "usebackq tokens=1,2 delims==" %%i in (`wmic os get LocalDateTime /VALUE 2^>NUL`) do if '.%%i.'=='.LocalDateTime.' set ldt=%%j
11

12
echo S%ldt:~12,2% >\\.\COM5
13
echo D%ldt:~10,2% >\\.\COM5
14
echo H%ldt:~8,2% >\\.\COM5
15

16
echo T%ldt:~6,2% >\\.\COM5
17
echo M%ldt:~4,2% >\\.\COM5
18
echo J%ldt:~0,4% >\\.\COM5
19

20
@echo Datum:%ldt:~6,2%.%ldt:~4,2%.%ldt:~0,4%
21
@echo  Zeit:%ldt:~8,2%:%ldt:~10,2%:%ldt:~12,2%

 Bin gespannt ob das auch durchgeht...
#4946206
Lesenswert?

Ich mache das immer mit unixtime..

dabei brauch man nur im Setup wenn PinX auf High auf einen String warten 
und innerhalb von 20 Sekunden mit
1
if(digitalRead(myPin)==high){
2
Serial.setTimeout(20000);
3
long unixtime=Serial.parseInt();
4
Serial.setTimeout(1000)
5
rtc.adjust(unixtime); //oder andere lib rtc.adjust(DateTime(unixtime));
6
}

je nach Library die Uhr setzen..manche Librarys brauchen ein DateTime 
Objekt.
1
//DateTime von Bash übergeben "Feb 24 2011 19:20:28"
2
if(digitalRead(myPin)==high){
3
Serial.setTimeout(20000);
4
String myDateTime=Serial.readStringUntil('\n');
5
//Hier muss man über Serial "Ein DateTime String übergeben" 
6
Serial.setTimeout(1000)
7
rtc.adjust(myDateTime);
8
}

Kommt halt drauf welche Library oder ob sonst noch was am serialPort 
genutzt wird.. Wenn sonst nix genutzt wird kann man das mit 3 
zusätzlichen Zeilen umsetzen anstatt der Pin Abfrage.

Beispiel Sketch.. nur unxitime in die Konsole von unixtime.de kopieren 
(Selbst noch importen ;) und RTC starten):
1
void setup() {
2
  
3
Serial.begin(115200);
4
Serial.setTimeout(30000);
5
unsigned long unixtime=Serial.parseInt();
6
rtc.adjust(unixtime); 
7
// oder andere RTC Lib
8
//rtc.adjust(DateTime(unixtime));
9
}
10

11
void loop() {
12
  // put your main code here, to run repeatedly:
13
}
(Firma: Vescomp) #4946595
Lesenswert?

Und das ?
1
mode COM5 BAUD=9600 PARITY=n DATA=8
2
@echo off
3
for /F "usebackq tokens=1,2 delims==" %%i in (`wmic os get LocalDateTime /VALUE 2^>NUL`) do if '.%%i.'=='.LocalDateTime.' set ldt=%%j
4
set hours=%ldt:~8,2%
5
set minutes=%ldt:~10,2%
6
set /A seconds=%ldt:~12,2%+1
7
set miliSeconds=%ldt:~15,3%
8
:loop
9
if %TIME% LSS %hours%:%minutes%:%seconds%,00 goto loop
10
for /F "usebackq tokens=1,2 delims==" %%i in (`wmic os get LocalDateTime /VALUE 2^>NUL`) do if '.%%i.'=='.LocalDateTime.' set ldt=%%j
11

12
echo S%ldt:~12,2% >\\.\COM5
13
echo D%ldt:~10,2% >\\.\COM5
14
echo H%ldt:~8,2% >\\.\COM5
15

16
echo T%ldt:~6,2% >\\.\COM5
17
echo M%ldt:~4,2% >\\.\COM5
18
echo J%ldt:~0,4% >\\.\COM5
19

20
@echo Datum:%ldt:~6,2%.%ldt:~4,2%.%ldt:~0,4%
21
@echo  Zeit:%ldt:~8,2%:%ldt:~10,2%:%ldt:~12,2%

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren