Logischer Fehler bei Variable ?

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
M1K3Y
User
Beiträge: 2
Registriert: Samstag 7. April 2018, 16:58

Hey Leute,
ich bin ziemlich neu hier bei Python und würde mich über etwas Hilfe bei einem meiner kleinen Projekte freuen. :wink:

Mein Plan war eine simple, über den RasPi gesteuerte Bewässerungsanlage. Für eines der Ventile war ein Motor gedacht, der das Ventil zu bestimmten Uhrzeiten öffnet und anschließend wieder schließt. Den Motor bediene ich über einen L293D IC, über zwei Pins steuere ich damit die Drehrichtung des Motors.

Im unten befindlichen Code weise ich also dem Termin t die aktuelle Systemuhrzeit zu. Dann kommen die Unterprogramme für die Motorbewegung und anschließend die hauptsächliche while-True-Schleife. Wenn es nun 8 oder 20 Uhr spät ist sollte das Ventil thereotisch kurz geöffnet werden.

Allerdings wird immer die else-Schleife durchlaufen, auch wenn die Print-Anweisung 8 oder 20 ausgibt. :?:
Ich kann keine Fehler finden, habe ich logisch vllt irgendetwas grundsätzlich falsch gemacht, z.B. bei der Variablenzuweisung?

Vielen Dank schonmal im Vorraus, M1K3Y




Code: Alles auswählen

import time
import RPi.GPIO as GPIO

motor = 20
motor2 = 21
t = time.strftime("%H%M")

GPIO.setmode(GPIO.BCM)
GPIO.setup(motor, GPIO.OUT)
GPIO.setup(motor2, GPIO.OUT)

def motor_vor():
    GPIO.output(motor, True)
    time.sleep(4)
    GPIO.output(motor, False)

def motor_zurück():
    GPIO.output(motor2, True)
    time.sleep(4)
    GPIO.output(motor2, False)

while True:
    print(time.strftime("%H%M"))

    if t == 800:
        motor_vor()
        time.sleep(8)
        motor_zurück()

    elif t == 2000:
        motor_vor()
        time.sleep(8)
        motor_zurück()

    else:
        GPIO.output(motor, False)
        GPIO.output(motor2, False)
        time.sleep(4)
Trial and Error
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@M1K3Y: nur weil Du am Anfang `t` die Uhrzeit zugewiesen hast, wird die nicht auf magische Weise immer aktualisiert. Was Du innerhalb der Schleife ausgibst, ist die aktuelle Uhrzeit, und nicht `t`.

Zweites Problem ist, dass `t` ein String ist, Du aber mit Zahlen vergleichst. Das wird auch nie wahr sein.

Drittes Problem ist, dass der String "0800" oder "2000" für eine Minute besteht, das Auf- und Zumachen aber nur 16 Sekunden dauert, also wird innerhalb der Minute 4 Mal gewässert.

Dann versucht man beim Programmieren doppelten Code zu vermeiden. Die beiden Funktionen `motor_vor` und `motor_zurück` sind bis auf einen Parameter gleich, die zwei if-Blöcke sogar exakt gleich.
M1K3Y
User
Beiträge: 2
Registriert: Samstag 7. April 2018, 16:58

@Sirius3: Also vielen Dank für deine Mühe und die tolle Hilfe, muss mal gesagt werden ;). Das Programm läuft jetzt einwandfrei, der trockene Sommer kann kommen...
Trial and Error
Antworten