Thermometer mit 1-wire Temperatursensor DS1820, Raspberry Pi Pico und OLED

Martin Kompf

Raspberry Pi Pico zeigt die mit dem 1-wire Sensor DS1820 gemessene Temperatur auf einem OELD an

Der Raspberry Pi Pico ist ein universell einsetzbarer Mikrocontroller auf Basis des Chips RP2040. Erweitert um einen 1-wire Temperatursensor DS1820 und ein OLED Modul lässt sich damit ein einfaches Thermometer aufbauen. Das Einsteigertutorial erklärt die dafür notwendigen Schritte von der Installation und Programmierung von CircuitPython bis hin zur Verdrahtung und Ansteuerung der Hardware.

Raspberry Pi Pico

1-wire Temperatursensor DS1820

Im Gegensatz zu seinen großen Brüdern Raspberry Pi 3 oder 4 kann man auf dem Pico kein komplettes Betriebssystem wie Linux installieren, sondern er führt eine speziell an den jeweiligen Verwendungszweck angepasste Firmware aus. Auch sind seine Fähigkeiten zur Datenspeicherung und zur Kommunikation mit der Außenwelt eingeschränkt - er besitzt weder Ethernet, WLAN oder Bluetooth.

Das folgende Projekt hat das Ziel, mit dem Pico ein Thermometer zu entwickeln, das die mit einem oder mehreren Sensoren DS1820 gemessenen Temperaturen auf einem kleinen OLED Modul anzeigt. Der Schwerpunkt liegt dabei nicht darauf, am Ende ein komplettes gebrauchsfertiges Gerät inklusive Gehäuse und Stromversorgung zu bauen, sondern auf dem schrittweisen Erlernen der zur Realisierung erforderlichen Kenntnisse in Hard- und Software.

Daher bauen wir das Projekt labormäßig mit Hilfe von Breadboards und Jumperkabeln zusammen. Da dem Raspberry Pi Pico die für die Verwendung auf dem Breadboard erforderlichen Steckerleisten fehlen, muss man diese als erstes nachrüsten. Die folgende Bilderstrecke illustriert dafür die notwendigen Schritte.

Vorbereitung des Pico durch Anlöten von zwei Steckerleisten
Vorbereitung des Pico für den Einsatz im Breadboard: Voraussetzung sind zwei zwanzigpolige Steckerleisten und ein Breadboard (links). Zunächst steckt man die Steckerleisten im richtigen Abstand in das Breadboard (Mitte). Die so fixierten Steckerleisten nehmen dann den Raspberry Pi Pico auf, der im letzten Schritt von oben mit den Leisten verlötet wird (rechts).

Die Entwicklung der Software für den Raspberry Pi Pico findet nicht direkt auf dem Pico, sondern auf einem separaten Entwicklungsrechner (mit Linux, Windows oder Mac OS) statt. Beide sind über ein USB-Kabel verbunden, das die Stromversorgung des Pico übernimmt und über das die Installation der Software erfolgt. An Hardware sind weiterhin ein oder mehrere Temperatursensoren DS1820 sowie ein OLED Modul erforderlich.

Temperatursensor DS1820

1-wire Temperatursensor DS1820

Beim DS18S20 und den verwandten DS18B20 sowie DS1822 handelt es sich um integrierte Schaltkreise im TO-92 Gehäuse, die Temperatursensor, Analog-Digitalwandler und 1-wire Interface enthalten. Die genannten Typen sind Anschluss- und Softwarekompatibel, sie unterscheiden sich im Wesentlichen in der Messgenauigkeit und im Preis. Die drei Anschlüsse (siehe Bild links) sind Masse (GND, Pin 1), Daten (DQ, Pin 2) und Betriebsspannung (VDD, Pin3).

OLED Display

Joyit SBC-OLED01

