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
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)
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.
.