Hallo ich benötige ein Programm für einen Rapsberry PI Pico mit RP 2040. Das Programm sollte, wenn mit einem Taster ein Eingang angesteuert wird, einen Ausgang 1 mal betätigen. Beim zweiten Takt 2 mal, beim 3. 3 mal usw. bis zum 8. Takt 8 mal, dann wieder von vorne, d.h. beim 9. Takt wieder 1 mal. Da ich leider vom Programmieren so gut wie keine Ahnung habe, wäre ich für Hilfe sehr dankbar.
Zum Programmieren benutze ich Thonny.
:
Bearbeitet durch User
Wie sollen die Zeiten von Impuls und Pause am Ausgang sein? Was soll passieren, wenn während der Pulsausgabe die Taste erneut gedrückt wird?
Hans-Joachim M. schrieb: > ich benötige ein Programm für einen Rapsberry PI Pico mit RP 2040. Das > Programm sollte, wenn mit einem Taster ein Eingang angesteuert wird, > einen Ausgang 1 mal betätigen. Beim zweiten Takt 2 mal, beim 3. 3 mal > usw. bis zum 8. Takt 8 mal, dann wieder von vorne, d.h. beim 9. Takt > wieder 1 mal. Warum willst du dafür den RP2040 benutzen? Das geht zwar, ist aber maximal überdimensioniert. So wie wenn man mit einem 40t LKW zum Einkaufen fährt. > Da ich leider vom Programmieren so gut wie keine Ahnung > habe, wäre ich für Hilfe sehr dankbar. Wie lang sollen die Einzelpulse sein? Wie lang die Pausen dazwischen?
An welchen Pins hängt dein Taster und wo sollen die Pulse rauskommen?
Ich bin zwar kein Freund von der stromfressenden Zufallsgeneratoren, aber das würde ChatGPT sicherlich binnen weniger Sekunden zusammenhalluzinieren können...
:
Bearbeitet durch User
Voila:
1 | from machine import Pin |
2 | import time |
3 | |
4 | # Pins definieren |
5 | input_pin = Pin(14, Pin.IN, Pin.PULL_DOWN) |
6 | output_pin = Pin(15, Pin.OUT) |
7 | |
8 | # Konfiguration |
9 | pulse_count = 1 |
10 | DEBOUNCE_MS = 50 # Zeit zum Entprellen in Millisekunden |
11 | |
12 | def send_pulses(n): |
13 | """Erzeugt n Pulse am Ausgang (100ms an, 100ms aus).""" |
14 | for _ in range(n): |
15 | output_pin.value(1) |
16 | time.sleep_ms(100) |
17 | output_pin.value(0) |
18 | time.sleep_ms(100) |
19 | |
20 | print("Programm läuft (Polling-Mode)...")
|
21 | |
22 | while True: |
23 | # 1. Schritt: Prüfen, ob der Eingang auf HIGH geht |
24 | if input_pin.value() == 1: |
25 | # Software-Entprellung: Kurz warten und nochmal prüfen |
26 | time.sleep_ms(DEBOUNCE_MS) |
27 | |
28 | if input_pin.value() == 1: |
29 | # Gültiger Impuls erkannt! |
30 | print(f"Impuls erkannt! Sende {pulse_count} Pulse...")
|
31 | send_pulses(pulse_count) |
32 | |
33 | # Zähler erhöhen und bei 9 zurücksetzen |
34 | pulse_count += 1 |
35 | if pulse_count > 8: |
36 | pulse_count = 1 |
37 | |
38 | # Warten, bis der Eingang wieder LOW ist (Edge-Detection Ersatz) |
39 | # Verhindert, dass ein langer Druck als mehrere Impulse zählt |
40 | while input_pin.value() == 1: |
41 | time.sleep_ms(10) |
42 | |
43 | # Kurze Pause für die CPU-Entlastung |
44 | time.sleep_ms(10) |
Hans-Joachim M. schrieb: > Hallo > ich benötige ein Programm für einen Rapsberry PI Pico mit RP 2040. Das > Programm sollte, wenn mit einem Taster ein Eingang angesteuert wird, > einen Ausgang 1 mal betätigen. Beim zweiten Takt 2 mal, beim 3. 3 mal > usw. bis zum 8. Takt 8 mal, dann wieder von vorne, d.h. beim 9. Takt > wieder 1 mal. Da ich leider vom Programmieren so gut wie keine Ahnung > habe, wäre ich für Hilfe sehr dankbar. Versuch das hier mal:
1 | #!/python
|
2 | # vim: fileencoding=utf-8: ts=4: sw=4: expandtab:
|
3 | |
4 | from machine import Pin,Timer |
5 | from time import sleep_ms |
6 | |
7 | class Button: |
8 | |
9 | def __timcb(self, tim): |
10 | if self.b(): |
11 | self.count = min(0, self.count - 1) # Entprellung |
12 | if self.count == 0: # |
13 | self.state = False |
14 | else: |
15 | self.count = max(self.count + 1, 5) # Entprellung |
16 | if self.count == 5: # |
17 | if not self.state: # Eingabe erkannt |
18 | self.state = not self.state |
19 | self.events.append(1) # In die Liste aufnehmen |
20 | |
21 | def __init__(self, gpio, ramp=10): |
22 | self.b = Pin(gpio, Pin.IN, Pin.PULL_UP) |
23 | sleep_ms(50) |
24 | self.state = False |
25 | self.count = 0 |
26 | self.events = [] |
27 | self.rampn = ramp |
28 | self.tim = Timer(mode=Timer.PERIODIC, freq=1000, callback=self.__timcb) |
29 | |
30 | @property
|
31 | def event(self): |
32 | if len(self.events): |
33 | self.events.pop(0) |
34 | return True |
35 | return False |
36 | |
37 | |
38 | ramp = 5 # Entprellung in Millisekunden |
39 | led = Pin(25, Pin.OUT) # Ausgabe Pin |
40 | button = Button(24, ramp) # Button gegen Ground/Masse |
41 | led.off() |
42 | outseq = 0 |
43 | while True: |
44 | sleep_ms(50) |
45 | if button.event: # Liste abfragen |
46 | for _ in range(outseq+1): |
47 | led.on() |
48 | sleep_ms(200) # Ein-Dauer |
49 | led.off() |
50 | sleep_ms(200) # Aus-Dauer |
51 | sleep_ms(500) # Pause zwischen den Sequenzen |
52 | outseq = (outseq + 1) % 8 |
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.