Zur Anzeige der aktuellen Temperatur soll ein OLED Display dienen. Es gibt eine Vielzahl von Modellen, für das Projekt habe ich das Joyit SBC-OLED01 (erhältlich zum Beispiel bei elv) verwendet. Bei der Verwendung eines OLED Displays sind die Auflösung, das Interface und der eingebaute Controller von Bedeutung. Das Joyit SBC-OLED01 hat eine Auflösung von 128 x 64 Pixel. Der Anschluss an den Pico erfolgt über ein I²C Interface. Wichtig ist der genaue Typ des verwendeten Controllers, hier ist es ein SSD1306. Bei Auswahl eines alternativen Modells sollte man auf eine ähnliche Auflösung, das Vorhandensein eines I²C Interface sowie darauf achten, dass CircuitPython (siehe nächsten Abschnitt) den Controller unterstützt.

CircuitPython installieren

Die Koordination von Temperaturmessung mit dem DS1820 und der Anzeige auf dem OLED Display erfolgt durch ein spezielles Programm, die Firmware, welche auf dem Raspberry Pi Pico läuft. Es gibt diverse Programmiersprachen und Toolkits, um eine solche Firmware zu programmieren und auf dem Pico zu installieren. Das vorliegende Projekt verwendet hierfür CircuitPython von Adafruit. Einerseits sind die Einstiegshürden hier ziemlich gering, insbesondere sind für Erstellung und Installation der Firmware keine spezielle Hard- und Software notwendig. Ein Computer mit USB-Anschluss sowie ein Texteditor reichen zum Einstieg völlig aus. Auf der anderen Seite stellt Adafruit für CircuitPython eine Vielzahl von Modulen zur Unterstützung einer großen Palette von Hardware zur Verfügung.

Am Anfang steht die Installation von CircuitPython auf dem Pico. Die dazu benötigte .UF2 Datei steht auf der Download-Seite zur Verfügung. Zum Zeitpunkt der Erstellung dieses Tutorials war die aktuelle Version 7.1.1 German. Jetzt gibt es mit Sicherheit schon eine neuere Version, mit der sich unser Projekt jedoch auch umsetzen lassen sollte.

Schließen Sie den Raspberry Pi Pico per USB-Kabel an ihren Computer an und halten Sie dabei die Taste BOOTSEL gedrückt! Es erscheint nun das Laufwerk RPI-RP2 auf dem Computer. Kopieren Sie die heruntergeladene .UF2 Datei dorthin. Auf meinem Entwicklungsrechner läuft Linux, das Kopieren der Datei erfolgt dort ganz einfach per

cp adafruit-circuitpython-raspberry_pi_pico-de_DE-7.1.1.uf2 /media/$HOME/RPI-RP2/

Nach Abschluss der Installation bootet der Pico neu und es taucht das Laufwerk CIRCUITPY auf dem Computer auf. Im Dateiexplorer beziehungsweise unter Linux mittels

ls /media/$HOME/CIRCUITPY/

sieht man jetzt die beiden Dateien boot_out.txt und code.py. Das ist ein Hinweis, dass die Installation von CircuitPython erfolgreich war.

Interaktion mittels REPL

Für weitere Test der Funktionalität und zum Kennenlernen von CircuitPython auf dem Pico sollten Sie jetzt REPL (Read-Evaluate-Print-Loop) ausprobieren. Dazu ist eine serielle Verbindung über USB zum Pico erforderlich, die wiederum ein Terminalprogramm und die Kenntnis des vom Pico belegten seriellen Ports voraussetzt. Unter Linux ist der serielle Port in der Regel /dev/ttyACM0 und es steht eine reiche Auswahl an Terminalprogrammen zur Verfügung, zum Beispiel screen oder minicom. Die Verbindung zum Pico gelingt dann mittels:

screen /dev/ttyACM0
# oder
minicom -o -D /dev/ttyACM0

Unter Windows verwendet man zum Beispiel Putty oder eine Komplettlösung wie den Mu-Editor.

Nachdem das Terminalprogramm die Verbindung mit dem Pico hergestellt hat, sollte man zunächst mittels Strg-C ein eventuell laufendes Programm unterbrechen. Dann meldet sich der Pico mit


Drücke eine beliebige Taste um REPL zu betreten. Drücke STRG-D zum neuladen.

