سلام به همه.
بعد از اینکه من در قسمت قبل آموزش رزبری پای با پایتون با موفقیت تونستم کلید رو به رزبری وصل کنم، زئوس به من گفت پایه هستی یه چالش باحال بهت بدم؟ با خوشحالی قبول کردم و گفتم من مرد روز های سخت و چالشی هستم. اونم خندید و گفت یه برنامه بنویس که وقتی یه بار دکمه رو فشارمیدی LED روشن بشه، وقتی ۲ بار فشار میدی LED چشمک بزنه و وقتی دکمه رو به مدت ۳ ثانیه نگه میداری، LED خاموش بشه (صد البته که من عاشق پایتون هستم و این چالش رو هم به زبان پایتون برنامه نویسی و حلش میکنم).
من اولش یکم نشستم فکر کردم و دیدم با روش های سامورایی خیلی راحت میشه این چالش رو حل کرد. شما میتونید مراحل خاموش و روشن کردن LED با استفاده از دکمه رو توی قسمت قبل ببینید. اگه میخواین در حل چالش رقص نور همراه من باشید اول تا این مرحله که با استفاده از دکمه یه LED رو توی رزبری خاموش و روشن کنیم. با من پیش بیایید، از اینجا به بعد فقط کد های قبل رو دستکاری میکنیم.
شاید برای شما مفید باشد: آموزش رزبری پای از 0 تا 100 از مقدماتی تا پیشرفته
اولین چیزی که به ذهنم رسید این بود که یدونه فلگ بزارم برا اینکه چک کنم چه زمانی باید LED روشن و چه زمانی باید LED خاموش باشه. دوتا تابع هم لازم داشتم برا اینکه LED رو خاموش و روشن کنم.
که میشه این
1 2 3 4 5 6 7 | flag = 0 def off(): GPIO.output(4,False) def on(): if flag==1: GPIO.output(4,True) |
یه فلگ هم لازم داشتم برای اینکه چک کنم ببینم چه زمانی باید LED ثابت و چه زمانی باید LED چشمک زن باشه:
1 | push_time=0 |
دوتا متغیر هم باید برای محاسبه زمان فشرده شدن دکمه داشته باشم:
1 2 | up_time=0 down_time=0 |
حالا باید چک کنم وقتی دکمه فشار داده میشه تا وقتی رها میشه چقدر زمان میبره:
1 2 3 4 5 6 | if GPIO.input(button_pin): up_time=time.time() else: flag=1 down_time=time.time() |
بعد از این باید بررسی میکردم ببینم آیا در حال حاظر باید LED خاموش باشه یا روشن و توابع مربوط به اون رو فراخوانی کنم:
1 2 3 4 5 6 | if -1 > up_time-down_time < -3 : off() flag=0 elif up_time-down_time<1: on() |
حالا باید دید که دفعه چنده که دکمه فشرده میشه و LED باید خاموش باشه یا روشن:
1 2 3 4 5 | elif push_time%2==0: on() sleep(sleep_time) off() sleep(sleep_time) |
در این مرحله هم این تیکه ها رو به مرحله چک کردن دکمه اضافه کردم:
1 2 3 4 5 6 7 | if GPIO.input(button_pin): up_time=time.time() else: flag=1 on() push_time+=1 down_time=time.time() |
اگه قرار بود LED رو خاموش کنم باید push_time رو برابر 0 میکردم پس:
1 2 3 4 5 6 7 8 9 10 11 | if -1 > up_time-down_time < -3 : print("delta:",up_time-down_time) off() push_time=0 flag=0 elif up_time-down_time<1: on() elif push_time%2==0: on() sleep(sleep_time) off() |
و شما الان به همراه من این چالش رقص نور جذاب رو انجام دادین که کد کاملش رو میتونید اینجا ببینید:
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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | import RPi.GPIO as GPIO from time import sleep import time GPIO.setmode(GPIO.BCM) sleep_time=0.20 light_pin=4 button_pin=17 up_time=0 down_time=0 GPIO.setup(light_pin,GPIO.OUT) GPIO.setup(button_pin,GPIO.IN,pull_up_down=GPIO.PUD_UP) push_time=0 flag = 0 def off(): GPIO.output(4,False) def on(): if flag==1: GPIO.output(4,True) try: while True: if GPIO.input(button_pin): up_time=time.time() else: flag=1 on() push_time+=1 down_time=time.time() if -1 > up_time-down_time < -3 : off() push_time=0 flag=0 elif up_time-down_time<1: on() elif push_time%2==0: on() sleep(sleep_time) off() sleep(sleep_time) finally: GPIO.cleanup() |
حالا که به اینجا رسیدیم و دیدن که چقدر رااحت میشه این جور چالش ها رو حل کرد یه پیشنهاد دوستانه هم برای شما دارم:
هیچ وقت از حل کردن چالش ها نترسید و شور و شوق چالش های خودتون رو حل کنید. من که عاشق چالش های برنامه نویسی بوده و هستم. امیدوارم شما هم همینطور باشید.