Soru:
Bir komut dosyası yürütülürken LED'ler sürekli olarak nasıl yanıp söner / kapatılır?
Stephen Lead
2015-03-25 03:53:15 UTC
view on stackexchange narkive permalink

GPIO üzerinden kırmızı ve yeşil ledleri bağladım ve bunları RPi.GPIO kullanarak başarıyla açıp kapatabiliyorum - şimdi şunu yapmak istiyorum:

  • her 1 saniyede bir ledin yanıp sönmesini başlatın
  • komut dosyasının yürütülmesini sağlayın
  • ledin başka bir sinyalde yanıp sönmesini durdurun

Benzer bir örnek, Raspberry Pi E-mail Notifier Using LEDs projesidir, ancak bu durumda ledler sürekli yanar ve komut dosyası bir sonraki kontrole kadar bekler:

  if newmails > 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)  

Bu sözde kod gibi bir şey yapmak mümkün mü?

  cont = Truewhile cont: yeni posta ise kontrol edin: flashLed (yeşil) else: flashLed ( kırmızı) ilgili ışık yanıp sönerken başka şeyler yapın (sadece zaman. uyku değil) def flashLed (renkli): yanıp sönmeyi durdur diğer renk yanıp sönmeye başlar bu rengi çağıran programa geri dönün  

Bunun çalışması için flashLed işlevinin ilgili ledin yanıp sönmesini başlatması ve ardından yürütmeyi yeniden başlatması gerektiğini düşünüyorum. ana komut dosyası gövdesi.

Bu Python kullanılarak mümkün müdür? Daha iyi bir yaklaşım var mı?

Beş yanıtlar:
Stephen Lead
2015-03-26 05:51:55 UTC
view on stackexchange narkive permalink

Diş açma ile ilgili ipucu için @ user451777'ye teşekkürler. Signaling Between Threads komut dosyasını değiştirdim ve şunu buldum:

  import threading, timefrom random import randintdef flashLed (e, t): "" "flash e.isSet () değilken her saniyede bir led "" ": print (color) time.sleep (0.5) event_is_set = e.wait (t) if event_is_set: print ('stop led from flashing') else: print (' leds off ') time.sleep (0.5) color = "red" e = threading.Event () t = threading.Thread (name =' non-block ', target = flashLed, args = (e, 2)) t. start () aralıktaki i için (0, 10): # Her 10 saniyede bir rastgele kırmızı veya yeşil atayın randomNumber = randint (0,10) print (randomNumber) if (randomNumber < 5): color = "green" else: color = "red" time.sleep (10) e.set ()  

Bu, programın yürütülmesi ana iş parçacığında devam ederken bir iş parçacığında ilgili ledin açılıp kapanmasını simüle eder. En önemlisi, flashLed işlevi ledler yanıp sönerken yürütmeyi kilitlemez.

Ana iş parçacığı led rengini ayarlamak için global bir değişken kullanır, diğer iş parçacığı ise İlgili led'i açmak için global değişken. Genel olarak küresel değişkenlerin hoş görülmediğine inanıyorum, bu nedenle daha iyi yaklaşımları duymak isterim.

Stephen çözümünüzü gönderdiğiniz için teşekkür ederiz - son derece yararlı
"event_is_set = e.wait (t)", "event_is_set = e.is_set ()" ile değiştirilmelidir. Aksi takdirde, bayrak kapalıyken her çağrı için "t" tutarında bir gecikme ekliyorsunuz.
josxou15
2017-07-18 00:55:11 UTC
view on stackexchange narkive permalink

Python'da nispeten yeniyim, ancak RPi.GPIO modülünde yerleşik olan Darbe Genişliği Modülasyonunu (PWM) kullanarak yürütmeye devam ederken LED'leri yakıp söndürebildim. Bence bu, diğer cevaplayıcıların önerdiği gibi iş parçacığı oluşturmadan çok daha kolay ve daha basit bir yoldu, ancak her iki yöntem de işe yarardı.

