Forum: Mikrocontroller und Digitale Elektronik DS3231 RTCmit PC synchronisieren


von Klaus M. (klaus_mei)


Angehängte Dateien:

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

von Joachim B. (jar)


Angehängte Dateien:

Lesenswert?

ich hoffe du kannst programmieren

der Code kann noch Fehler enthalten, funktioniert aber bis jetzt

ist ja nur ein Ausschnitt

wenns klemmt melden

: Bearbeitet durch User
von Marc V. (Firma: Vescomp) (logarithmus)


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.

: Bearbeitet durch User
von Klaus M. (klaus_mei)


Lesenswert?

Sorry, aber jetzt bin ich irgendwie überfordert... :(

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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

 Womit ?

von Klaus M. (klaus_mei)


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.

von Marc V. (Firma: Vescomp) (logarithmus)


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 ?

von Joachim B. (jar)


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.

von Klaus M. (klaus_mei)


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.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Klaus M. schrieb:
> Die Ausgabe der verlinkten Batch-Datei funktioniert bei mir nicht
> richtig, und somit wird die Zeit auch nicht übertragen.

 Woher kommt die Fehlermeldung:
 "92" kann syntaktisch...

: Bearbeitet durch User
von Klaus M. (klaus_mei)


Lesenswert?

Keine Ahnung. Ich sehe auch nur die Ausgabe wie im Bild. Die Zahl ist 
aber bei jedem Aufruf von Time_Send.Bat eine andere. Vielleicht hat das 
was mit den Sekunden zu tun?

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Klaus M. schrieb:
> Keine Ahnung. Ich sehe auch nur die Ausgabe wie im Bild. Die Zahl ist
> aber bei jedem Aufruf von Time_Send.Bat eine andere. Vielleicht hat das
> was mit den Sekunden zu tun?

 Sende dein .bat file

von Klaus M. (klaus_mei)


Angehängte Dateien:

Lesenswert?

Habe in txt umbenannt

von Marc V. (Firma: Vescomp) (logarithmus)


Angehängte Dateien:

Lesenswert?

Klaus M. schrieb:
> Habe in txt umbenannt

 Das klappt so nicht.
 Probiere es mit angehängtem .bat

von Klaus M. (klaus_mei)


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.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Klaus M. schrieb:
> 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

 Probiere nur das (direkt im DOS Fenster):
1
 wmic os get LocalDateTime

 und mache Screenshot.

von Klaus M. (klaus_mei)


Angehängte Dateien:

Lesenswert?

Ist im Anhang.
Auch wenn es nicht klappen sollte... Vielen Dank schon mal für die Mühe

von Marc V. (Firma: Vescomp) (logarithmus)


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...

von Klaus M. (klaus_mei)


Lesenswert?

Jetzt gehts!!!!!!!!!!!
Ich bin begeistert!!!!!!!!
Vielen Dank nochmal für die Mühe.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Klaus M. schrieb:
> Ich bin begeistert!!!!!!!!
> Vielen Dank nochmal für die Mühe.

 Keine Ursache.
 Bei mir geht es sowohl mit als auch ohne Abfrage, kann den Fehler
 der bei dir auftritt, nicht reproduzieren.

von Klaus M. (klaus_mei)


Lesenswert?

Ist auch egal. Ich habe hier ein paar von diesen DS3231 und die müssen 
alle gestellt werden. Jetzt brauche ich die nur aufs Steckbrett zu 
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

von Marc V. (Firma: Vescomp) (logarithmus)


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...

: Bearbeitet durch User
von Klaus M. (klaus_mei)


Lesenswert?

probier ich morgen, muß jetzt los...

von Klaus M. (klaus_mei)


Lesenswert?

Habs nicht mehr ausgehalten :)
Bei dieser Variante kommt wieder diese Fehlermeldung:
Kann syntaktisch nicht verarbeitet werden...

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Klaus M. schrieb:
> Bei dieser Variante kommt wieder diese Fehlermeldung:
> Kann syntaktisch nicht verarbeitet werden...

 Probiere das (direkt im DOS Fenster):
1
echo %TIME%

von Philipp K. (philipp_k59)


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
}

: Bearbeitet durch User
von Klaus M. (klaus_mei)


Angehängte Dateien:

Lesenswert?

echo %TIME%

von Marc V. (Firma: Vescomp) (logarithmus)


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%

: Bearbeitet durch User
von Klaus M. (klaus_mei)


Lesenswert?

Fehler
Kann syntaktisch nicht verarbeitet werden...

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Klaus M. schrieb:
> Fehler
> Kann syntaktisch nicht verarbeitet werden...

 Kann nicht nachvollziehen, auf jeden Fall hat es mit %TIME% zu
 tun.

 Bei dir ist es ein Komma, bei mir ist es ein Punkt.
 Trotzdem, ich kann es bei mir mit Punkt und Komma vergleichen,
 es geht immer durch...

 Egal, auch so hast du max. 1 sec. Fehler (wenn überhaupt).

von Klaus M. (klaus_mei)


Lesenswert?

Marc V. schrieb:
> Egal, auch so hast du max. 1 sec. Fehler (wenn überhaupt).

Sehe ich auch so. Man muß nicht immer alles verstehen. Im Endeffekt 
zählt das Ergebnis und das wurde zu 100% erfüllt.
Vielen Dank noch einmal dafür

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.