Folgen Sie den Anweisungen und es erscheint der REPL Prompt, zum Beispiel


Adafruit CircuitPython 7.1.1 on 2022-01-14; Raspberry Pi Pico with rp2040
>>>

REPL akzeptiert beliebige Python Befehle als Eingabe und gibt das Ergebnis sofort aus. Die folgenden Kommandos geben die Liste der installierten Python-Module und die verfügbaren Anschlüsse des Pico aus:

help("modules")
import board
dir(board)

OLED ansteuern

Im nächsten Schritt erfolgt die Verbindung des OLED Moduls mit dem Pico sowie eine kurze Funktionsüberprüfung mit einem Python-Programm.

Das OLED-Modul hat vier Anschlüsse. GND ist das Bezugspotential (Masse) und gehört an einen der GND Anschlüsse des Pico. Der Raspberry Pi Pico stellt an seinem VCC Anschluss eine stabilisierte Versorgungsspannung von 3,3 Volt bereit, die verbunden mit VCC der OLED deren Stromversorgung sicherstellt. Die Ansteuerung der OLED erfolgt über einen I²C Bus mit den zwei Signalen SDA (Daten) und SCL (Takt). Der Pico RP2040 hat zwei eingebaute identische I²C Controller. Die externen SDA und SCL Pins jedes Controllers können per Software mit verschiedenen GPIO Pins verbunden werden, jedoch ist nicht jede beliebige Kombination möglich. Das offizielle Raspberry Pi Pico Pinout zeigt die möglichen Kombinationen:

Raspberry Pi Pico Pinout
Raspberry Pi Pico Pinout
© 2012-2022 Raspberry Pi Ltd licensed under a Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA) licence

Für das Projekt verwenden wir I2C0 an den Pins 1 und 2 (GP0 und GP1). Die folgende Tabelle fasst die erforderliche Verdrahtung noch einmal zusammen, die Abbildung zeigt den Stromlaufplan.

OLED Pico Signal Pico PIN
GND GND 38
VCC V3 36
SCL I2C0 SCL / GP1 2
SDA I2C0 SDA / GP0 1
Stromlaufplan Pico und OLED
Stromlaufplan für die Verbindung von OLED und Raspberry Pi Pico

Nach dem Start führt der Raspberry Pi Pico das in der Datei code.py stehende Programm aus. Es ist natürlich möglich, diese Datei mit einen Editor direkt auf dem CIRCUITPY Laufwerk zu editieren. Die Firmware des Pico beobachtet diese Datei und startet die Programmausführung erneut, wenn sich ihr Inhalt ändert. Ich habe mir allerdings angewöhnt, code.py nicht direkt auf dem Pico zu bearbeiten, sondern mit einer Kopie auf dem Entwicklungsrechner zu arbeiten. So habe ich immer eine Sicherheitskopie des Codes zur Verfügung und kann Änderungen mit einem Versionskontrollsystem wie git nachverfolgen. Zum Testen des Programms muss dieses nur noch auf das CIRCUITPY Laufwerk kopiert werden, unter Linux gelingt dies ganz leicht mittels

cp code.py /media/$USER/CIRCUITPY/ && sync

Diesen Ablauf wollen wir mit einen kleinen Testprogramm ausprobieren. Dazu schreiben wir den folgenden Programmcode in die Datei code.py und kopieren sie auf das CIRCUITPY Laufwerk.

import busio
import board

i2c = busio.I2C(board.GP1, board.GP0)
i2c.try_lock()
print(i2c.scan())
i2c.unlock()
i2c.deinit()

Das Programm führt einen Scan des I²C Bus aus und gibt das Ergebnis per print aus. Um diese Ausgabe zu sehen, müssen wir wie oben beschrieben ein Terminalprogramm für den REPL starten. Der interessanteste Teil des Programms ist die Initialisierung des I²C Bus mittels i2c = busio.I2C(board.GP1, board.GP0), denn hier wird festgelegt, welche Anschlüsse des Pico als SCL und SDA Signal des I²C Bus dienen.

