Sida 1 av 1

Nyborjare pa python

Postat: 11 februari 2018, 10:12:57
av Sunkann
Har precis fatt hem en RPi och börjat lära mig python, i form av trial and error.
Planen är att styra ved pannan och shunt grupper.
Sen dyker det nog upp mera grejer i framtiden.

I koden nedanför vill jag att lamporna skall byta blinkningarna direkt knappen trycks ned.
Som det är nu måste jag trycka på knappen vid rätt tillfälle i koden.
Hur skall jag tänka för att lyckas med det?

Finns det tutorials eller läsning som hjälper mig i rätt riktning?




Kod: Markera allt

import RPi.GPIO as IO

import time

IO.setmode(IO.BCM)

knapp = 16

lampa = 20 

lampa2 = 21

IO.setup(knapp, IO.IN, pull_up_down=IO.PUD_DOWN)

IO.setup(lampa, IO.OUT)

IO.setup(lampa2, IO.OUT)

IO.output(lampa, True)
IO.output(lampa2, True)

time.sleep(5)

IO.output(lampa, False)
IO.output(lampa2, False)


try:
	while True:
		if not IO.input(knapp):
			IO.output(lampa2, True)
			IO.output(lampa, False)
			time.sleep(1)
			IO.output(lampa2, False)
			IO.output(lampa, True)
			time.sleep(1)
		else:
			IO.output(lampa2, True)
                        IO.output(lampa, True)
                        time.sleep(0.3)
                        IO.output(lampa2, False)
                        IO.output(lampa, False)
                        time.sleep(0.3)
			IO.output(lampa2, True)
                        IO.output(lampa, True)
                        time.sleep(0.3)
                        IO.output(lampa2, False)
                        IO.output(lampa, False)
                        time.sleep(0.3)
			IO.output(lampa2, True)
                        IO.output(lampa, True)
                        time.sleep(0.3)
                        IO.output(lampa2, False)
                        IO.output(lampa, False)
                        time.sleep(0.3)
			IO.output(lampa, True)
			IO.output(lampa2, True)
			time.sleep(5)

except KeyboardInterrupt:
	IO.cleanup
print ("hej hej")

Nu blir det lite konstigt efter else: biten, allt skall ligga efter varann i samma linje.

Re: Nyborjare pa python

Postat: 11 februari 2018, 10:15:14
av Nerre
Antingen har man en huvudloop som är så snabb att den hinner känna av en knapptryckning oavsett när tryckningen sker (trycker man på en knapp så håller man den ofta inne några millisekunder i alla fall), eller så bygger man en krets som "förlänger" knapptrycket lite (en enkel RC-länk kan räcka), eller så använder man interrupt (det är väl det snyggaste, men också svåraste att koda).

Re: Nyborjare pa python

Postat: 11 februari 2018, 11:43:50
av Icecap
Ett MYCKET stort problem är just sleep().

Jag gillar inte Python men har fibblat lite med det - men jag undrar om inte det finns möjlighet att lägga en event som är kopplat till systemklockan så att det i grunden fungerar som en timer-interrupt.

Jag misstänker starkt att man kan göra det och då lägger man in knapptryckningskollen där. Den håller sedan koll på vilka knappar som är påverkade nyss och vilka som är "gamla" och signalerar detta med flaggor.

Main-loop'en tar sedan hand om dessa flaggor när det blir dags.

Re: Nyborjare pa python

Postat: 11 februari 2018, 12:14:19
av Nerre
Den här gick rätt snabbt att googla fram:
http://raspi.tv/2013/how-to-use-interru ... d-rpi-gpio

Re: Nyborjare pa python

Postat: 11 februari 2018, 13:12:52
av Sunkann
Tackar för svar.
Hamnade också på den sidan, men får studera den senare då mera tid finnes.
Lär återkomma framöver med mera enkla frågor allt efter jag tar mig framåt.

Re: Nyborjare pa python

Postat: 11 februari 2018, 14:23:47
av sodjan
> Den här gick rätt snabbt att googla fram:

Fungerar det bra då?

Som jag ser det så hänger koden i "GPIO.wait_for_edge(...)".
Inget riktigt interrupt så sm jag ser det. I så fall borde man
kunna koppla en separat funktion till avbrottet och man kan
köra sin vanliga main kod under tiden.

Re: Nyborjare pa python

Postat: 11 februari 2018, 14:28:39
av mrfrenzy
Klicka vidare till part 2, där kommer fortsättningen hur man använder interrupten på ett meningsfullt sätt.

Sedan kommer också lite om timers.

I senare versioner har dom även inkluderat debounce i biblioteket så man inte behöver skriva det själv.

Re: Nyborjare pa python

Postat: 11 februari 2018, 14:31:22
av sodjan
Ha, det var inte lätt att se den länken till del 2... :-)
Men visst, det ser ju mycket bättre ut...

Re: Nyborjare pa python

Postat: 11 februari 2018, 15:08:17
av Nerre
sodjan skrev: Som jag ser det så hänger koden i "GPIO.wait_for_edge(...)".
Inget riktigt interrupt så sm jag ser det. I så fall borde man
kunna koppla en separat funktion till avbrottet och man kan
köra sin vanliga main kod under tiden.
Jag tolkade det som att den funktionen skapade interrupten, men jag missade som sagt var också länken till del 2.