Wetter-Station

Hier werden einzelne Projekte mit MicroPython vorgestellt
Antworten
Heinrichs
Beiträge: 185
Registriert: Do 21. Okt 2010, 18:31

Wetter-Station

Beitrag von Heinrichs » Do 4. Mär 2021, 15:42

In Kombination mit dem Baustein BME/BMP280 lässt sich aus dem TTGO T-Display eine kleine Wetter-Station bauen. Damit lassen sich die Klima-Daten Temperatur, Luftfeuchtigkeit und Luftdruck anzeigen.

Wetter_Daten.jpg
Wetter_Daten.jpg (49.85 KiB) 9705 mal betrachtet

Bei dem BME/BMP280 handelt es sich um ein I2C-Modul; standardmäßig besitzt es die I2C-Adresse 118 bzw. 0x76 (Angabe ohne Read-Write-Bit). Für diesen Baustein gibt es hier ein Python-Modul, welches einen einfachen Zugriff auf die Messwerte erlaubt. Ich habe für meine Zwecke dieses Modul geringfügig modifiziert, indem ich die Einheiten bei den Messwerten weggelassen habe. Dadurch ist es einfacher, mit den verschiedenen Kodierungen des Grad-Zeichens umzugehen (s. u.). Das modifizierte Python-Modul finden Sie im Anhang.

Zum Betrieb wird der Baustein folgendermaßen angeschlossen:

Code: Alles auswählen

BME/BMP280  -   TTGO
---------------------------
Vcc         -   3V (3,3 V)
GND         -   G
SCL         -   Pin 22
SDA         -   Pin 21
Da sowohl der TTGO als auch der BME/BMP280 mit 3,3V-Signalen arbeiten, ist keine Pegelanpassung erfoderlich.


Mein Programm gibt die Messwerte im 5-Sekunden-Rythmus auf dem Display (und ggf. auch auf einem Terminal) aus. Die Temperatur kann in °C oder in °F angegeben werden; dazu müssen lediglich einige Auskommentierungen ausgetauscht werden.

Das Programm erläutert sich im Wesentlichen selbst. Nach den Initialisierungen erfolgen Messung und Ausgabe in einer while-Schleife: Zunächst wird der Baustein initialisiert; über die Properties temperature, humidity und pressure können die Messwerte (als Zeichenketten) in den Variablen temp, hum und pres gespeichert werden. Deren Werte werden im weiteren Verlauf auf dem Display (und ggf. auch auf einem Terminal) ausgegeben.

Code: Alles auswählen

# nach: https://randomnerdtutorials.com/micropython-bme280-esp32-esp8266/
# Complete project details at https://RandomNerdTutorials.com

# vom BME280 angezeigte Temperatur ist im Vergleich zu anderen Thermometern teilweise etwas höher;
# Grund: Wärme vom BME-Chip/Board UND vom TTGO!


from machine import Pin, I2C, SPI
from time import sleep
import Bme280  # Original-Modul (s. o.) geringfügig modifiziert (Einheiten bei den Properties entfernt)
import vga2_8x16 as font1 # mit Sonderzeichen (für °)
import vga1_bold_16x32 as font2
import st7789


spi = SPI(2, baudrate=20000000, polarity=1, sck=Pin(18), mosi=Pin(19))
display = st7789.ST7789(spi, 135, 240,  reset=Pin(23, Pin.OUT), cs=Pin(5, Pin.OUT), dc=Pin(16, Pin.OUT), backlight=Pin(4, Pin.OUT), rotation=3)
# Landscape
display.init()
display.fill(0)  # loeschen; Bildschirm schwarz

display.text(font2, 'Klima-Daten', 10, 10, st7789.GREEN)

# ESP32 - Pin assignment
i2c = I2C(scl=Pin(22), sda=Pin(21), freq=10000)

print('Klima-Daten...', '\n')

while True:
  bme = Bme280.BME280(i2c=i2c) 
  temp = bme.temperature
  hum = bme.humidity
  pres = bme.pressure
  # Temperatur in Fahrenheit auskommentiert
  # temp = (bme.read_temperature()/100) * (9/5) + 32
  # temp = str(round(temp, 2))
  print('Temperature: ', temp, '°C')
  temp_displ = b'Temp: ' + bytes(temp, 'utf-8') + b' \xF8C '
  # print('Temperature: ', temp, '°F')
  # temp_displ = b'Temp: ' + bytes(temp, 'utf-8') + b' \xF8F '  
  display.text(font1, temp_displ, 10, 60)  
  print('Humidity: ', hum, '%')
  display.text(font1, 'Hum:  ' + hum + ' % ', 10, 80) 
  print('Pressure: ', pres, 'hPa')
  display.text(font1, 'Pres: ' + pres + ' hPa ', 10, 100)  
  sleep(5)
Die Ausgabe des °-Zeichen erfordert ein klein wenig Mühe: Dieses gehört nämlich nicht zum Standard-Zeichensatz des Displays; deswegen müssen wir einen erweiterten Zeichensatz (vga2...) benutzen. Erschwerend kommt hinzu, dass Python das Grad-Zeichen mit zwei Bytes kodiert; die Zeichensatz-Tabelle von vga2... arbeitet aber auch bei den Sonderzeichen mit einem einzigen Byte (in diesem Fall: F8(hex)). Die Temperatur-Ausgabe erfolgt nun über den Bytestring temp_displ = b'Temp: ' + bytes(temp, 'utf-8') + b' \xF8C'. Mehr zur Sonderzeichen-Problematik beim TTGO T-Display findet man hier.

Man beachte: Die angezeigte Temperatur kann ggf. geringfügig höher sein als die wirkliche Lufttemperatur. Dies kann darauf zurück geführt werden, dass der Temperatur-Sensor durch das BME-Board selbst, vor allem aber auch durch das TTGO-Board leicht erwärmt wird. Insofern empfiehlt es sich, den BME/BMP280-Baustein in größerer Entfernung vom TTGO-Modul zu platzieren als es in der obigen Abbildung zu sehen ist.

.
Dateianhänge
bme280_mod.zip
Modifiziertes bme280.py-Modul
(2.74 KiB) 1602-mal heruntergeladen

Antworten