Wenn das OLED Board korrekt verdrahtet ist und code.py keinen Fehler enthält, sollte man nun die Ausgabe [60] sehen. Das ist die I²C Adresse des OLED Moduls, sie stimmt mit der im Datenblatt aufgeführten überein, wobei sie dort in hexadezimaler Notation 3C aufgeführt ist.

Libraries übernehmen die Arbeit

Als nächster Schritt soll das OLED Display einen einfachen Text anzeigen. Das dient zum einen zur weiteren Funktionsüberprüfung des Displays und zum anderen zur Übung des Umgangs mit Libraries.

Libraries befreien von der Notwendigkeit, sich mit Tiefen der I²C Kommunikation oder der Umwandlung von Text in Pixel befassen zu müssen. Eine Stärke gerade von CircuitPython ist die Verfügbarkeit einer Vielzahl von Libraries zur Ansteuerung diverser Hardware und zur Erledigung von Standardaufgaben. Vor ihrem Einsatz sind allerdings diverse Hürden zu nehmen: Zum einen muss man in Erfahrung bringen, welche Libraries für den konkreten Einsatzzweck zu verwenden sind. Diese Libraries müssen dann noch - inklusive eventueller Abhängigkeiten - auf den Pico kopiert werden.

Zunächst lädt man das zur installierten CircuitPython Version passende Library Bundle von der CircuitPython Seite herunter (als Zip-Datei) und entpackt es auf dem Entwicklungsrechner. Ein direktes Entpacken auf dem Pico wird aufgrund seiner Größe scheitern! Es gibt mehrere Zip-Dateien: Für die Installation auf dem Pico vorgesehen ist das Bundle mit -mpy- im Dateinamen, zum Zeitpunkt der Erstellung des Artikels war das adafruit-circuitpython-bundle-7.x-mpy-20220128.zip. Die anderen Dateien enthalten Beispiele und den kompletten Sourcecode der Libraries. Ein Download lohnt sich auf jeden Fall für tieferes Verständnis der Arbeitsweise.

Die sehr umfangreiche Dokumentation der Libraries erreicht man unter

Zur Installation einer Library muss diese aus dem lib Verzeichnis des mpy Bundles in das lib Verzeichnis auf dem CIRCUITPY Verzeichnis kopiert werden. Falls es lib noch nicht auf CIRCUITPY gibt, dann ist jetzt ein guter Zeitpunkt, das Verzeichnis anzulegen! Bei einem Blick in das lib Verzeichnis des mpy Bundles fällt auf, das Libraries in zwei Formen vorkommen. Zum einen als einzelne .mpy Datei: Dann ist nur diese eine Datei auf den Pico zu kopieren; und zum anderen als Verzeichnis. Dann gehört das komplette Verzeichnis nach CIRCUITPY/lib kopiert!

Für unseren Anwendungsfall benötigen wir zwei Libraries: adafruit_display_text kümmert sich um die Ausgabe von Text auf grafischen Displays. Sie benötigt eine für das jeweilige Display spezifische Helper-Library. Mein Display hat den Controller SSD1306 - die hierzu passende Library ist adafruit_displayio_ssd1306.mpy. Wenn Ihr OLED Display einen anderen Controller hat, dann wählen Sie eine andere Library aus, zum Beispiel adafruit_displayio_ssd1305.mpy für den SSD1305.

Die Installation beider Libraries erfolgt nun durch Kopieren auf den Pico - wie erwähnt beachte man, dass es sich einmal um eine einzelne Datei und einmal um ein komplettes Verzeichnis handelt! Unter Linux gelingt das problemlos durch die Verwendung der Option -r für das cp Kommando:

cd adafruit-circuitpython-bundle-7.x-mpy-20220128/lib
cp -r adafruit_display_text /media/$USER/CIRCUITPY/lib/
cp adafruit_displayio_ssd1306.mpy /media/$USER/CIRCUITPY/lib/

Als letzten Schritt erstellen wir die Datei code.py mit dem folgenden Inhalt und kopieren sie auf den Pico.

