RP2040-GEEK
UTC time clock



Anleitung für die Firmware CircuitPython



Bildbox 1 (klick hier)


Stellen Sie sich vor, Sie befinden sich an einem unbekannten Ort, und benötigen dringend die aktuelle Zeit. Eine Uhr oder ein Smartphone haben Sie nicht. Im Film ist dann immer gerade kein Empfang. Aber Sie haben den RP2040-GEEK, der an eine Powerbank angeschlossen werden kann und mit der nachfolgenden Anwendung ausgestattet ist. Spass beiseite. Die folgende Anleitung zeigt auf der Grundlage der Satellitenverbindung mit dem GPS-Modul Air 530, wie man die aktuelle Zeit mit dem Pico-GEEK bestimmt.

Hardware

- RP2040-GEEK incl. mitgelieferte Kabel
- seeed Grove - GPS Modul (Air530) incl. mitgelieferte Antenne
- (Powerbank zur Stromversorgung, Einsatz autark im Freien)

Los gehts

Voraussetzung ist der vorhergehende Beitrag zum Anschluss des GPS_Moduls mit den entsprechenden Hinweisen.




Wenn unser Modul Verbindung zu einem Satelliten hergestellt hat, kann die s.g. Weltzeit "UTC"(Coordinated Universal Time) vom Satelliten bezogen werden. Die stimmt im Winterhalbjahr mit der s.g. "GMT"(Greenwich Mean Time) überein. In Europa ist die "MEZ" (Mitteleuropäische Zeit) eine Stunde weiter als GMT, also UTC+1. Da in Großbritannien und in Europa im Sommerhalbjahr die Uhren um eine Stunde vorgestellt werden, ist von März bis Oktober bei uns "UTC/GMT +2". Soviel vorweg, damit Sie nachher die angezeigte Zeit richtig einordnen.

Es folgt der Quelltext für das Programm. Die Zeilen 1 bis 50 sind wie in den vorigen Beispielen und können einfach übernommen werden.

  
  

1  import time
2  import rtc
3  import board
4  import busio
5  import digitalio
6  from fourwire import FourWire
7  from adafruit_display_text import label
8  import terminalio
9  import displayio
10 from adafruit_st7789 import ST7789
11 import adafruit_gps
12
13 # Display initialisieren
14 lcd_cs=board.GP9
15 lcd_dc=board.GP8
16 lcd_reset=board.GP12
17 # Release any resources currently in use for the displays
18 displayio.release_displays()
19 spi = busio.SPI(board.GP10, board.GP11)
20 display_bus = FourWire(spi, command=lcd_dc, chip_select=lcd_cs, reset=lcd_reset)
21 display = ST7789(display_bus, rotation=90, width=240, height=135, rowstart=40, colstart=53)
22 # Make the display context
23 splash = displayio.Group()
24 display.root_group = splash
25
26 # Make a background color fill
27 color_bitmap = displayio.Bitmap(display.width, display.height, 3)
28 color_palette = displayio.Palette(3)
29 color_palette[0] = 0x660088
30 color_palette[1] = 0x000000
31 color_palette[2] = 0xffffff
32 bg_sprite = displayio.TileGrid(color_bitmap, pixel_shader=color_palette, x=0, y=0)
33 splash.append(bg_sprite)
34
35 # Draw a label
36 text_area = label.Label(font=terminalio.FONT, text="" , color=0xFFFF00,
37                         scale=3, line_spacing=1 )
38 text_group = displayio.Group(x=15, y=25)
39 text_group.append(text_area)  # Subgroup for text scaling
40 splash.append(text_group)
41
42 uart = busio.UART(board.GP4, board.GP5, baudrate=9600, timeout=10)
43 # i2c = busio.I2C(board.SCL, board.SDA)
44
45 gps = adafruit_gps.GPS(uart, debug=False)
46 # gps = adafruit_gps.GPS_GtopI2C(i2c, debug=False)  # Use I2C interface
47
48 gps.send_command(b"PMTK314,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0")
49 gps.send_command(b"PMTK220,1000")
50
51 def _format_datetime(datetime):
52     return "{:02}.{:02}.{} {:02}:{:02}:{:02}".format(
53         gps.timestamp_utc.tm_mday,
54         gps.timestamp_utc.tm_mon,
55         gps.timestamp_utc.tm_year,
56         gps.timestamp_utc.tm_hour,
57         gps.timestamp_utc.tm_min,
58         gps.timestamp_utc.tm_sec,
59     )
60
61 def _format_date(datum):
62     return "{:02}.{:02}.{}".format(
63         gps.timestamp_utc.tm_mday,
64         gps.timestamp_utc.tm_mon,
65         gps.timestamp_utc.tm_year,
66     )
67
68 def _format_time(zeit):
69     return "{:02}:{:02}:{:02}".format(
70         gps.timestamp_utc.tm_hour,
71         gps.timestamp_utc.tm_min,
72         gps.timestamp_utc.tm_sec,
73     )
74
75 last_print = time.monotonic()
76
77 while True:
78     gps.update()
79     # Every second print out current time from GPS, RTC and time.localtime()
80     current = time.monotonic()
81     if current - last_print >= 1.0:
82         last_print = current
83         if not gps.timestamp_utc:
84             print("No time data from GPS yet")
85             text_area.text = "  No time\n data from\n  GPS yet"
86             continue
87         else:
88             # Time & date from GPS informations
89             #print("Fix timestamp: {}".format(_format_datetime(gps.timestamp_utc)))
90             datum = _format_date(gps.timestamp_utc)
91             zeit = _format_time(gps.timestamp_utc)
92             text_area.text = "  UTC-time" + "\n " + datum + "\n  " + zeit
  

In den Zeilen 51 bis 59, 61 bis 66 und 68 bis 73 werden Funktionen zur formatierten Rückgabe von Datum und Uhrzeit vom Satelliten definiert. Die Nutzung von time.monotonic() in Zeile 75 ist völlig unabhängig von der zu bestimmenden Uhrzeit. Beim Start des Pico-GEEK beginnt ja der interne Timer (wenn keine Realtime Clock existiert) mit 01.01.2020 um 00:00 Uhr zu zählen und er wird hier nur gebraucht, um die Ausgabe im Sekundentakt zu realisieren. Wenn das Programm gestartet wird, dauert es wieder je nachdem ob ein Warm- oder Kaltstart erfolgte, bis der Satellit 'gefunden' wird. In der Zwischenzeit erscheint auf dem Display die Ausgabe: No time data from GPS yet (Zeile 83 bis 86). Danach wird die 'UTC-Zeit' am Display angezeigt, wie im unteren Bild zu sehen (Zeile 88 bis 92).




Die im Bild gezeigte Ortszeit (in Deutschland) bedeutet also 11:26 Uhr.

viel Spass und Erfolg beim Ausprobieren.