Multifunktionsuhr


auf dem 1.69-Zoll-IPS-LCD-Display
240 x 280 Pixel - RP2350


Anleitung getestet mit CircuitPython 10.0.0




Bildbox 1 (klick hier)




Hardware

- 1,69-Zoll-IPS-LCD-Touch-Display WS-30126 (RP 2350)
- USB-A zu USB-C Kabel

Firmware

- CircuitPython 10.0.0

Um das Aussehen wie in der oberen Bildbox zu realisieren, wird zunächst eine Bitmap-Datei mit 240x280 Pixeln vorbereitet und in einen Ordner 'images' gespeichert. Im Programm wird sie nach der Initialisierung des Displays in den 'main_screen' mit Hilfe der Bibliothek 'imageload' geladen. In gleicher Weise werden die Symbole für die 'Stoppuhr' und den 'Timer' dargestellt. Die Bitmapdateien sowie den Bitmap-Font können Sie von hier herunterladen, entpacken und in das Laufwerk 'CIRCUITPY' kopieren. Wie der Hintergrund und die Symbole angelegt werden, sehen Sie im unteren Kasten.

  
  
background = "/images/background.bmp"
bmp_1 = "/images/stoppuhr.bmp"
bmp_2 = "/images/timer.bmp"

## Background
bg_bitmap,bg_pal = adafruit_imageload.load(background)
bg_tile_grid = displayio.TileGrid(bg_bitmap, pixel_shader=bg_pal)
main_screen.append(bg_tile_grid)
## Stoppuhr
bmp1,bg_pal = adafruit_imageload.load(bmp_1,bitmap=displayio.Bitmap,palette=displayio.Palette)
bg_pal.make_transparent(0)
bg_tile_grid = displayio.TileGrid(bmp1, pixel_shader=bg_pal, x=45,y=185)
main_screen.append(bg_tile_grid)
## Timer
bmp2,bg2_pal = adafruit_imageload.load(bmp_2,bitmap=displayio.Bitmap,palette=displayio.Palette)
bg2_pal.make_transparent(0)
bg2_tile_grid = displayio.TileGrid(bmp2, pixel_shader=bg2_pal, x=135,y=185)
main_screen.append(bg2_tile_grid)
  

In der Displaymitte soll ein Rechteck mit abgerundeten Ecken ('roundrect') später eine Funktion aufrufen. Die Codezeilen zeigen auch dafür, wie das angelegt wird.

  
  
# show the display function area
roundrect_f= RoundRect(40,130,160,40,20,fill=0x009900, outline=0x00ff00)
main_screen.append(roundrect_f)
# the label for the function
updating_label_f = label.Label(font=terminalio.FONT, text="function", scale=2, color=0xffffff, line_spacing=1)
updating_label_f.anchor_point = (0, 0)
updating_label_f.anchored_position = (65, 135)
main_screen.append(updating_label_f)
  

Den Aufruf der 'Stellfunktion', der 'Stoppuhrfunktion' und der 'Timerfunktion' lege ich auf bestimmte Displaybereiche, wie in dem Einführungsbeispiel mit den grünen Rechtecken. Diese Bereiche werden den Displaypositionen zugeordnet, sind aber nicht explizit sichtbar. In der Abbildung (unten) sind sie nur zur Veranschaulichung als durchscheinenden Rechtecke angedeutet:



Die entsprechenden Bereiche, welche abgefragt werden, sind unten zu sehen. Die Abfrage, ob dort eine Berührung erfolgte, ist in der Hauptschleife 'while True:' anzuordnen. Die x- und y-Koordinaten sind mit ausreichender Genauigkeit wie im Bild mit den durchscheinenden Rechtecken gewählt. Wenn Sie das so anordnen, wird bei einem Test, wie im früheren Beispiel, der Bildschirm kurz abgedunkelt. Später soll der Bildschirm nach einer abgelaufenen Zeit ohne Aktion abgedunkelt werden. Deshalb sollen die Funktionen nur im Zustand 'hell' möglich sein. Daher die Variable 'hell=True' bzw. 'hell=False'. Auf das Abdunkeln gehe ich dann noch ein.

  
  
    #
    # Touchberuehrung registrieren
    #
    if touch.touched() :
        x, y = touch.get_point()
        x = 240 - x
        y = 270 - y
        #
        # Functionbereich aufrufen
        #
        if x > 40 and x < 200 and y > 110 and y < 170:
            display.brightness = 0.1
            time.sleep(0.5)
            display.brightness = 0.1
            hell = True
            start = time.monotonic()
        #
        # oberer Bereich fuer Uhrzeit
        #
        if x > 20 and x < 220 and y > 0 and y < 90 and hell == True:
            display.brightness = 0.1
            time.sleep(0.5)
            display.brightness = 0.1
            # zur Stellfunktion
            # set_time()
        #
        # unten links auswaehlen (fuer Stoppuhr)
        #
        if x > 25 and x < 105 and y > 180 and y < 270 and hell == True:
            display.brightness = 0.1
            time.sleep(0.5)
            display.brightness = 0.1
            # zur Stoppuhrfunktion
            # stopuhr_start_stop()
        #
        # unten rechts auswaehlen ( fuer Timer)
        # 
        if x > 135 and x < 215 and y > 180 and y < 270 and hell == True:
            display.brightness = 0.1
            time.sleep(0.5)
            display.brightness = 0.1
            # zur Timerfunktion
            # time()
  

