Raspberry Pi Maceralarım No-08
Raspberry Pi 3 GPIO ile İki Yönde Yürüyen ve Rasgele Yanıp Sönen Işıklar
Önceki yazımda “Yürüyen ışık” örneğini vermiştim. Bu kez iki betik vereceğim. Birinci betikle aynı LED’lerin her iki yönde yürümesini, diğeriyle ise LED’lerin rasgele yanıp sönmesini sağlayacağız.
GPIO iğne yerleşim şemasını bir kez daha paylaşayım:
İki yönlü yürüyen ışık kodlarımız kolay anlaşılır:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
# -*- coding: utf-8 -*- # led0404.py # gidip-dönen ışık from __future__ import print_function import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BOARD) GPIO.setwarnings(False) pinler=[12,16,18,11,13,15,22,24,26,32] for pin in pinler: GPIO.setup(pin, GPIO.OUT) def hepsini_sondur(): for pin in pinler: GPIO.output(pin,False) def pini_yak(pin): GPIO.output(pin,True) bekle= 0.2 #ledin yanık kalma süresi try: while True: for pin in range(len(pinler)): hepsini_sondur() pini_yak(pinler[pin]) time.sleep(bekle) for pin in range(len(pinler)-1,-1,-1): hepsini_sondur() pini_yak(pinler[pin]) time.sleep(bekle) except KeyboardInterrupt: GPIO.cleanup() |
Kodların açıklaması
Sadece while döngüsü içindeki ikici for bloğu öncekinden farklı
1 2 3 4 |
for pin in range(len(pinler)-1,-1,-1): hepsini_sondur() pini_yak(pinler[pin]) time.sleep(bekle) |
Bu bloktaki tek fark, for döngüsünün sondan başlayıp, birer birer azalarak sıfıra kadar inmesi…
İlk örneğimizdeki 10 ledli devreyi ikinci betiğimizde de kullanıyoruz.
Kodlarımız şöyle:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
#led0405.py # rasgele yanan ledler import RPi.GPIO as GPIO import time, random GPIO.setmode(GPIO.BOARD) GPIO.setwarnings(False) pinler=[12,16,18,11,13,15,22,24,26,32] for pin in pinler: GPIO.setup(pin, GPIO.OUT) def hepsini_sondur(): for pin in pinler: GPIO.output(pin,False) def pini_yak(pin): GPIO.output(pin,True) try: while True: hepsini_sondur() pin=pinler[random.randint(0,len(pinler)-1)] pini_yak(pin) bekle=random.randint(0,10)/50.0 time.sleep(bekle) except KeyboardInterrupt: GPIO.cleanup() |
Bu betiğimizde sadece while bloğunun içeriği farklı. (Burada random modülünü kullandığımız için betiğin başında bu modülü içeri aktarıyoruz.)
1 2 3 4 5 6 |
while True: hepsini_sondur() pin=pinler[random.randint(0,len(pinler)-1)] pini_yak(pin) bekle=random.randint(0,10)/50.0 time.sleep(bekle) |
Döngünün her aşamasında önce tüm ledlerin söndüğünden emin olmak için hepsini_sondur() fonksiyonunu çağırıyoruz.
Daha sonra pinler[] listesinden, indis numarasını 0 ile liste boyu arasından rasgele seçtirdiğimiz bir sayıyı kullanarak, rasgele bir LED numarası belirleyip pin değişkenine aktarıyoruz.
Pin numarasını vererek yaktığımız LED’in yanık kalma süresini de 0 ile 9 arasındaki rasgele bir sayıyı 50.0’ye bölerek saptıyoruz. bekle değişkenine atadığımız bu değeri, time.sleep() fonksiyonuna argüman olarak vererek LED’in yanık kalma süresini belirliyoruz.
Kısacası, bu betiğimizde hem yanacak LED’in indisini, hem de yanık kalma süresini rasgele belirledik. Bu süreyi
1 |
bekle=random.randint(0,10)/50.0 |
satırındaki değerlerle oynayarak istediğiniz gibi değiştirebilirsiniz.
LED’lerimizin davranışını gösteren videomuz aşağıda.
Bir sonraki yazımda GPIO 12 numaralı iğnenin PWM (Pulse Width Modulation) özelliğini kullanarak bir LED’in parlaklığını istediğimiz gibi denetlemeyi örnekleyeceğim.
Beni izlemeye devam edin.
Ahmet Aksoy
Raspberry Pi Maceralarım No-08