İstenen sıklıkta bir PWM nesnesi oluşturun ve ardından PWM.start (DC) 'yi çağırın ve LED görev döngüsünü başlatmak / değiştirmek için PWM.ChangeDutyCycle (DC). Kodunuzla devam edin ve ardından LED'i durdurmak için PWM.stop () 'u arayın.

  #setup GPIO pinleri ve GPIO modülünü içe aktarın g = GPIO.PWM (pin1,1) r = GPIO. PWM (pin2,1) g.start (0) r.start (0) greenStatus = False redStatus = False def flashLED (renk): global greenStatus, redStatus eğer color == 'green': eğer red ) redStatus = Green değilse False: g.ChangeDutyCycle (50) greenStatus = True elif color == 'red': greenStatus: g.ChangeDutyCycle (0) greenStatus = Red değilse False try: while True: if newMail (): flashLED ('green') else: flashLED ('red') # burada başka şeyler yapın ve KeyboardInterrupt dışında LED yanıp sönmeye devam edecek: g.stop () r.stop () GPIO.cleanup ()  

Temel olarak bu kod, her iki LED'i de 0 görev döngüsü ile başlatır, böylece kapalı görünürler. FlashLED (renkli) her çağrıldığında, karşıdaki LED'in kapalı olduğundan emin olmak için kontrol eder, değilse görev döngüsü 0'a sıfırlanır. Daha sonra, henüz açılmamışsa diğer LED'i açar. Kod, bir dene / hariç içine alınır, böylece sonunda her iki PWM nesnesi durdurulur ve GPIO pimleri temizlenir.

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

Diş açmayı tavsiye ederim. Python'da örnek vermek için kullanmadım ama ana yürütme iş parçacığına paralel çalışan başka bir yürütme dizisi oluşturacak. Umarım size bazı kod örnekleri gelir.

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

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

@Stephen Lead, küreseller hakkında sorunuz var. Bazen, genel işlevler iş parçacığı gibi şeylerle, alternatifler daha karmaşık olabileceğinden makul seçenekler gibi görünür. Ancak bunları her zaman açıkça global olarak ilan etmek iyi bir alışkanlıktır

  def flashLed (e, t): "" "e.isSet değilken" "" belirtilen led'i saniyede bir yak "" "global renk ):  

çünkü bir aşamada değişkene atama yapmaya çalışacak ve neden herhangi bir etkiye sahip olmadığını anlamaya çalışacaksınız.

Yapabilirsiniz işleve programınızın diğer bölümleri tarafından değiştirilen veya işleviniz tarafından değiştirilen bağımsız değişkenler iletin, ancak bağımsız değişkenler değiştirilebilir nesneler olmalıdır. En kolay örnek bir liste olabilir, sonra sonuçta sadece biraz yapay olan:

  def flashLed (e, t, color): ... print (color [0]) color = ["kırmızı"] e = threading.Event () t = threading.Thread (name = 'non-block', target = flashLed, args = (e, 2, color)) ... if (randomNumber < 5) : color [0] = "yeşil"  

İki iş parçacığı arasında iletişim kurmak için daha kapsamlı bilgileriniz varsa, bir liste daha mantıklı görünebilir. Kuyrukların kullanımı da oldukça basittir ve dokümanlarda göz atmaya değer.

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

Bunun gibi bir şey yapabilirsiniz:

  True iken: newMail (): # eğer yeni posta ise doğru, flashLED değilse yanlış ("yeşil") başka: flashLED ("kırmızı ") def flashLED (renk): eğer renk ==" kırmızı "ise: pin = 18 # eğer renk ==" yeşil "ise sayıyı GPIO numarasıyla değiştir: pin = 24 # numarayı GPIO numarası ile değiştirin GPIO.output (pin, True) # pini GPIO numarasıyla değiştirin time.sleep (1) GPIO.output (pin, False)  

Bunun avantajı, iş parçacığı içermemesidir. oluşturmanız gerekir Bir kitaplıkta benzer bir işlev yoksa newMail () kendinizinkini ( bu yanıt Gmail ve POP için bir çözüm sağlar)

Bahşiş için teşekkürler. Ama yanılmıyorsam, bu ledleri sadece bir kez yanıp sönecek ve ardından fonksiyondan çıkacaktır. Ledin yanıp sönmesini başlatmayı, diğer görevleri yaparken yanıp sönmeyi sürdürmeyi ve daha sonra bir sinyalde yanıp sönmeyi durdurmayı umuyordum. Görünüşe göre bu aslında ayrı bir ileti dizisi gerektiriyor
Bu kod, döngü her yürütüldüğünde LED'in yanıp sönmesini sağlayacaktır. Başka görevler yapmak istiyorsanız, bunları if / else'in arkasına koyun.


Bu Soru-Cevap, otomatik olarak İngilizce dilinden çevrilmiştir.Orijinal içerik, dağıtıldığı cc by-sa 3.0 lisansı için teşekkür ettiğimiz stackexchange'ta mevcuttur.
Loading...