Raspi-Linear-Uhr - Programmierung/Implementierung der Endlosschleife

Da jede Säule der Uhr aus einheitlichen Blöcken besteht, liegt es nahe, für einen Block ein eigenes Objekt zu definieren. Wir tun dies in der Klasse CClkBlock, der wir auch gleich eine Enable-Methode mitgeben, über die der Block ein- und ausgeschaltet werden kann. Ein-/Ausschalten heißt, dass wir den Block in entsprechenden Farben zeichnen wollen. Hierzu benötigen wir eine sogenannte Leinwand (canvas), die Koordinaten (top, left) und die Enabled-Farbe (fillcolor). Diese Daten übergeben wird der Klasse im Konstruktor. Fixe Werte wie Breite, Höhe und Disabled-Farbe definieren wir als interne Konstanten.

Stellenmarkt
  1. Beraterinnen / Berater (w/m/d) für den Bereich "Informationssicherheitsbera- tung für den ... (m/w/d)
    Bundesamt für Sicherheit in der Informationstechnik (BSI), Bonn
  2. Projektleiter (w/m/d) im Bereich Breitbandinfrastruktur
    RBS wave GmbH, Stuttgart, Ettlingen
Detailsuche

Ähnliche Überlegungen stellen wir zu den Zeitsäulen an. Bei diesen sind Eigenschaften und Verhalten ebenfalls vergleichbar. Die Säulen bestehen aus Einer- und Zehner-Blöcken, von denen wir je nach demjenigen Zeitanteil, den sie repräsentieren, einige aktivieren beziehungsweise deaktivieren.

Wir implementieren also zunächst eine Basisklasse CClkBaseColumn, die die gemeinsamen Eigenschaften mitbringt. Diese Klasse wird abstrakt deklariert, da sie selbst nur zum Vererben gedacht ist und keine eigenen Instanzen erzeugen soll. Die Klasse erhält auch die public-Methode namens Show, der wir als Parameter diejenige Stunde, Minute bzw. Sekunde übergeben, die die betreffende Säule anzeigen soll. Alle drei Säulen leiten von dieser Basisklasse ab.

  • Openweather-Icons zur Einbindung in eigene Apps oder Webseiten (Bild: Openweather)
  • Beispiel für ein Openweather-Resultset im JSON-Format (Screenshot: Michael Bröde)
  • UML-Schema der für Openweather zuständigen Klassen (Screenshot: Michael Bröde)
  • Für das Projekt aufbereitete Wetterdaten im CSV-Format (Screenshot: Michael Bröde)
  • Koordinaten und Bedeutung der einzelnen Linear-Uhr-Blöcke (Screenshot: Michael Bröde)
  • Beispiel für die Zeitermittlung anhand der aktiven Linear-Uhr-Blöcke (Screenshot: Michael Bröde)
  • UML-Schema der für die Linear-Uhr zuständigen Klassen (Screenshot: Michael Bröde)
  • Koordinaten der Blöcke für die Anzeige der Temperatur (Screenshot: Michael Bröde)
  • Beispiel für die Anzeige des Verlaufs der Temperatur in den nächsten zwölf Stunden (Bild: Michael Bröde)
  • Durch eigene Daten erweiterte Liste der Openweather-IDs (Screenshot: Michael Bröde)
  • Koordinaten der Blöcke für die Anzeige von Bewölkung und Niederschlag (Screenshot: Michael Bröde)
  • Beispiel für die Anzeige des Bewölkungs- und Niederschlagverlaufs in den nächsten zwölf Stunden (Screenshot: Michael Bröde)
  • Koordinaten der Blöcke für die Anzeige des Windstärke (Screenshot: Michael Bröde)
  • Beispiel für die Anzeige des Verlaufs der Windstärken in den nächsten zwölf Stunden (Bild: Michael Bröde)
  • Beispiel für die Anzeige der Min/Max-Wetter-Werte der nächsten zwölf Stunden (Bild: Michael Bröde)
  • Idee für eine Vorschau auf den Wetterverlauf der nächsten sieben Tage (Screenshot: Michael Bröde)
UML-Schema der für die Linear-Uhr zuständigen Klassen (Screenshot: Michael Bröde)