import board
import busio
import displayio
import terminalio
from adafruit_display_text import label
import adafruit_displayio_ssd1306

displayio.release_displays()

# Init I2C bus
i2c = busio.I2C(board.GP1, board.GP0)
display_bus = displayio.I2CDisplay(i2c, device_address=60)

# Dimensions of display
WIDTH = 128
HEIGHT = 64

# Init display
display = adafruit_displayio_ssd1306.SSD1306(display_bus, width=WIDTH, height=HEIGHT)

# Draw a label with text
text = "Hello Pico!"
text_area = label.Label(
    terminalio.FONT, text=text, color=0xFFFFFF, x=28, y=HEIGHT//2-1
)
display.show(text_area)

while True:
    pass
Aufbau Pico und OLED
Der Aufbau der ersten Etappe der Projekts erlaubt die Ausgabe von Text auf der angeschlossenen OLED

Das Programm importiert als erstes die notwendigen Libraries. Neben den bereits erwähnten und händisch installierten adafruit_display_text und adafruit_displayio_ssd1306 tauchen hier noch andere Libraries auf, zum Beispiel board, busio und displayio. Dabei handelt es sich um in CircuitPython fest eingebaute Libraries. Sie benötigen keine zusätzliche Installation, erfordern jedoch ein explizites import Statement.

Danach erfolgt die Initialisierung des I²C Bus. Dabei sind die für den Bus verwendeten Anschlüsse am Pico (GP0 und GP1) sowie die I²C Adresse des Displays (60) zu übergeben. Die folgende Einrichtung des Displays ist spezifisch für den OLED Controller (SSD1306) und bekommt die Größe der Anzeige in Pixeln als Parameter. Bei Verwendung eines anderen Displays müssen Sie diese Programmzeilen entsprechend anpassen!

Damit ist die Hardware initialisiert und es erfolgt die Ausgabe einer einzelnen Textzeile. Beeinflussbar sind hierbei Position, Farbe und Font des Textes. Da nach der Ausgabe nichts weiter zu tun ist, geht des Programm abschließend in eine Endlosschleife.

1-wire Temperatursensor anschließen

Nach der erfolgreichen Inbetriebnahme des OLED Displays geht es nun an die Ansteuerung des Temperatursensors DS1820. Die Bezeichnung 1-wire ist etwas irreführend, es braucht mindestens noch einen zweiten Draht für das Bezugspotential GND. Dann hat man einen Aufbau mit parasitärer Stromversorgung - der wire überträgt dann sowohl die Betriebsspannung als auch die Daten. Betriebsspannung und Daten lassen sich aber auch separat verschalten, das führt dann zu einer aktiven Versorgung und einer Verbindung mit drei Drähten. Die Vor- und Nachteile der beiden Varianten sind in 1-wire Temperatursensor DS1820 am Raspberry Pi (GPIO-direkt) ausführlich dargestellt.

Für den aktuellen Versuchsaufbau entscheiden wir uns für die aktive Speisung des DS1820, die notwendige Verdrahtung entnehme man der folgenden Tabelle beziehungsweise dem Stromlaufplan. Das 1-wire Datensignal des DS1820 kann dabei prinzipiell jeder freie GPIO Anschluss verarbeiten, die Zuweisung des konkreten Pins erfolgt später in der Software. Für den sicheren Betrieb des 1-wire Bus empfiehlt sich weiterhin ein Pull-Up Widerstand von 3,3 k zwischen VCC und DQ. Mehrere DS1820 lassen sich an einem 1-wire Bus ohne weitere Bauteile parallel betreiben. Jeder Sensor besitzt eine während des Herstellungsprozesses eingebaute eindeutige Seriennummer zur Identifikation, die CircuitPython auslesen und damit die Sensoren unterscheiden kann.

DS1820 Pico Signal Pico PIN
GND GND 38
VCC 3V3 36
DQ GP16 21
Stromlaufplan Pico, OLED und DS1820
Stromlaufplan für die Verbindung von OLED, DS1820 und Raspberry Pi Pico

