Forum: Mikrocontroller und Digitale Elektronik Formatierung RTC-Modul MiroPython


von Dieter T. (dieter_t)


Lesenswert?

So solls sein >>>Sa 27/02/2021 10:55:55
wird erreicht mit dem Aufruf
#           sek |min|st|Woch|Tg|Mon|Jahr
NowTime = b'\x00\x55\x00\x07\x27\x02\x21''
#So funktioniert es aber ich möchte mit den
#PC aktualieren
#-----------------------------------------
pc_zeit = utime.localtime()
print (pc_zeit)
>>>(2021, 2, 27, 10, 55, 55, 5, 58)
soweit hab ich es
wie kann ich das jetzt so wie oben formatieren??
NowTime = ???????
#---------------------------------------------
habe schon einiges ausprobiert aber mir fehlen noch
viel Kenntisse und Erfahrung.

mit dem Befehl wird geschrieben
>>>bus.writeto_mem(int(address),int(register),NowTime)

von Apollo M. (Firma: @home) (majortom)


Lesenswert?

Dieter T. schrieb:
> pc_zeit = utime.localtime()
> print (pc_zeit)
>>>>(2021, 2, 27, 10, 55, 55, 5, 58)

auspacken!

year,month,day,hour,min,sec,wday,dayinyear = utime.localtime()

Dieter T. schrieb:
> So solls sein >>>Sa 27/02/2021 10:55:55

dann, z.b.

_wdays = ('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 
'Saturday', 'Sunday')