Unsere Raspi-Linear-Uhr ist damit definiert. Die drei Säulen werden im Konstruktor der Wetter-Uhr, der Klasse CwetterUhr, instanziiert. Nun müssen wir sie nur noch anzeigen. Das geschieht in der bereits erwähnten Endlosschleife. Diese weisen wir mit einem for-Statement an. Da wir keinen Schleifenzähler brauchen, geben wir auch keine for-Parameter mit. Innerhalb der Schleife führen wir folgende Schritte aus:

Golem Karrierewelt
  1. AZ-500 Microsoft Azure Security Technologies (AZ-500T00): virtueller Vier-Tage-Workshop
    28.11.-01.12.2022, virtuell
  2. Hands-on C# Programmierung: virtueller Zwei-Tage-Workshop
    08./09.11.2022, virtuell
Weitere IT-Trainings

  • Zeiteinheiten bestimmen, d.h. Stunden-, Minuten- und Sekunden-Variablen belegen
  • Wetterdaten für die vier Bildschirme bestimmen
  • LED-Panel initialisieren. Dies löscht alle vorherigen Anzeigen.
  • Wetterdaten zeichnen. Details dazu siehe unten
  • Uhrzeit zeichnen. Wir rufen die Show-Methode jeder Zeit-Säule auf und übergeben den jeweiligen Zeitwert als Parameter.
  • Gezeichnete Objekte auf der LED-Panel-Leinwand ausgeben. Bislang haben wir nur in ein virtuelles Bitmap gemalt. Mit der Methode SwapOnVsync übertragen wir das Bitmap auf das LED-Panel. Erst dadurch werden die Objekte sichtbar.
  • Millisekunden warten. Da der Raspberry nicht durchgehend laufen muss, gönnen wir ihm bei jedem Schleifenzyklus eine kleine Verschnaufpause. Diese sollte jedoch deutlich kleiner sein als eine Sekunde, damit es bei der Arbeit, die er in der Schleife zu verrichten hat, nicht zum "Verschlucken" von Sekunden kommt.

Abschließend konstatieren wir an dieser Stelle: Durch eine geschickte Klassen-Architektur haben wir die Anzeige der Uhrzeit mit weniger als 200 Zeilen Programmcode implementiert. Dies lässt sich so im nächsten Schritt bei der Wetteranzeige leider nicht realisieren. Hier liegt der Programmierschwerpunkt auf der Darstellung der verschiedenen Wetterdaten, respektive deren Umsetzung in Formen, Farben und x-/y-Koordinaten.

Wetteranzeige - Gemeinsamkeiten der vier Bildschirmseiten

Da ist zunächst die Frage, welchen Font wir verwenden können. Er soll möglichst nicht viel Platz in Anspruch nehmen, aber trotzdem gut lesbar sein. Wir probieren diverse Fonts aus der LED-Panel-Bibliothek und entscheiden uns für einen Font namens 5x8.bdf. Trotzdem verwenden wir an vielen Stellen nur große Buchstaben, weil die kleinen gelegentlich nicht gut aussehen.

Als erstes setzen wir auf jeder Seite die Überschrift. Die Texte sind verschieden lang und werden für jeden Bildschirm auf einer eigenen x-Koordinate positioniert, y ist überall gleich.

Raspberry Pi: Das umfassende Handbuch. Über 1.000 Seiten in Farbe. Mit Einstieg in Linux, Python und Elektrotechnik. Aktuell zum Raspberry Pi 4

Mit Ausnahme des Summary-Bildschirms stellen wir in den zwei Zeilen darunter den Anfangs- und Endwert des jeweiligen Wetterwertes mit der dazugehörigen Uhrzeit dar. Da unsere Vorschau aus zwölf Stunden besteht und die Werte ab der jeweils angegebenen Stunde gelten, ist die Differenz aus End- und Anfangszeit elf.

Auch bei diesen beiden Zeilen ist die y-Position auf allen Seiten identisch, wohingegen x in Abhängigkeit von der Länge des Textes variiert. Gelegentlich verbleibt nicht viel Platz, so dass wir z. B. bei der Temperatur in der Angabe der Einheit auf das C von Grad Celsius verzichten.

Für die Diagramme haben wir in der Höhe einen Platz von maximal 36 Pixeln. Diese verwenden wir in einem zu den jeweiligen Zahlenwerten passenden Maßstab. In der x-Richtung haben wir 46 Pixel, in die ideal zwölf Säulen und elf Zwischenräume mit jeweils zwei Pixeln Breite hineinpassen.

