Kérdés:
Hogyan lehet folyamatosan villogni a LED-ek be / ki alatt, miközben folytatódik egy szkript végrehajtása?
Stephen Lead
2015-03-25 03:53:15 UTC
view on stackexchange narkive permalink

Piros és zöld LED-eket csatlakoztattam a GPIO-n keresztül, és sikeresen ki- és bekapcsolhatom őket a RPi.GPIO használatával - most szeretném:

  • indítson egy másodpercenként villogó ledot be / ki
  • a szkript folytatásával Hasonló példa a Raspberry Pi E-mail értesítő, amely LED-eket használ projekt, kivéve abban az esetben, ha a ledek világítanak, és a szkript csak a következő ellenőrzésig vár:
      ha új levelek > NEWMAIL_OFFSET: GPIO.output (GREEN_LED, True) GPIO.output (RED_LED, False) else: GPIO.output (GREEN_LED, False) GPIO.output (RED_LED, True) time.sleep (MAIL_CHECK_FREQ) > 

    Lehetséges ilyesmi, mint ez az álkód?

      cont = Igaz folytatás: ellenőrizze a leveleket, ha új levelek vannak: flashLed (zöld) else: flashLed ( piros) végezzen más dolgokat, miközben a megfelelő fény villog (nem csak az idő. alvás) def villog LED (szín): ne villogjon a másik szín villogni kezd ennek a színnek a visszatérése a hívó programhoz  

    Ahhoz, hogy ez működjön, azt képzelem, hogy a flashLed függvénynek el kell kezdenie a megfelelő led villogását, majd vissza kell adnia a fő szkript törzs.

    Ez lehetséges a Python használatával? Van jobb megközelítés?

öt válaszokat:
Stephen Lead
2015-03-26 05:51:55 UTC
view on stackexchange narkive permalink

Köszönet a @ user451777-nek a menetfúrásért. Módosítottam a Signaling Threads között szkriptet, és a következőket állítottam elő:

  import szálak, véletlenszerű importból randintdef flashLed (e, t): "" "villog a megadott másodpercenként "" ", miközben nem e.isSet (): print (színes) time.sleep (0.5) event_is_set = e.wait (t) if event_is_set: print ('villogástól elvezetett') else: print (' led off ') time.sleep (0.5) color = "red" e = threading.Event () t = threading.Thread (név =' nem blokkolt ', cél = flashLed, args = (e, 2)) t. start () i-re a (0, 10) tartományban: # Véletlenszerűen rendeljen pirosat vagy zöldet 10 másodpercenként randomNumber = randint (0,10) print (randomNumber) if (randomNumber < 5): color = "green" else: color = "piros" time.sleep (10) e.set ()  

Ez szimulálja a vonatkozó led be- és kikapcsolását egy szálban, miközben a program futtatása folytatódik a fő szálban. Fontos, hogy a flashLed függvény nem zárja le a végrehajtást, amíg a ledek villognak.

A fő szál globális változóval állítja be a led színét, a másik szál pedig a globális változó a releváns led bekapcsolásához. Úgy gondolom, hogy a globális változókat általában rosszallják, ezért szeretnék hallani bármilyen jobb megközelítésről.