print('{0:} {1:2}/{2:02}/{3:4} 
{4:}:{5:}:{6:}'.format(_wdays[wday],day,month,year,hour,min,sec))

von Apollo M. (Firma: @home) (majortom)


Lesenswert?

Apollo M. schrieb:
> print('{0:} {1:2}/{2:02}/{3:4}
> {4:}:{5:}:{6:}'.format(_wdays[wday],day,month,year,hour,min,sec))

besser so, damit die führende null bleibt

print('{0:} {1:02}/{2:02}/{3:4}
{4:02}:{5:02}:{6:02}'.format(_wdays[wday],day,month,year,hour,min,sec))

von Apollo M. (Firma: @home) (majortom)


Lesenswert?

Dieter T. schrieb:
> NowTime = ???????

Dieter T. schrieb:
> NowTime = b'\x00\x55\x00\x07\x27\x02\x21''

now = utime.localtime()

nowTime =bytes([now.sec, now.min, ... ])

von Apollo M. (Firma: @home) (majortom)


Lesenswert?

um das int year zu zerlegen

nowTime =bytes([... ,now.tm_year//100, now.tm_year%100])

von Apollo M. (Firma: @home) (majortom)


Lesenswert?

Apollo M. schrieb:
> nowTime =bytes([... ,now.tm_year//100, now.tm_year%100])

corrected

nowTime =bytes([... ,now.year//100, now.year%100])

das kannst du alles leicht auch am pc ohne mpy ausprobieren, python 
installieren und die python shell aufrufen!

von Dieter Tepe (Gast)


Lesenswert?

Ja super für die schnellen Antworten ich bin noch sehr unerfahren mit 
der Programmierung in diesen Bereich.
Mit dem Befehl:
b'\x00\x55\x00\x07\x27\x02\x21''
läuft auch alles schon sehr gut.
ich möchte jedoch die Daten automatisch vom PC her aktuell setzen.
pc_zeit = utime.localtime() print (pc_zeit) gibt mir das
(2021, 2, 27, 10, 55, 55, 5, 58) zurück da ist aber nicht die richtige 
Reihenfolge und als Variablen kann ich die Werte so auch nicht in 
b'\x00\x55\x00\x07\x27\x02\x21 einsetzen.
Zusätzlich muss er bei eine einstellige Zahl eine zusätzliche 0 vorran 
stellen.
Damit bin ich schon ziemlich überfordert.
Aber erst Mal vielen vielen Dank für die vielen Antworten ich werde sie 
morgen ausgiebig testen.

von Dieter Tepe (Gast)


Lesenswert?

Wenn ich das so lese was ihr geschrieben habt ist da glaub ich schon die 
perfekte Lösung bei danke

von Dieter T. (dieter_t)


Lesenswert?

so soll eingegeben werden
##############sek|min|st|Woch|Tg|Mon|Jahr
#NowTime =  b'\x59\x06\x00\x07\x28\x02\x21'
#-------------------------------------------------
(2021, 2, 28, 0, 49, 37, 6, 59) kam vom PC

pc_jahr, pc_monat, pc_tag, pc_std, pc_min, pc_sek, pc_week, *_ = pc_zeit

NowTime = bytes([ pc_sek, pc_min, pc_std, pc_week, pc_tag, pc_monat, 
pc_jahr//100, pc_jahr % 100])

bus.writeto_mem(int(address),int(register),NowTime)

Fr 1c/02/2014 00:31:25
b'%1\x00\x06\x1c\x02\x14\x15'

#Das Ergebnis, wenn ich den Befehl oben eingebe kommt die korrekte Zeit
#Ich vermute das bei pc_week es bei einstelligen Ziffern sowie auch
wenn die sek,min,std unter 10 sind oder bei 00 Uhr, fehlen in der 
Formatierung
die Stellen.
Da ich hier mit int Zahlen arbeite. Warum jedoch das jahr nicht 2021 ist 
da
fehlen mir die Erklärungen.

import struct
timestamp = (2021, 2, 27, 10, 55, 55, 5, 58)
year, month, day, hour, minute, secs, *_ = timestamp
print(repr(struct.pack("BBBBBB", secs, minute, hour, day, month, year % 
100)))

damit hab ich auch schon versucht aber auch da ist da selbe Problem

von Dieter T. (dieter_t)


Lesenswert?

so soll eingegeben werden
##############sek|min|st|Woch|Tg|Mon|Jahr
NowTime = b'\x16\x43\x16\x09\x28\x02\x21'
#-------------------------------------------------​
​>>>print (noTime)     #  formatierte Daten vom pc

x16 x43 x16 x09 x28 x02 x21​  # Ausgabe

​die Daten sind soweit passend vor formatiert.
Wie bekomm ich diese jetzt so in der Variable NowTime =
So das ich sie mit den dazwischen liegenden \ nutzen kann ??

Bin da echt ein Neuling und komm trotz vielen Suchen nicht weiter.

von Dieter T. (dieter_t)


Lesenswert?

Ich versuche mal neu zu erklären:

der Befehl:
NowTime = b'\x00\x02\x15\x04\x21\x01\x21'
wird aufgerufen um Daten zu über geben.

noTime ist mein String mit Inhalt 00 02 15 04 21 01 21
Nun soll NowTime mit den Daten von noTime gefüllt werden
und soll dann so aus sehen  b'\x00\x02\x15\x04\x21\x01\x21'

Ich bekomme die Formatierung nicht hin

von Ralf M. M. (ramime)


Lesenswert?

Am einfachsten Du zerlegst deinen noTime mittels split() in ein Array, 
siehe:
https://www.w3schools.com/python/ref_string_split.asp
(1. Beispiel "Try it yourself")

und dann wieder zusammensetzen mit join(), siehe:
https://www.w3schools.com/python/ref_string_join.asp
auch das Beispiel nur eben mit "\x" anstatt "x" wie im Beispiel, wobei 
ich mir jetzt nicht so ganz sicher bin, ob das "\x" geht oder ob es 
"\\x" heißen muss, weil "\x" ja eine Hex-Zahl einleitet.

Dann noch das b und die ' dranpappen und ggf. ein eval() machen, falls 
du es wirklich binär brauchst und nicht nur einen String den Du per 
Copy+Paste irgendwo (z.B. REPL) reinmachst

von Dieter Tepe (Gast)


Lesenswert?

ob es "\x" heißen muss, weil "\x" ja eine Hex-Zahl einleitet.
Das mit der Hex-Zahl hab ich schon festgestellt ich wollte meinen String 
gleich richtig zusammen setzen aber ich bin da nicht weiter gekommen.
Wie muss ich das richtig schreiben?
Ich sehe oben kein Unterschied

von Gerd A. (gerd_a289)


Lesenswert?

Hi Dieter,
nachdem du wohl wie es scheint, ein bytearray versuchst aus den 
List-values von localtime neu zu packen, ist struct.pack dein Freund. 
Ich nehme dir jetzt nicht jeden Schritt ab aber soviel: du kannst mit 
struct.pack(">B",0) den int Wert in bytearray/byte konvertieren. Also 
damit alle int Werte < 255 wandeln. uPython müsste das dann ustruct.pack 
sein. Mit der folgenden Zeile kannst du dir noch anschauen ob dein 
bytarray ungefähr nach dem aussieht was du erwartest:

print(''.join(' 0x{:02X}'.format(x) for x in NowTime))

Das Jahr 2021 in 21 zu wandeln wirst du sicher schaffen ;)

Gruß
Gerd

von Dieter T. (dieter_t)


Lesenswert?

#Hallo Gerd
#Auch dir vielen Dank für deinen Beitrag folgenes hab ich geschafft
noTime = (' {0:02} {1:02} {2:02} {3:1} {4:02} {5:02} 
{6:02}'.format(sec,minute,hour,_wdays[wday],day,month,year,))
#gibt mir passend 17 43 00 03 01 03 21 aus.
Arry_Time = noTime.split(" ")
xxx = "\\x".join(Arry_Time)
xxxx = "b'" + xxx + "'"
print(xxxx)
NowTime = xxxx
#eigendlich ist das was ich sehe jetzt das passende Format
#aber das Ergebnis Mi 38/10/2033 31:30:78 passt nicht ganz :)
# b'\x54\x53\x00\x03\x01\x03\x21'

#Ich werde mich morgen mal witer damit beschäftigen und Gerd Hinweise
#ausprobieren

von Dieter T. (dieter_t)


Lesenswert?

1
#Super ich hab es geschafft
2
#Danke an alle besonderen Dank an Ralf M. M.
3
#Duch deine Hinweise und konnte ich schnell Ergebnisse
4
#erziehlen ein Anfänger weißt meist nicht genau wonach
5
#er suchen muss
6
7
so soll eingegeben werden
8
##############sek|min|st|Woch|Tg|Mon|Jahr
9
NowTime = b'\x16\x43\x16\x09\x28\x02\x21'
10
#-------------------------------------------------​
11
year,month,day,hour,minute,sec,wday,dayinyear = utime.localtime()
12
_wdays = ('02', '03', '04', '05', '06', '07', '08')
13
pc_jahr = year
14
pc_jahr = "x" + str(pc_jahr)
15
pc_jahr = pc_jahr[3] + pc_jahr[4]
16
year = int(pc_jahr)
17
rohdaten = (' {0:02} {1:02} {2:02} {3:1} {4:02} {5:02} {6:02}'.format(sec,minute,hour,_wdays[wday],day,month,year,))
18
Arry_Time = rohdaten.split(" ")
19
gesplittet = "\\x".join(Arry_Time)
20
neu_time = "b'" + gesplittet + "'"
21
NowTime = eval(neu_time)

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.