Temperatur-Lüfter

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
T4m4go
User
Beiträge: 38
Registriert: Samstag 3. Juli 2021, 16:54

T4m4go hat geschrieben: Donnerstag 25. November 2021, 16:01 Ich habe es ausprobiert und ich komme damit nicht zurecht.
Wie gesagt.
Timeout ist mir auch neu.
Egal, auf jeden Fall DANKE für die viele Hilfe!!!
T4m4go
User
Beiträge: 38
Registriert: Samstag 3. Juli 2021, 16:54

Hab es jetzt einfach gemacht.
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")

Benutzeravatar
Dennis89
User
Beiträge: 1123
Registriert: Freitag 11. Dezember 2020, 15:13

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:

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()
Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Antworten