Stephen köszönöm, hogy elküldte a megoldását - rendkívül hasznos
Az "event_is_set = e.wait (t)" helyébe az "event_is_set = e.is_set ()" kifejezés lép. Ellenkező esetben minden híváshoz hozzáad egy `t 'késleltetést, amikor a zászló ki van kapcsolva.
josxou15
2017-07-18 00:55:11 UTC
view on stackexchange narkive permalink

Viszonylag új vagyok a Pythonban, de a végrehajtás folytatása közben felvillantottam a LED-eket az RPi.GPIO modulba épített Pulse Width Modulation (PWM) segítségével. Véleményem szerint ez sokkal könnyebb és egyszerűbb módszer volt, mint a szálfűzés, ahogy más válaszolók javasolják, azonban mindkét módszer jól működne.

Egyszerűen hozzon létre egy kívánt frekvenciájú PWM objektumot, majd hívja meg a PWM.start (DC) és a PWM.ChangeDutyCycle (DC) a LED-es munkaciklus elindításához / megváltoztatásához. Folytassa a kódot, majd hívja meg a PWM.stop () gombot a LED leállításához.

  #setup GPIO csapok és importálja a GPIO modult g = GPIO.PWM (pin1,1) r = GPIO. PWM (pin2,1) g.start (0) r.start (0) greenStatus = False redStatus = False def flashLED (szín): globális greenStatus, redStatus ha color == 'green': ha redStatus: r.ChangeDutyCycle (0 ) redStatus = Hamis, ha nem zöld próbálkozzon: igaz: ha newMail (): flashLED ('zöld') else: flashLED ('piros') # más dolgokat itt végez, és a LED továbbra is villog, kivéve a KeyboardInterrupt: g.stop () r.stop () GPIO.cleanup ()  

Alapvetően ez a kód mindkét LED-et 0 munkaciklussal indítja, így nem jelennek meg. Minden alkalommal, amikor a flashLED (színes) hívást kezdeményezi, ellenőrzi, hogy a szemközti LED kialszik-e, ha nem, akkor a működési ciklusát nullára állítja. Ezután bekapcsolja a másik LED-et, ha még nincs bekapcsolva. A kód egy try / kivételbe van csomagolva, így a végén mindkét PWM objektum leáll és a GPIO csapok megtisztulnak.

user451777
2015-03-25 09:11:08 UTC
view on stackexchange narkive permalink

Azt javasolnám, hogy menetes legyen. Nem használtam a Python-ban példaként, de létrehoz egy másik végrehajtási szálat, amely párhuzamosan fut a végrehajtás fő szálával. Remélhetőleg néhány kódpélda következik az Ön számára.

http://pymotw.com/2/threading/

paddyg
2015-04-03 22:30:09 UTC
view on stackexchange narkive permalink

@Stephen Lead, kérdezz a globális kérdésekről. Időnként a szálfüggvényeknél a globálisok ésszerű lehetőségnek tűnnek, mivel az alternatívák bonyolultabbak lehetnek. Jó szokás azonban mindig kifejezetten globálisnak nyilvánítani őket. ):

mert egy bizonyos szakaszban megpróbálsz hozzárendelni a változóhoz, és megpróbálod kitalálni, miért tűnik ennek semmi hatása.

Megteheted olyan argumentumokat adjon át a függvénynek, amelyeket a program más részei vagy a függvénye megváltoztat, de az argumentumoknak mutábilis objektumoknak kell lenniük. A legegyszerűbb példa egy lista lenne, majd a csak kissé mesterséges:

  def flashLed (e, t, color): ... print (color [0]) color = ["piros"] e = threading.Event () t = threading.Thread (név = 'nem blokkolt', target = flashLed, args = (e, 2, szín)) ... if (randomNumber < 5) : color [0] = "zöld"  

Ha szélesebb körű információval rendelkezel a két szál közötti kommunikációhoz, akkor egy lista logikusabbnak tűnhet. A várólisták használata is meglehetősen egyszerű, és érdemes megnézni a dokumentumokban.

developius
2015-03-25 16:22:02 UTC
view on stackexchange narkive permalink

Tehet ilyet:

  while True: if newMail (): # true értéket ad vissza, ha új levelet, hamis, ha nem flashLED ("zöld") else: villog (piros ") def flashLED (szín): ha color ==" piros ": pin = 18 # szám helyettesítése GPIO számmal, ha color ==" zöld ": pin = 24 # szám helyettesítése GPIO számmal GPIO.output (pin, True) # cserélje ki a PIN kódot a GPIO számra time.sleep (1) GPIO.output (pin, False)  

Ennek az az előnye, hogy nincs benne szálfűzés. A newMail () magad, kivéve, ha egy könyvtárban elérhető hasonló funkció ( ez a válasz megoldást nyújt a Gmail és a POP számára)

Köszönöm a borravalót. De hacsak nem tévedek, ez csak egyszer villog a ledeken, majd kilép a funkcióból. Reméltem, hogy a led villogni kezd, villogni kezd, miközben más feladatokat végzek, majd egy későbbi jelre leállítom a villogást. Úgy tűnik, hogy ehhez valójában külön szálra lehet szükség
Ez a kód a LED-et villogni fogja, minden alkalommal, amikor a hurok végrehajtódik. Ha más feladatokat szeretne elvégezni, akkor tegye csak az if / else után.


Ezt a kérdést és választ automatikusan lefordították angol nyelvről.Az eredeti tartalom elérhető a stackexchange oldalon, amelyet köszönünk az cc by-sa 3.0 licencért, amely alatt terjesztik.
Loading...