Nyborjare pa python

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Sunkann
Inlägg: 24
Blev medlem: 12 december 2017, 08:00:14

Nyborjare pa python

Inlägg 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.
Senast redigerad av Sunkann 11 februari 2018, 10:20:32, redigerad totalt 2 gånger.
Nerre
Inlägg: 26655
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: Nyborjare pa python

Inlägg 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).
Användarvisningsbild
Icecap
Inlägg: 26105
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Nyborjare pa python

Inlägg 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.
Nerre
Inlägg: 26655
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: Nyborjare pa python

Inlägg av Nerre »

Den här gick rätt snabbt att googla fram:
http://raspi.tv/2013/how-to-use-interru ... d-rpi-gpio
Sunkann
Inlägg: 24
Blev medlem: 12 december 2017, 08:00:14

Re: Nyborjare pa python

Inlägg 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.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43148
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Nyborjare pa python

Inlägg 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.
Användarvisningsbild
mrfrenzy
Co Admin
Inlägg: 14818
Blev medlem: 16 april 2006, 17:04:10

Re: Nyborjare pa python

Inlägg 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.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43148
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Nyborjare pa python

Inlägg 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...
Nerre
Inlägg: 26655
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: Nyborjare pa python

Inlägg 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.
Skriv svar