# Ändere vor dem Start den Typ von .txt in .py from machine import Pin, PWM, ADC, I2C import network import urequests import time import math from tm1637 import TM1637, SEGMENTS import dht # LEDs led1 = Pin(6, Pin.OUT) led2 = Pin(7, Pin.OUT) led3 = Pin(8, Pin.OUT) led4 = Pin(9, Pin.OUT) # Servo servo = PWM(Pin(28)) servo.freq(50) # Taster taster_1 = Pin(21, Pin.IN, Pin.PULL_UP) # Servo 0° taster_2 = Pin(20, Pin.IN, Pin.PULL_UP) # Datenquelle wechseln taster_3 = Pin(19, Pin.IN, Pin.PULL_UP) # Servo 180° taster_4 = Pin(18, Pin.IN, Pin.PULL_UP) # Servo Mitte # TM1637 Display display = TM1637(Pin(2), Pin(3)) # DHT22 Sensor dht_sensor = dht.DHT22(Pin(16)) # Poti an GP26 adc = ADC(0) ADC_MIN = 32279 ADC_MAX = 60270 # Status aktueller_winkel = 90 zielwinkel = 90 fix_mitte = False nutzung_dht = False t2_last = 1 stunden_alt = -1 t1_last = 1 # Servo-Position def set_servo_angle(angle): duty = int(1638 + (angle / 180.0) * (8192 - 1638)) servo.duty_u16(duty) def langsam_bewegen(von, nach): if von == nach: return led2.value(1) schritt = 1 if nach > von else -1 for winkel in range(int(von), int(nach) + schritt, schritt): set_servo_angle(winkel) time.sleep(0.015) led2.value(0) def get_stundenwert(): rohwert = adc.read_u16() rohwert = max(0, rohwert - ADC_MIN) spannweite = max(1, ADC_MAX - ADC_MIN) norm = rohwert / spannweite entzerrt = math.sqrt(norm) return min(95, int(entzerrt * 96)) # WLAN verbinden wlan = network.WLAN(network.STA_IF) wlan.active(True) wlan.connect("SSID eingeben", "Passwort des WLAN eingeben") while not wlan.isconnected(): time.sleep(0.5) print("Verbunden, IP:", wlan.ifconfig()[0]) led1.value(1) # Hauptschleife while True: t1_now = taster_1.value() if t1_last == 1 and t1_now == 0: fix_mitte = not fix_mitte print("Taster 1 gedrückt → fix_mitte =", fix_mitte) t1_last = t1_now t2_now = taster_2.value() if t2_last == 1 and t2_now == 0: nutzung_dht = not nutzung_dht print("Taster 2 gedrückt → Nutzung DHT:", nutzung_dht) t2_last = t2_now if not taster_4.value(): zielwinkel = 0 modus = "T4: 0°" led3.value(0) fix_mitte = False elif not taster_3.value(): zielwinkel = 180 modus = "T3: 180°" led3.value(0) fix_mitte = False elif fix_mitte: zielwinkel = 90 modus = "MITTE" led3.value(1) led4.toggle() time.sleep(0.2) continue else: modus = "AUTO" led3.value(0) if nutzung_dht: try: dht_sensor.measure() hum = int(dht_sensor.humidity()) hum = max(30, min(99, hum)) print("DHT22 Luftfeuchtigkeit: {}%".format(hum)) seg = [] if hum >= 100: seg.append(SEGMENTS[hum // 100 % 10]) if hum >= 10: seg.append(SEGMENTS[hum // 10 % 10]) seg.append(SEGMENTS[hum % 10]) seg.append(0x25) # % Zeichen display.show_segments(seg) zielwinkel = (hum - 30) * 180 / (99 - 30) except Exception as e: print("Fehler DHT22:", e) zielwinkel = aktueller_winkel else: stundenwert = get_stundenwert() if stundenwert != stunden_alt: stunden_alt = stundenwert print("Vorhersagestunde: {}h".format(stundenwert)) seg = [] if stundenwert >= 100: seg.append(SEGMENTS[stundenwert // 100 % 10]) if stundenwert >= 10: seg.append(SEGMENTS[stundenwert // 10 % 10]) seg.append(SEGMENTS[stundenwert % 10]) seg.append(0x74) # kleines h display.show_segments(seg) time.sleep(0.5) try: url = "https://api.open-meteo.com/v1/forecast?latitude=50.5642&longitude=7.8276&hourly=relative_humidity_2m&forecast_days=4" response = urequests.get(url) data = response.json() response.close() hum = data["hourly"]["relative_humidity_2m"][stundenwert] hum = max(30, min(99, hum)) zielwinkel = (hum - 30) * 180 / (99 - 30) except Exception as e: print("Fehler Wetterdaten:", e) zielwinkel = aktueller_winkel print("Modus: {} → Servo von {:.1f}° nach {:.1f}°".format(modus, aktueller_winkel, zielwinkel)) langsam_bewegen(aktueller_winkel, zielwinkel) aktueller_winkel = zielwinkel time.sleep(0.2)