Projekt: Temperatur-Anzeige

In den letzten Lektionen haben wir schon viel gelernt. Deswegen geht es jetzt erstmal an ein richtiges kleines Projekt. Unser Ziel ist es, mit dem Display und dem Temperatursensor eine eigene kleine Uhr zu bauen, die uns die Uhrzeit, das Datum und die Temperatur anzeigt.

Zuvor hast du ja schon gelernt, wie du die Temperatur von dem Sensor auslesen kannst und wie sich Display ansprechen lässt. Jetzt wollen wir die beidne Scripte zusammenbringen.

Dazu müssen wir zunächst wie gewohnt alle benötigten Bibliotheken einbinden.

import board, digitalio, glob, time
from PIL import Image, ImageDraw, ImageFont
import adafruit_ssd1306

Jetzt müssen wir noch den Sensor und das Display initialisieren:

RESET_PIN = digitalio.DigitalInOut(board.D4)
i2c = board.I2C()
oled = adafruit_ssd1306.SSD1306_I2C(128, 64, i2c,
    addr=0x3C, reset=RESET_PIN)

font = ImageFont.truetype(
    "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", 28)
font2 = ImageFont.truetype(
    "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", 14)

path = "/sys/bus/w1/devices/"
sensor_path = glob.glob(path + "28*")[0]
sensor_data_path = sensor_path + "/w1_slave"

Darauf binden wir die beiden Funktionen read_temperature() und get_temperature_in_degree() aus dem vorherigen Script ein.

Jetzt können wir auch schon mit dem eigentlichen Teil anfangen. Dazu überschreiben wir zunächst das Display wieder mit leerem Inhalt:

oled.fill(0)
oled.show()

Da sich die Temperatur auf dem Display immer selbst aktualisieren soll, kommt alles, was jetzt folgt, in eine Schleife: while True:. Achte darauf, dass du alles, was in die Schleife gehört einrückst.

Den nächste Teil sollte dir auch schon bekannt vorkommen:

  image = Image.new("1", (oled.width, oled.height))
  draw = ImageDraw.Draw(image)

  draw.text((0, 0), "Temperatur:", font=font2, fill=255)
  draw.text((0, 30), str(get_temperature_in_degree())+"°C",
      font=font, fill=255)

Hier erstellen wir wieder ein leeres Bild, in welches wir den anzuzeigenden Text schreiben. Wie du siehst, wird in der letzten Zeile auch die Funktion get_temperature_in_degree() ausgeführt. Damit nicht einfach nur eine Zahl auf dem Display steht, fügen wir noch eine Einheit dem String hinzu: +"°C".
Jetzt müssen wir das Bild nur noch anzeigen lassen:

  oled.image(image)
  oled.show()

Zu allerletzt fügen wir noch time.sleep(1) hinzu. Das heißt, das Script pausiert an dieser Stelle eine Skunde und spingt dann wieder an den Anfang von while True:.

Dein fertiges Script sollte jetzt etwa so aussehen:

import board, digitalio, glob, time
from PIL import Image, ImageDraw, ImageFont
import adafruit_ssd1306

RESET_PIN = digitalio.DigitalInOut(board.D4)
i2c = board.I2C()
oled = adafruit_ssd1306.SSD1306_I2C(128, 64, i2c,
    addr=0x3C, reset=RESET_PIN)

font = ImageFont.truetype(
    "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", 28)
font2 = ImageFont.truetype(
    "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", 14)

path = "/sys/bus/w1/devices/"
sensor_path = glob.glob(path + "28*")[0]
sensor_data_path = sensor_path + "/w1_slave"

def read_temperature():
  file = open(sensor_data_path, "r")
  rows = file.readlines()
  file.close()
  return rows

def get_temperature_in_degree():
  rows = read_temperature()
  while rows[0].strip()[-3:] != 'YES':
    time.sleep(0.2)
    rows = read_temperature()
  equals_pos = rows[1].find('t=')
  if equals_pos != -1:
      temp_string = rows[1][equals_pos+2:]
      temp_c = float(temp_string) / 1000.0
      return temp_c

oled.fill(0)
oled.show()

while True:
  image = Image.new("1", (oled.width, oled.height))
  draw = ImageDraw.Draw(image)

  draw.text((0, 0), "Temperatur:", font=font2, fill=255)
  draw.text((0, 30), str(get_temperature_in_degree())+"°C",
      font=font, fill=255)

  oled.image(image)
  oled.show()

  time.sleep(1)