Damit keine Verwirrung entsteht, gebe ich den Quellcode bis hierher im nächsten Kasten noch einmal komplett an. Keine Angst. Wenn Sie ihn in die Thonny-IDE kopieren, sind alle Programmzeilen enthalten. Im Kasten werden nur aus Platzgründen nicht alle Zeilen angezeigt.

  
  
5   import time
6   import board
7   import busio
8   import displayio
9   import terminalio
10  import fourwire
11  from adafruit_st7789 import ST7789
12  import my_cst816d_r
13  from adafruit_bitmap_font import bitmap_font
14  from adafruit_display_text import label
15  from adafruit_display_shapes.roundrect import RoundRect
16  import adafruit_imageload
17  # Touchsensor initialisieren
18  touch = my_cst816d_r.Touch_CST816D(force_high_before_i2c=True)
19  # Bitmapfont nutzen
20  font_file = "fonts/spleen-16x32.bdf"
21  font = bitmap_font.load_font(font_file)
22
23  # Release any resources currently in use for the displays
24  displayio.release_displays()
26  25  cs=board.GP9
27  dc=board.GP8
28  sck=board.GP10
29  mosi=board.GP11
30  reset=board.GP13
31  bl=board.GP25
32  # Release any resources currently in use for the displays
33  displayio.release_displays()
34  spi = busio.SPI(sck, mosi)
35  display_bus = fourwire.FourWire(spi, command=dc, chip_select=cs, reset=reset)
36  display = ST7789(display_bus, rotation=0, width=240, height=320, backlight_pin=bl, rowstart=20, colstart=0)
37  display.brightness = 1
38  # Make the display context
39  main_screen = displayio.Group()
40  display.root_group = main_screen
...
...
114 while True:
...
....
162     #
163     # unten links auswaehlen (fuer Stoppuhr)
164     #
165     if x > 25 and x < 105 and y > 180 and y < 270 and hell == True:
166         stopuhr_start_stop()
167         display.brightness = 0.01
168         time.sleep(0.2)
169         display.brightness = 1
170         time.sleep(0.5)
171     #
172     # unten rechts auswaehlen ( fuer Timer)
173     #
174     if x > 135 and x < 215 and y > 180 and y < 270 and hell == True:
175         timer_start_stop()
176         display.brightness = 0.01
177         time.sleep(0.2)
178         display.brightness = 1
179         time.sleep(0.5)
  

Beim Testen sehen Sie im oberen Bereich die Uhrzeit, den Wochentag und das Datum. Wenn Sie das Display dort kurz antippen, wird es abgedunkelt ('brightness = 0.01') und sofort wieder auf 'brightness = 1' gestellt. Wenn länger als 60 Sekunden keine Aktion erfolgt, schaltet das Display ebenfalls dunkel (Strom sparen). Tippen Sie kurz auf den mittleren Bereich. Dann wird die Helligkeit wieder auf ('brightness = 1') erhöht. Ebenso, wie im oberen Bereich verhält sich das Display beim Tippen auf das Stoppuhr- bzw. Timersymbol. Hier sind die Funktionen stopuhr_start_stop(), timer_start_stop() ebenso wie set_time() bereits angelegt, aber noch leer. Die Bildbox 1 zeigt Ihnen Beispiele, wie diese Funktionen gestaltet werden können.

Wer sich das nicht selbst zutraut, der kann sich im Bereich "DOWNLOAD_UF2" die Anwendung herunterladen, muss sie dann aber so wie angenboten benutzen und kann keine Änderungen daran vornehmen.




Viel Spass und Erfolg beim Ausprobieren.