Einschaltdauer Begrenzen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
donpatriko
User
Beiträge: 3
Registriert: Dienstag 19. April 2022, 12:09

Hallo zusammen,

ich baue gerade einen Adapter zur Einschaltdauerbegrenzung eines Relais.
Das Eingangssignal kommt von einer Sprechanlage und wird über ein Relais auf Pin 3 abgefragt.
Das Ausgangssignal kommt über Pin 6 über einen Optokopler zum Relais und schaltet das Licht.
Verwendet wird ein Raspberry Pi Pico und Mycropython. Das Licht soll nur 3 Sekunden leuchten.
Zu Testzwecken habe ich an den Ausgang Pin 6 eine LED angeschlossen.

Soweit wäre der Code geschrieben:
__________________________________
from machine import Pin
import time

led = Pin(3, Pin.OUT)
btn = Pin(6, Pin.IN)

while True:

if btn()==0:
led.off()

else:
led.on()
time.sleep(2)
led.off()
___________________________________

Wie bekomme ich dort die Einschaltzeitbegrenzung hin?

Es hat den Hintergrund falls das Eingangssignal dauerhaft anliegt (defekter Schalter oder defektes Relais), das nicht die ganze Zeit
das Licht leuchtet. Ich hoffe es zu verstehen was gemeint ist.

Mit Freundlichen Grüßen
Patrik
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte den Code in Zukunft in code-tags setzen, das ist der </>-Knopf im vollstaendigen Editor. Denn sonst gehen die wichtigen Einrueckungen verloren.

Zu deinem Problem: du musst einfach nur im else-Fall mit while darauf warten, dass der Button wieder auf 0 geht. Damit erst dieser Wechsel stattfinden muss, bevor der naechste Zyklus beginnen kann.
donpatriko
User
Beiträge: 3
Registriert: Dienstag 19. April 2022, 12:09

Hallo deets,

danke für deine Antwort und den Tip mit den Code Tags.

Das mit while funktioniert soweit, nur beim loslassen des Buttons läuft das Programm erneut durch. Ist dies vermeidbar?

Code: Alles auswählen

from machine import Pin
import time

led = Pin(3, Pin.OUT)
btn = Pin(6, Pin.IN)

while True:

    if btn()==0:
        led.off()

    else:
        led.on()
        time.sleep(2)
        led.off()
        while btn()==1:
        led.off
So sieht es im Moment aus.

Mit Freundlichen Grüßen
imonbln
User
Beiträge: 149
Registriert: Freitag 3. Dezember 2021, 17:07

Gibt es noch weitere Aufgaben für den Pico Pi? Wenn es sonst nichts zu tun gibt, rate ich zu einem NE555 als monostabile Kippstufe, das ist Hardware im Wert von ein paar Cents, gut dokumentiert überall und tausendfach erprobt.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das Programm so wie es da steht ist fehlerhaft, weder ist das led.off rightig eingerueckt, noch hat es die notwendigen Klammern. Und wenn man nix tun will in Python, schreibt man "pass"

Code: Alles auswählen

while True:
    pass
Und was genau heisst "laeuft nochmal durch"? Schaltet nochmal? Dann hast du wahrscheinlich Prellen, und solltest einfach nochmal kurz warten nach der inneren while-schleife. Oder schauen, ob es debouncing schon in der Pin-Klasse eingebaut gibt.

@imonbln: eigentlich hast du recht, aber man muss noch ne breakout platine dazu besorgen, und die Entprellung durch ein RC-Glied bauen, etc. pp. Billiger ist das, aber nicht weniger aufwaendig, und das ist hier denke ich der dominierendere Faktor.
donpatriko
User
Beiträge: 3
Registriert: Dienstag 19. April 2022, 12:09

imonbln hat geschrieben: Dienstag 19. April 2022, 16:54 Gibt es noch weitere Aufgaben für den Pico Pi? Wenn es sonst nichts zu tun gibt, rate ich zu einem NE555 als monostabile Kippstufe, das ist Hardware im Wert von ein paar Cents, gut dokumentiert überall und tausendfach erprobt.
Das mit dem NE555 hab ich auch versucht, nur hab ich das mit der Automatischen Abschaltung nicht hinbekommen. Es muss nach spätestens 5 Sekunden der Ausgang Automatisch wieder ausgeschaltet werden.
__deets__ hat geschrieben: Dienstag 19. April 2022, 17:04 Das Programm so wie es da steht ist fehlerhaft, weder ist das led.off rightig eingerueckt, noch hat es die notwendigen Klammern. Und wenn man nix tun will in Python, schreibt man "pass"

Code: Alles auswählen