Software für die Temperaturmessung

Auch für die Ansteuerung des DS1820 finden sich passende Libraries im Adafruit Library Bundle: adafruit_onewire kümmert sich um die Ansteuerung des 1-wire Bus und adafruit_ds18x20 enthält den für das Auslesen der Temperatur aus dem DS1820 notwendigen Code. Die OLED Ansteuerung übernehmen wie bisher adafruit_displayio_ssd1306 und adafruit_display_text. Außerdem kommt noch adafruit_simple_text_display zum Einsatz, diese Library vereinfacht die Ausgabe von mehrzeiligem Text auf dem Display.

Kopieren Sie nun die Libraries vom Adafruit Bundle in das lib Verzeichnis des Pico! Dabei ist wie schon beschrieben zu beachten, dass einige Libraries als einzelne .mpy Datei vorliegen und andere wiederum das Kopieren eines kompletten Verzeichnisses erfordern.

Im letzten Schritt ist nun code.py um das Auslesen des DS1820 Sensors und der Ausgabe der Temperatur auf dem Display zu erweitern. Das folgende Listing enthält den kompletten Code:

from time import sleep
import board
import busio
import displayio
import adafruit_displayio_ssd1306
from adafruit_simple_text_display import SimpleTextDisplay
from adafruit_onewire.bus import OneWireBus
from adafruit_ds18x20 import DS18X20

displayio.release_displays()

# Init I2C bus
i2c = busio.I2C(board.GP1, board.GP0)
display_bus = displayio.I2CDisplay(i2c, device_address=60)

# Dimensions of display
WIDTH = 128
HEIGHT = 64

# Init display
display = adafruit_displayio_ssd1306.SSD1306(display_bus, width=WIDTH, height=HEIGHT)
text_display = SimpleTextDisplay(display=display, colors=(SimpleTextDisplay.WHITE,))

# Scan 1-wire bus
ow_bus = OneWireBus(board.GP16)
devices = ow_bus.scan()

while True:
    # Display serial number and temperature for each sensor
    for i, d in enumerate(devices):
        sn = "".join('{:02x}'.format(x) for x in d.serial_number[0:4])
        ds18 = DS18X20(ow_bus, d)
        text_display[i].text = "{} {:5.1f} C".format(sn, ds18.temperature)
    text_display.show()
    sleep(1)

Am Anfang steht wie gehabt der Import der benötigten Libraries und die Initialisierung des OLED Displays. Anschließend erfolgt ein Scan des 1-wire Bus, dabei ist der verwendete Anschluss am Pico (GP16) zu übergeben. Das Programm ist darauf vorbereitet, dass mehrere parallel geschaltete Sensoren am 1-wire Bus vorhanden sind. Die for Schleife iteriert über alle beim Scan gefundenen Sensoren und gibt deren Seriennummer und die gemessene Temperatur aus.

Die beiden format Anweisungen übernehmen dabei die Aufbereitung der Sensordaten in ein lesbares Format und SimpleTextDisplay kümmert sich um die zeilenweise Ausgabe. Die umschließende while True Schleife kombiniert mit sleep führt zur endlosen Wiederholung von Temperaturmessung und Ausgabe im Sekundenintervall.

Musteraufbau Pico, DS1820 und OLED
Der Raspberry Pi Pico gibt die von drei DS1820 Sensoren gemessenen Temperaturen auf dem OLED Display aus

Verschönerungen

Das bisher verwendete Ausgabeformat ist informativ, aber etwas schmucklos. Die Ausgabe einer Bezeichnung des Sensors (wie Außentemperatur oder Keller) anstelle der Seriennummer käme den Anwendern sicher sehr entgegen. Das Programmieren der dazu notwendigen Logik (zum Beispiel mit Hilfe eines Dictionaries) ist Standard-Python und eine schöne Übungsaufgabe.

CircuitPython spezifisch ist dagegen das Vorgehen zur Erhöhung der Lesbarkeit. Wenn zum Beispiel nur ein einziger Sensor angeschlossen ist, dann ist die Ausgabe der Seriennummer überflüssig. Dazu ändert man die entsprechende Programmzeile in

        text_display[i].text = "{:5.1f}".format(ds18.temperature)

