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
Einschaltdauer Begrenzen
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.
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.
-
- 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?
So sieht es im Moment aus.
Mit Freundlichen Grüßen
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
Mit Freundlichen Grüßen
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 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"
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.
Code: Alles auswählen
while True:
pass
@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.
-
- User
- Beiträge: 3
- Registriert: Dienstag 19. April 2022, 12:09
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.
Danke dir deets. Das mit dem Prellen war das wohl. Ich habe noch 2 weitere Pausen eingebaut und jetzt klappt es. Vielen Dank euch.__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"
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.Code: Alles auswählen
while True: pass
@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.
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()
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:
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.
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.
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)
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()
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]