Das Koordinatensystem des LED-Panels liegt in der Ecke links oben, die x-Achse zeigt nach rechts, die y-Achse nach unten. Das oberste linke Pixel hat die Koordinaten (0,0). Die Nulllinie bzw. der untere Bezugspunkt der Diagramme liegt gleichauf mit der Basis der Zeitsäulen bei y=57.

Am unteren Bildschirmrand positionieren wir vier Blöcke als sogenannte Pagemarker, wobei jede Bildschirmseite bei ihrer Anzeige den zugehörigen Block aktiviert.

Bitte aktivieren Sie Javascript.
Oder nutzen Sie das Golem-pur-Angebot
und lesen Golem.de
  • ohne Werbung
  • mit ausgeschaltetem Javascript
  • mit RSS-Volltext-Feed
 Wetter-Uhr - AnzeigekonzeptDie vier Seiten der Wetteranzeige einrichten 
  1.  
  2. 1
  3. 2
  4. 3
  5. 4
  6. 5
  7. 6
  8. 7
  9. 8
  10.  


mbroede 22. Aug 2022 / Themenstart

Hallo Kastenbrot, ich gebe Dir recht: Windows Forms, WPF o.ä. unter Linux nur wenn man...

OutOfCoffee 19. Aug 2022 / Themenstart

Flaschenhals? Willst Du die Daten alle paar Millisekunden abfragen? Das Wetter scheint...

Paramus 18. Aug 2022 / Themenstart

... sind genau was man momentan braucht - aber immerhin kann man mit dem Ding im...

landfuerst 18. Aug 2022 / Themenstart

Wenn du deine Wettervorhersage selber berechnen willst, mit ähnlichem Umfang, wirst du...

Kommentieren



Aktuell auf der Startseite von Golem.de
Cloudgaming
Google Stadia scheiterte nur an sich selbst

Die Technik war nicht das Problem von Alphabets ambitioniertem Cloudgaming-Dienst. Das Problem liegt bei Google. Ein Nachruf.
Eine Analyse von Daniel Ziegener

Cloudgaming: Google Stadia scheiterte nur an sich selbst
Artikel
  1. Tiktok-Video: Witz über große Brüste kostet Apple-Manager den Job
    Tiktok-Video
    Witz über große Brüste kostet Apple-Manager den Job

    Er befummle von Berufs wegen großbrüstige Frauen, hatte ein Apple Vice President bei Tiktok gewitzelt. Das kostete ihn den Job.

  2. Copilot, Java, RISC-V, Javascript, Tor: KI macht produktiver und Rust gewinnt wichtige Unterstützer
    Copilot, Java, RISC-V, Javascript, Tor
    KI macht produktiver und Rust gewinnt wichtige Unterstützer

    Dev-Update Die Diskussion um die kommerzielle Verwertbarkeit von Open Source erreicht Akka und Apache Flink, OpenAI macht Spracherkennung, Facebook hilft Javascript-Enwicklern und Rust wird immer siegreicher.
    Von Sebastian Grüner

  3. Vantage Towers: 1&1 Mobilfunk gibt Vodafone die Schuld an spätem Start
    Vantage Towers
    1&1 Mobilfunk gibt Vodafone die Schuld an spätem Start

    Einige Wochen hat es gedauert, bis 1&1 Mobilfunk eine klare Schuldzuweisung gemacht hat. Doch Vantage Towers verteidigt seine Position im Gespräch mit Golem.de.

Du willst dich mit Golem.de beruflich verändern oder weiterbilden?
Zum Stellenmarkt
Zur Akademie
Zum Coaching
  • Schnäppchen, Rabatte und Top-Angebote
    Die besten Deals des Tages
    Daily Deals • LG OLED TV 2022 65" 120 Hz 1.799€ • ASRock Mainboard f. Ryzen 7000 319€ • MindStar (G.Skill DDR5-6000 32GB 299€, Mega Fastro SSD 2TB 135€) • Alternate (G.Skill DDR5-6000 32GB 219,90€) • Xbox Series S + FIFA 23 259€ • PCGH-Ratgeber-PC 3000€ Radeon Edition 2.500€ [Werbung]
    •  /