Hallo,
zu deinem Code. MicroPython hat kein 'time', dafür ein 'utime'. Das wird auch verwendet, wenn du 'time' in deinen Code schreibst. SIeh dir print(time) an.
Du solltest keine Namen verwenden, die nichtssagend sind und/oder erfundene Abkürzungen sind. Wähle sprechende Namen, das macht für alle den Code leichter lesbar, auch für dich, wenn du in einem halben Jahr etwas ändern willst.
Funktionsnamen sollen beschreiben was die Funktion macht. 'ps' und 'linien' tut das nicht. Ich weis auch nicht was die Pferdestärken in deinem Programm zu suchen haben oder steht das 'ps' doch für was anderes? 
Variablen schreibt man komplett klein und auch sie sollten nicht aus einzelnen Buchstaben bestehen.
Auf der Modulebene, da wo deine Funktionen stehen, sollten nur Konstanten, Funktionen und Klassen stehen und kein ausführbarer Code. Du hast normalerweise eine Funktion 'main' aus der du den Programmablauf steuerst und Funktionen aufrufst. Was die Funktionen benötigen bekommen sie als Argumente übergeben, wenn es sich nicht um Konstanten handelt.
Wenn du 'Pin' importierst ist es nicht nötig machine.Pin(16) zu schreiben.
So im groben könnte die Programmstruktur wie folgt aussehen. Ich habe versucht deine Programmlogik weitest gehend bei zu behalten. Ob meine Namen richtig gewählt sind weis ich nicht, ich konnte auch den Code nicht testen, mit dem Beispiel will ich dir nur zeigen was ich mit meiner Erklärung gemeint habe. Das ist keines Falls eine Musterlösung:
from machine import Pin, I2C
import utime, math
from bme280 import BME280
from ssd1306 import SSD1306_I2C
import onewire, ds18x20
WITDH = 128
HEIGHT = 64
def calculate_pressure(temperautre):
temperature = float(temperature)
pressure = 0.61121 * math.exp((18.678 - (temperature / 234.5)) * (temperature / (257.14 + T)))
return round(pressure * 1000,1)
def create_line():
print('*'*45)
def show_values(ds_sensor, bme):
while True:
print(bme.value)
create_line()
bme_temperature = bme.values[0].replace('C','')
bme_humidity = bme.values[2].replace('%','')
print('BME Temperatur: \t\t',bme_temperature)
print('BME Ps: \t\t\t',str(calculate_pressure(bme_temperature)))
# Was das ergeben soll weis ich nicht
bme_Pt = round(ps(bme_temp)*float(bme_humidity)/100,1)
print('BME Pt: \t\t\t',str(bme_Pt))
print('BME Luftfeuchtigkeit: \t\t',bme_humidity)
create_line()
ds_sensor.convert_temp()
utime.sleep_ms(750)
roms = ds_sensor.scan()
print('Found a ds18x20 device')
for rom in roms:
print('DS Temperatur: \t\t\t',round(ds_sensor.read_temp(rom),2))
ds_temperature = ds_sensor.read_temp(rom)
print('Ps am Sensor DS: \t\t',calculate_pressure(ds_temperature))
# Auch das kann ich nich erraten
rlf_DS = round(bme_Pt/ps(ds_temperature)*100,2)
print('\t\t\t\t',str(rlf_DS))
create_line()
utime.sleep(3)
def main():
i2c = I2C(0, sda = Pin(0), scl = Pin(1), freq = 400000)
bme = BME280(i2c = i2c)
i2c_oled = I2C(1, sda = Pin(14), scl = Pin(15), freq = 400000)
oled = SSD1306_I2C(WITDH, HEIGHT, i2c_oled)
ds_sensor = ds18x20.DS18X20(onewire.OneWire(Pin(16)))
oled.fill(0)
oled.text('Found a ds18x20 device',0,0)
oled.show()
show_values(ds_sensor, bme)
if __name__ == '__main__':
main()
Display More
Grüße
Dennis
Display More
Hallo Dennis,
nochmals Danke für die Korrekturen am Code. Ich war der Meinung, dass ein " if __name__ == '__main__':"- Block bei rein funktionaler Programmierung nicht erforderlich ist. Aber wahrscheinlich sollte man sich sowas grundsätzlich angewöhnen - dürfte wohl der bessere Stil sein. Die schlampigen Variablen-Bezeichnungen sind dem geschuldet, dass ich die Woche immer nur Abends für ein paar Minuten Zeit hatte an dem Projekt zu arbeiten. Für den Fall, dass du wissen möchtest, für was das Teil eigentlich gut sein soll:
Problem-Ausgangsstellung: Du hast Fensterelemente, an denen im Randbereich im Winter Kondensat und/oder Schimmel entsteht, bist aber der Meinung dass du ausreichend Lüftest und im Raum herrschen meistens nur um die 40% relative Luftfeuchtigkeit im Winter. Du fragst dich, liegt es am schlechten Bauteil Fenster/Fensterleibung oder Lüftest du vielleicht tatsächlich zu wenig.
Lösung: Den Pico möglichst mitten im Raum aufstellen und den DS18B20 im Bereich des Schimmels befestigen und laufen lassen.
Was macht das Skript: Der BME liefert die relevanten Raumklimadaten, nämlich Temperatur und (relative) Luftfeuchtigkeit. Je nach Temperatur kann die Luft unterschiedlich viel Wasserdampf aufnehmen (jedoch nie mehr als bis zur Sättigung). Der Sättigungsdampfdruck einer Temperatur lässt sich in den üblichen Temperaturbereichen verhältnismäßig gut ausrechnen (Formel nach Magnus Tetens). ps bedeutet druck p und s ist Sättigung 
Jetzt wissen wir, dass zum Beispiel bei 20°C er Sättigungsdampfdruck bei ca. 2330 Pa liegt. Gleichzeitig kennen wir die relative Luftfeuchtigkeit. Beträgt diese zum Beispiel 50%, so beträgt der tatsächliche Dampfdruck (pt) 2330 * 0,5 = 1165 Pa.
Man kann davon ausgehen, das der Dampfdruck im Raum relativ gleichmäßig verteilt ist. Das bedeutet, die 1165 Pa liegen auch am Schimmelbereich an. Wir kennen die Temperatur am Schimmelbereich (die liefert uns der DS18B20 am Kabel) und können dort ebenfalls den Sättigungsdampfdruck ausrechnen. Liegt der Ps im Schimmelbereich aufgrund der niedrigeren Temperatur zum Beispiel bei 1456 Pa, kann man die beiden Drücke ins Verhältnis setzen, sprich den tatsächlichen Druck (=Wasserdampf im Raum) mit 1165 / 1456 Pa max möglicher Druck an der Schimmelstelle = 0,8. Sprich im Schimmelbereich ist die Luft zu 80 % gesättigt. Und das langt zum Beispiel schon für Schimmelwachstum. Die Zahlen zeigen, das im vorliegenden Fall, trotz "Normklima" im Raum, Schimmel nicht zu vermeiden ist -> Das Problem liegt im Fenster/Wandbereich.
Sinn machen solche Messungen logischerweise nur im Winter. Damit das ganze auch noch nachvollziehbar ist und nicht nur eine Momentaufnahme darstellt, sollen die Werte noch im 5 Minuten Takt geloggt werden.
Ist vielleicht eine relativ spezielle Anwendung und mit Sicherheit nicht für jeden interessant. Wer schon mal Diskussionen über die Kostenbeteiligung einer Schimmelbeseitigung geführt hat, wird sich aber vielleicht dafür interessieren.
Ich würde das Projekt grundsätzlich gerne voran treiben und auch der Öffentlichkeit zur Verfügung stellen wollen. Ich halte sehr viel vom Open Source Gedanken...
just my 2 cents...
Christian
PS Sollte nicht belehrend klingen, wollte nur anständig erklären was das ganze soll, wenn du dir schon die Mühe machst, den Code zu korrigieren 