Das Display ist 2x16, die 2 Spalten sind belegt und ich will nicht, dass es die ganze zeit hin und her springt.
Dazu müsste ich dann auch noch sleep einbauen und dann verzögert sich alles.
Mit erstellen von Threads oder usyncio kenn ich mich nicht aus, nur habe ich schonmal irgendwo, irgendwann bei einem Raspberry Pi 4 Projekt irgendwas mit add_action_detect verwendet, aber das ist ja leider nicht dasselbe wie microPython.
Temperatur-Lüfter
add_action_detect funktioniert nicht bei analogen Werten. Das geht nur fuer digitale Ereignisse (Flankenwechsel). Und persoenlich wuerde ich auch alles gleichzeitig darstellen, weil es nunmal wichtig ist.
Wenn du sowas unbedingt willst, dann musst du das eben selbst programmieren - merk dir den alten Wert, und vergleiche ihn mit dem neuen. Wenn der neue signifikant (analog kann rauschen) anders ist, dann stellst du den dar. Dazu muss auch noch eine Timeout-Loesung, d.h. du musst den neuen Wert fuer eine gewisse Weile anzeigen.
Wenn du sowas unbedingt willst, dann musst du das eben selbst programmieren - merk dir den alten Wert, und vergleiche ihn mit dem neuen. Wenn der neue signifikant (analog kann rauschen) anders ist, dann stellst du den dar. Dazu muss auch noch eine Timeout-Loesung, d.h. du musst den neuen Wert fuer eine gewisse Weile anzeigen.
Code: Alles auswählen
old_pot_value = 12345679 # sehr wichtig, muss genau diese Wert sein...
while True:
new_pot_value = ...
if abs(new_pot_value - old_pot_value) > 0.1:
old_pot_value = new_pot_value
show_set_point_timeout = time.time() + TIMEOUT
if time.time() > show_set_point_timeout
# show Temp & Humidity
else:
# show set point
Ich hab jetzt schon Time und from machine Timer importiert aber er kann TIMEOUT nicht zuweisen.
Muss ich dafür einen Wert einsetzen?
Wenn ich einen Wert einsetze zeigt das Display nichts Verständliches an und mit clear() gar nichts mehr.
Muss ich dafür einen Wert einsetzen?
Wenn ich einen Wert einsetze zeigt das Display nichts Verständliches an und mit clear() gar nichts mehr.
Code: Alles auswählen
from machine import I2C, ADC, Pin
from machine import PWM, Timer
from machine_i2c_lcd import I2cLcd
from time import sleep
from dht import DHT11, InvalidChecksum
import time
i2c = I2C(0, sda=Pin(16), scl=Pin(17), freq=400000)
i2c_scan=i2c.scan()[0]
i2c_scan_hex=hex(i2c_scan)
I2C_ADDR = i2c_scan
lcd = I2cLcd(i2c, I2C_ADDR, 2, 16)
fan = PWM(Pin(18))
fan.freq(25000)
pot = ADC(26)
DHTpin = Pin(21, Pin.OUT, Pin.PULL_DOWN)
def map(x, in_min, in_max, out_min, out_max):
return int((x-in_min) * (out_max-out_min) / (in_max - in_min) + out_min)
while True:
tempp = map(pot.read_u16(),288, 65535,0,40)
#set_temperature = tempp
print("Tempp:", tempp, "ADC, ", pot.read_u16())
start_speed = 1000
kp = 10000 # Skalierungsfaktor stellt die Beziehung zwischen Temperatur und Geschwindigkeit dar
sensor = DHT11(DHTpin)
sleep(1.5)
t = sensor.temperature
h = sensor.humidity
# hier wird eigentlich die Temperatur vom Sensor gelesen
#lcd.hide_cursor()
#lcd.move_to(0,0)
#lcd.putstr("Temp: " + str(t) + " C")
#lcd.move_to(0,1)
#lcd.putstr("Luftf.: " + str(h) + " %")
old_pot_value = 12345679
if abs(tempp - old_pot_value) > 0.1:
old_pot_value = tempp
show_set_point_timeout = time.time() + Timeout
if time.time() > show_set_point_timeout:
lcd.hide_cursor()
lcd.move_to(0,0)
lcd.putstr("Temp: " + str(t) + " C")
lcd.move_to(0,1)
lcd.putstr("Luftf.: " + str(h) + " %")# show Temp & Humidity
else:
lcd.clear()
lcd.putstr("Tempp: " + str(tempp) + " C")
lcd.clear()
temp_difference = tempp - t
speed_difference = -temp_difference * kp
new_speed = round(start_speed) + round(speed_difference)
# hier wird mit 'new_speed' die neue Geschwindigkeit für den Lüfter eingestellt
fan.duty_u16(new_speed)
if new_speed <= 0:
fan.duty_u16(1000)
if new_speed > 65000:
fan.duty_u16(65000)
print(t, "C")
print(h, "%")
print(fan.duty_u16(), "DutyCycle")
Du verstehst offensichtlich nicht das Prinzip von dem, was dieser Code bewirken soll. Sonst waere sowohl klar, dass TIMEOUT einen Wert in Sekunden zur Anzeige benoetigt, den du halt festlegen musst, und das es natuerlich auch totaler Quatsch ist, den Wert fuer old_pot_value *JEDES MAL IN DER SCHLEIFE NEU ZU SETZEN*. Das muss nur einmal vorher passieren, und das war es. Sonst ist doch der Wert *immer* anders als der gerade eingelesene (ausser der ist zufaellig 12345679), und du komms nie in den if-Zweig, sondern bleibst im else.
Da fehlen noch zu viele Grundlagen. So viel Nachhilfe kann ich nicht geben, tut mir leid. Viel Erfolg noch.
Da fehlen noch zu viele Grundlagen. So viel Nachhilfe kann ich nicht geben, tut mir leid. Viel Erfolg noch.
Hab es jetzt einfach gemacht.
Falls es jemandem hilft, oder es jemanden interessiert:
Falls es jemandem hilft, oder es jemanden interessiert:
Code: Alles auswählen
from machine import I2C, ADC, Pin
from machine import PWM, Timer
from machine_i2c_lcd import I2cLcd
from time import sleep
from dht import DHT11, InvalidChecksum
import time
i2c = I2C(0, sda=Pin(16), scl=Pin(17), freq=400000)
i2c_scan=i2c.scan()[0]
i2c_scan_hex=hex(i2c_scan)
I2C_ADDR = i2c_scan
lcd = I2cLcd(i2c, I2C_ADDR, 2, 16)
fan = PWM(Pin(18))
fan.freq(25000)
pot = ADC(26)
DHTpin = Pin(21, Pin.OUT, Pin.PULL_DOWN)
def map(x, in_min, in_max, out_min, out_max):
return int((x-in_min) * (out_max-out_min) / (in_max - in_min) + out_min)
while True:
tempp = map(pot.read_u16(),288, 65000,0,40)
set_temperature = tempp
print("Tempp:", tempp, "ADC, ", pot.read_u16())
start_speed = 1000
kp = 10000 # Skalierungsfaktor stellt die Beziehung zwischen Temperatur und Geschwindigkeit dar
sensor = DHT11(DHTpin)
sleep(1.5)
t = sensor.temperature
h = sensor.humidity
# hier wird eigentlich die Temperatur vom Sensor gelesen
lcd.hide_cursor()
lcd.move_to(0,0)
lcd.putstr("O: " + str(tempp) + "C " + "S: " + str(t) + "C")
lcd.move_to(0,1)
lcd.putstr("Luftf.: " + str(h) + " %")
temp_difference = set_temperature - t
speed_difference = -temp_difference * kp
new_speed = round(start_speed) + round(speed_difference)
# hier wird mit 'new_speed' die neue Geschwindigkeit für den Lüfter eingestellt
fan.duty_u16(new_speed)
if new_speed <= 0:
fan.duty_u16(1000)
if new_speed > 65000:
fan.duty_u16(65000)
print(t, "C")
print(h, "%")
print(fan.duty_u16(), "DutyCycle")
Hallo,
Edit: Vorab, ich habe die drei Seiten nicht durchgelesen, hatte gerade nur etwas Zeit und wollte dir beim aufräumen etwas helfen.
'time' wird importiert aber nicht genutzt. Sowie 'InvalidChecksum' und 'Timer'.
Auf Modulebene (der Code ohne Einrückungen) sollte kein ausführbarer Code stehen. Hier werden nur Konstanten, Klassen und Funktionen definiert. Letztere solltest du vermehrt verwenden. Üblicherweise wird das Python-Programm aus einer Funktion mit dem Namen 'main' gesteuert.Hier werden Funktionen aufgerufen, Argumente übergeben und Rückgaben entgegen genommen.
Verwende sprechende Namen. Funktionen werden nach ihrer Tätigkeit benannt. Und dann gibt es da auch noch diese Richtline, wie man Namen schreibt: Konstanten KOMPLETT_GROSS, Funktionen klein_mit_unterstrich und Klassen in CamelCase-Schreibweise.
'i2c_scan_hex' wird nicht verwendet. Die Zuweisung von 'I2CADRR' ist eigentlich auch überflüssig.
Was 'pot' bedeuten soll weis ich nicht, deswegen lasse ich das mal so stehen. 'DHTpin' ist kein Pin sondern wohl eher der Sensor, oder?
Du musst 'temp' nicht an 'set_temperature' binden um dann 'set_temperature' ausgeben. Wenn dir der Name besser gefällt kannst du diesen gleich als Rückgabe der 'map'-Funktion(auch hier die Namenswahl) verwenden und damit weiter arbeiten. 'map' ist übrigens schon in Python an einer Built-In-Funktion vergeben, daher ist das eine doppelt schlechte Namenswhal.
Strings werden nicht mit '+' zusammengepuzzelt, dafür gibt es f-Strings.
Ich würde erst die neue Lüftergeschwindigkeitsbedingungen prüfen und dann den entsprechenden Wert testen.
Also die Logik habe ich nicht wirklich hinterfragt, aber mal versucht so gut es geht etwas aufzuräumen:
Grüße
Dennis
Edit: Vorab, ich habe die drei Seiten nicht durchgelesen, hatte gerade nur etwas Zeit und wollte dir beim aufräumen etwas helfen.
'time' wird importiert aber nicht genutzt. Sowie 'InvalidChecksum' und 'Timer'.
Auf Modulebene (der Code ohne Einrückungen) sollte kein ausführbarer Code stehen. Hier werden nur Konstanten, Klassen und Funktionen definiert. Letztere solltest du vermehrt verwenden. Üblicherweise wird das Python-Programm aus einer Funktion mit dem Namen 'main' gesteuert.Hier werden Funktionen aufgerufen, Argumente übergeben und Rückgaben entgegen genommen.
Verwende sprechende Namen. Funktionen werden nach ihrer Tätigkeit benannt. Und dann gibt es da auch noch diese Richtline, wie man Namen schreibt: Konstanten KOMPLETT_GROSS, Funktionen klein_mit_unterstrich und Klassen in CamelCase-Schreibweise.
'i2c_scan_hex' wird nicht verwendet. Die Zuweisung von 'I2CADRR' ist eigentlich auch überflüssig.
Was 'pot' bedeuten soll weis ich nicht, deswegen lasse ich das mal so stehen. 'DHTpin' ist kein Pin sondern wohl eher der Sensor, oder?
Du musst 'temp' nicht an 'set_temperature' binden um dann 'set_temperature' ausgeben. Wenn dir der Name besser gefällt kannst du diesen gleich als Rückgabe der 'map'-Funktion(auch hier die Namenswahl) verwenden und damit weiter arbeiten. 'map' ist übrigens schon in Python an einer Built-In-Funktion vergeben, daher ist das eine doppelt schlechte Namenswhal.
Strings werden nicht mit '+' zusammengepuzzelt, dafür gibt es f-Strings.
Ich würde erst die neue Lüftergeschwindigkeitsbedingungen prüfen und dann den entsprechenden Wert testen.
Also die Logik habe ich nicht wirklich hinterfragt, aber mal versucht so gut es geht etwas aufzuräumen:
Code: Alles auswählen
from time import sleep
from dht import DHT11
from machine import ADC, I2C, PWM, Pin
from machine_i2c_lcd import I2cLcd
SDA_PIN = 16
SCL_PIN = 17
FREQUENZ = 400000
FAN_PIN = 18
DHT_PIN = 21
START_SPEED = 1000
SCALE_FACTOR = 10000
def calculate_temperature(x, in_min, in_max, out_min, out_max):
return int((x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min)
def read_dht_sensor(sensor):
temperature = sensor.temperature
humidity = sensor.humidity
return temperature, humidity
def update_display(lcd, set_temperature, sensor_temperature, humidity):
lcd.hide_cursor()
lcd.move_to(0, 0)
lcd.putstr(f"O: {set_temperature} °C S: {sensor_temperature} °C")
lcd.move_to(0, 1)
lcd.putstr(f"Luftf.: {humidity} %")
def control_speed(sensor_temperature, set_temperature):
return START_SPEED + (-(set_temperature - sensor_temperature) * SCALE_FACTOR)
def set_new_fanspeed(fan, new_speed):
if new_speed <= 0:
fan.duty_u16(1000)
elif new_speed > 65000:
fan.duty_u16(65000)
else:
fan.duty_u16(new_speed)
def main():
i2c = I2C(0, sda=SDA_PIN, scl=SCL_PIN, freq=FREQUENZ)
i2c_scan = i2c.scan()[0]
lcd = I2cLcd(i2c, i2c_scan, 2, 16)
fan = PWM(Pin(FAN_PIN))
fan.freq(25000)
pot = ADC(26)
temperature_sensor = DHT11(Pin(DHT_PIN, Pin.OUT, Pin.PULL_DOWN))
while True:
set_temperature = calculate_temperature(pot.read_u16(), 288, 65000, 0, 40)
print("Tempp:", set_temperature, "ADC, ", pot.read_u16())
sleep(1.5)
sensor_temperature, humidity = read_dht_sensor(temperature_sensor)
update_display(lcd, set_temperature, sensor_temperature, humidity)
new_speed = round(control_speed(sensor_temperature, set_temperature))
set_new_fanspeed(new_speed)
print(f"{sensor_temperature} °C")
print(f"{humidity} %")
print(f"{fan.duty_u16()} DutyCycle")
sleep(1)
if __name__ == "__main__":
main()
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]