Zur Vergrößerung der Schrift taugt im ersten Versuch der Parameter text_scale bei der Konstruktion von text_display:

text_display = SimpleTextDisplay(display=display, text_scale=4, colors=(SimpleTextDisplay.WHITE,))
Pixeliger Terminalfont auf OLED
Das simple Hochskalieren des eingebauten Fonts führt zu einer pixeligen Darstellung

Das Ergebnis ist aus größerer Entfernung deutlich besser lesbar, wirkt aber sehr pixelig. Der Algorithmus verwendet offenbar nach wie vor den gleichen eingebauten Terminal Font und skaliert ihn pixelweise.

Bessere Ergebnisse würde die Verwendung eines TrueType oder OpenType Fonts liefern, die auf beliebige Displaygrößen skalierbar sind. Solche Fonts kann CircuitPython allerdings noch nicht direkt verarbeiten, sondern es ist auf Pixelfonts im bdf oder pcf Format angewiesen. Der Weg führt daher über die vorgeschaltete Konvertierung eines OpenType otf Fonts in das bdf Format. Die dabei erzeugte Datei gehört auf den Raspberry Pi Pico, als Ablageort empfiehlt sich das Verzeichnis fonts auf dem CIRCUITPY Laufwerk.

Auf einem Linux Betriebssystem kann die Konvertierung einfach mit dem Kommando otf2bdf erfolgen. Man benötigt nun noch einen geeigneten OpenType Font - mir gefällt Manjari sehr gut - und muss sich bei der Konvertierung auf die Größe des Pixelfonts festlegen:

# Vorbereitung
sudo apt install fonts-smc-manjari otf2bdf
mkdir /media/$USER/CIRCUITPY/fonts

# Konvertierung
otf2bdf /usr/share/fonts/opentype/malayalam/Manjari-Bold.otf -p 32 -o Manjari-Bold-32.bdf

# Font installieren auf dem Pico
cp Manjari-Bold-32.bdf /media/$USER/CIRCUITPY/fonts

Für das Laden des Fonts ist die Installation der zusätzlichen Library adafruit_bitmap_font erforderlich. Weiterhin ist code.py um das passende import Statement, das Laden des Fonts und die geänderte Konstruktion von text_display mit dem Parameter font zu erweitern:

from adafruit_bitmap_font import bitmap_font

font = bitmap_font.load_font("/fonts/Manjari-Bold-32.bdf")
text_display = SimpleTextDisplay(display=display, font=font, colors=(SimpleTextDisplay.WHITE,))
Aus Truetype abgeleiteter Font auf OLED
Die Verwendung eines aus TrueType erzeugten und auf die Größe des Display angepassten Fonts erzeugt ein deutlich besseres Bild

Nach dem Neustart produziert das Programm nun eine gut lesbare Ausgabe der aktuellen Temperatur in Schönschrift.

Eine Erweiterung des Projektes in verschiedene Richtungen ist möglich. So kann man die Anzeige insbesondere bei der Verwendung mehrerer Sensoren weiter verbessern. Für den Dauereinsatz empfiehlt sich anstelle des fliegenden Aufbaus auf Breadboards das Verlöten der Komponenten auf einer Universalplatine und der Einbau in ein Gehäuse.

Nicht so gut geeignet ist die verwendete Pico Plattform für die kontinuierliche Erfassung und Speicherung der Messwerte über eine längere Zeit, zum Beispiel für statistische Auswertungen. Hier sind die großen Brüder des Pico - Raspberry Pi 2, 3 oder 4 - besser geeignet. Wie man daran einen DS1820 anschließt und eine Wetterstation mit Datenbank aufbaut, erklären die Artikel 1-wire Temperatursensor DS1820 am Raspberry Pi (GPIO-direkt) und Temperaturmessung mit dem Raspberry Pi und dem 1-wire Temperatursensor DS1820 (USB-seriell).