Hallo zusammen,
ich baue gerade parallel zu meinem Projekt am RPi4 noch mit an einem Klima-Daten-Logger auf Basis eines Picos. Ich habe dort via I2C neben einem BME280 auch ein OLED Display SSD1306 verbaut. Folgendes Problem: Der Code läuft ohne Fehler durch, die BME280 Werte werden auch ausgelesen, nur das Display zeigt nichts an. Verwende ich die gleichen Parameter für ein Skript, welches nur nur das Display anspricht, werden Daten angezeigt. Ich habe euch mal ein paar Aufnahmen von der "Verdrahtung" gemacht. Und hier noch der Code, welcher leider keine Ausgabe auf dem OLED macht:
from machine import Pin, I2C
#from time import sleep
import time, math
from bme280 import BME280
from ssd1306 import SSD1306_I2C
import onewire, ds18x20
def ps(T):
T = float(T)
P = 0.61121 * math.exp((18.678 - (T / 234.5)) * (T / (257.14 + T)))
P = round(P * 1000,1)
return P
def linien():
print('*'*45)
#setup BME280
i2c = I2C(0, sda = Pin(0), scl = Pin(1), freq = 400000)
bme = BME280(i2c = i2c)
#setup Display
WITDH = 128
HEIGHT = 64
i2c_oled = I2C(1, sda = Pin(14), scl = Pin(15), freq = 400000)
oled = SSD1306_I2C(WITDH, HEIGHT, i2c_oled)
#setup DS18B20
ds_pin = machine.Pin(16)
ds_sensor = ds18x20.DS18X20(onewire.OneWire(ds_pin))
roms = ds_sensor.scan()
print('Found a ds18x20 device')
oled.fill(0)
oled.text('Found a ds18x20 device',0,0)
oled.show
while True:
print(bme.values)
linien()
#print(bme.values[0])
bme_temp = bme.values[0]
bme_temp = bme_temp.replace('C','')
bme_hum = bme.values[2]
bme_hum = bme_hum.replace('%','')
print('BME Temperatur: \t\t',bme_temp)
print('BME Ps: \t\t\t',str(ps((bme_temp))))
bme_Pt = round(ps(bme_temp)*float(bme_hum)/100,1)
print('BME Pt: \t\t\t',str(bme_Pt))
print('BME Luftfeuchtigkeit: \t\t',bme_hum)
linien()
#roms = ds_sensor.scan()
ds_sensor.convert_temp()
time.sleep_ms(750)
for rom in roms:
#print(ds_sensor.read_temp(rom))
print('DS Temperatur: \t\t\t',round(ds_sensor.read_temp(rom),2))
T_DS = ds_sensor.read_temp(rom)
#print(T_DS)
print('Ps am Sensor DS: \t\t',ps((T_DS)))
#DS_Pt = round(ps(T_DS)*float(bme_hum)/100,1)
#print('Pt am Sensor DS: \t\t',str(DS_Pt))
rlf_DS = round(bme_Pt/ps(T_DS)*100,2)
print('\t\t\t\t',str(rlf_DS))
linien()
time.sleep(3)
Alles anzeigen
Bitte nicht daran stören, dass ich den Code noch nicht ordentlich kommentiert habe. Ich wollte das machen sobald die Komponenten alle verbaut sind und dann auch eine ordentliche Projektvorstellung machen.
Folgender Code funktioniert bei gleicher Verkabelung wunderbar (sinnfrei, habe ich nur für Testzwecke erstellt bzw. "ergoogled"):
from machine import Pin, I2C
from ssd1306 import SSD1306_I2C
import time
i2c=I2C(1,sda=Pin(14), scl=Pin(15), freq=400000)
oled = SSD1306_I2C(128, 64, i2c)
'''
for n in range(10):
oled.fill(0)
oled.text(str(n), 0, 0)
oled.show
time.sleep(1)
'''
oled.fill(0)
oled.text("Tom's Hardware", 0, 0)
oled.show()
time.sleep(1)
oled.fill(0)
oled.text("test", 0, 0)
oled.show()
time.sleep(1)
oled.fill(0)
oled.show()
oled.text("Erste Zeile", 0, 0)
oled.text("Zweite Zeile", 0, 10)
oled.text("Dritte Zeile", 0, 20)
oled.show()
time.sleep(2.5)
oled.fill(0)
oled.show()
Alles anzeigen
Ich denke es hat damit zu tun, das ich einmal den Kanal 0 und einmal den Kanal 1 anspreche (wird das Kanal genannt?)? Eigentlich sollte man die Bauteile bei I2C doch auch "Bus-mäßig" schalten können, oder?
Vielleicht hat jemand von euch eine Idee dazu...
Schönen Abend noch!
Christian