while True:
    pass
Und was genau heisst "laeuft nochmal durch"? Schaltet nochmal? Dann hast du wahrscheinlich Prellen, und solltest einfach nochmal kurz warten nach der inneren while-schleife. Oder schauen, ob es debouncing schon in der Pin-Klasse eingebaut gibt.

@imonbln: eigentlich hast du recht, aber man muss noch ne breakout platine dazu besorgen, und die Entprellung durch ein RC-Glied bauen, etc. pp. Billiger ist das, aber nicht weniger aufwaendig, und das ist hier denke ich der dominierendere Faktor.
Danke dir deets. Das mit dem Prellen war das wohl. Ich habe noch 2 weitere Pausen eingebaut und jetzt klappt es. Vielen Dank euch.

Code: Alles auswählen

from machine import Pin
import time

led = Pin(3, Pin.OUT)
btn = Pin(6, Pin.IN)

while True:
    pass
    if btn()==1:
        led.on()
        time.sleep(1)
        led.off()
        time.sleep(1)
        while btn()==1:
            led.off()
            time.sleep(1)
        
    else:
        led.off()
        
        
 
Echt ein Klasse Forum hier. Ich hoffe ihr helft mit auch bei meinem anderen Projekt^^
Benutzeravatar
Dennis89
User
Beiträge: 1226
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

so macht das 'pass' aber keinen Sinn? Es dient ja eher als Platzhalter, wenn du zum Beispiel während der Programmierung eine leere Funktion erstellst, weil du diese erst "später" füllst, kannst du mit 'pass' dem Python-Interpreter sagen, dass das kein Fehler ist und er an dieser Stelle einfach nichts machen soll. (Oder?)

Dann verwende bitte gleich von Anfang an, keine Abkürzungen, die nicht allgemein üblich sind.

Nach 'led.of()' sehe ich noch keinen Sinn für ein 'sleep'. Dann wird ununterbrochen 'led.off()' aufgerufen, aber eigntlich wurde die Led ja schon ausgeschaltet und man muss nur dafür sorgen, dass die Led nicht wieder eingeschaltet wird. Dann könnte man ja einfach so lange eine Schleife laufen lassen, die nichts macht und die erst beendet wird, wenn der Button nicht mehr gedrückt wird.
Dann würde ich ein 'sleep' nach dem Durchlauf der Hauptschleife einbauen.

Also vielleicht so:

Code: Alles auswählen

from machine import Pin
import time

led = Pin(3, Pin.OUT)
button = Pin(6, Pin.IN)

while True:
    if button() == 1:
        led.on()
        time.sleep(1)
        led.off()
        while True:
            if button() == 0:
                break
            time.sleep(0.5)
    else:
        led.off()
    time.sleep(0.1)
Dann schreibt man in Python keinen ausführbaren Code auf Modulebene. Sondern schreibt Funktionen, in denen etwas passiert. Auf Modulebene gehören nur Konstanten, Funktionen- und Klassendefinitionen.
Konstanten wären bei dir die zwei Pin-Nummern.

Code: Alles auswählen

from machine import Pin
import time

LED_PIN = 3
BUTTON_PIN = 6


def main():
    led = Pin(LED_PIN, Pin.OUT)
    button = Pin(BUTTON_PIN, Pin.IN)

    while True:
        if button() == 1:
            led.on()
            time.sleep(1)
            led.off()
            while True:
                if button() == 0:
                    break
                time.sleep(0.5)
        else:
            led.off()
        time.sleep(0.1)


if __name__ == "__main__":
    main()
Wenn du weiterhin Interesse an Änderungen/Verbesserungen hast, könntest du dir mal folgendes anschauen:
https://docs.micropython.org/en/latest/ ... ne.Pin.irq

Grüße
Dennis

Edit: Eigentlich kann der 'else'-Zweig ja auch weg. Wir sorgen dafür, dass die LED zu Beginn aus ist, dann geht sie an, wenn der Button gedrückt wird und geht dann eh wieder aus und erst wieder ein, wenn der Button wieder losgelassen und gedrückt wird.

Code: Alles auswählen

from machine import Pin
import time

LED_PIN = 3
BUTTON_PIN = 6


def main():
    led = Pin(LED_PIN, Pin.OUT)
    button = Pin(BUTTON_PIN, Pin.IN)
    led.off()

    while True:
        if button() == 1:
            led.on()
            time.sleep(1)
            led.off()
            while True:
                if button() == 0:
                    break
                time.sleep(0.5)
        time.sleep(0.1)


if __name__ == "__main__":
    main()
"When I got the music, I got a place to go" [Rancid, 1993]
Antworten