dixan
Posts: 3
Joined: Sat Jul 14, 2018 8:07 am

Кнопка с 3 функциами

Sat Jul 14, 2018 8:14 am

Добрый день подскажите хочу сделать так чтобы при 1 нажатии кнопки запускался один скрипт при 2м нажатии другой скрипт и при 3 нажатии третий скрипт и так чтобы кнопка работала циклично 1-2-3-1-2-3-итд набросал скрипт на питоне работает но понимаю что в место задержки писать надо чтото другое но не могу понять что ! заранее благодарен!!

Code: Select all

#!/usr/bin/python3
import RPi.GPIO as GPIO
import time
import os
from time import sleep

GPIO.setmode(GPIO.BCM) 
GPIO.setwarnings(False)
GPIO.setup(6, GPIO.IN)
GPIO.setup(13, GPIO.IN)

while True:
    inputValue = GPIO.input(6)
    if (inputValue == False):
       os.system("sudo /root/script/1_up.py")
    time.sleep(0.1)
    inputValue = GPIO.input(6)
    if (inputValue == False):
        os.system("sudo /root/script/2_up.py")
    time.sleep(0.1)
    inputValue = GPIO.input(6)
    if (inputValue == False):
        os.system("sudo /root/script/led_dow.sh")
    time.sleep(0.1)

peppy.player
Posts: 162
Joined: Mon Mar 07, 2016 6:10 am

Re: Кнопка с 3 функциами

Sat Jul 14, 2018 4:27 pm

Подскажу псевдо-код, на Питоне вы уж сами... Код подразумевает,
что нажатие определяется по размыканию контактов кнопки, а не
по замыканию.

Code: Select all

count = 0  # создать счетчик нажатий

while True:
    если кнопка не нажата:
	    вздремнуть
	    continue # начать цикл сначала

    # кнопка нажата		
    count += 1
    если count == 4:  #  сбросить счетчик если перекрутился
	     count = 1	
	
    если count == 1:
	     запустить первый скрипт
    если count == 2:
	     запустить второй скрипт
    если count == 3:
	     запустить третий скрипт

Удачи.

dixan
Posts: 3
Joined: Sat Jul 14, 2018 8:07 am

Re: Кнопка с 3 функциами

Sat Jul 14, 2018 4:33 pm

Большое спасибо!
Теперь буду изучать дальше а то не разу дела с скриптами не имел :)

peppy.player
Posts: 162
Joined: Mon Mar 07, 2016 6:10 am

Re: Кнопка с 3 функциами

Sun Jul 15, 2018 12:42 am

Насколько я помню класс RPi.GPIO поддерживает callback функции,
которые позволят вам обойтись без цикла, так что и это заодно изучите.

dixan
Posts: 3
Joined: Sat Jul 14, 2018 8:07 am

Re: Кнопка с 3 функциами

Sun Jul 15, 2018 6:17 am

в общем сделал 3 скрипта для 3х кнопок они работают как надо но при попытке запустить их при загрузке один за другим запускается только первый остальные не работают я так понимаю для того чтобы заработали другие нужно чтобы первый завершил работу. начинаю запуск в фоновом режиме
/root/script/buton1.py &
/root/script/buton2.py &
/root/script/buton4.py &
из консоли ручками работает но при перезагрузке через rc.local не хочет
побывал объединить эти скрипты в один но нечего не выходит (не хватает навыков)
Что я делаю не так? уже замучился такая каша в голове твориться!

скрипт 1
#!/usr/bin/python3
import RPi.GPIO as GPIO
import time
import os
from time import sleep

try: #Основной цикл
Button = 6 #GPIO.3
StateNumber = 0 #Хранение текущего состояния
StateButton = 0 #Отслеживаем отжатие клавиши
GPIO.setmode(GPIO.BCM) #Имя портов по GIOP
GPIO.setup(Button, GPIO.IN) #Порт как вход

sleep(1) #Задержка перед инициализацией
#print ('Старт') #Начало программы


while 1: #Бесконечный цикл
if StateButton == 0:
if GPIO.input(Button) == 0: #Кнопка нажата?
StateNumber = StateNumber + 1 #+1
StateButton = 1 #Флаг нажатой клавиши
if StateNumber == 4: #Превысили максимальные 3?
StateNumber = 1 #Да, вернемся к начальной 1

if GPIO.input(Button) == 1: #Кнопку отпустили?
if StateButton == 1: #Флаг нажатой клавиши активен?
StateButton = 0
if StateNumber == 1: #Первое нажатие
# print ('Запуск первого скрипта')
os.system("sudo /root/script/1_up.py")
elif StateNumber == 2: #Второе нажатие
#print ('Запуск второго скрипта')
os.system("sudo /root/script/2_up.py")
elif StateNumber == 3: #Третье нажатие
#print ('Запуск третьего скрипта')
os.system("sudo /root/script/led_dow.sh")
sleep(0.1)


except KeyboardInterrupt:
# ...
print ("Выход") #Выход из программы CTRL+C
except:
# ...
print ("Прочие исключения") #Прочие исключения
traceback.print_exc(limit=2, file=sys.stdout) #Подробности исключения
finally:
GPIO.cleanup() #Возввращаем пины в исходное состояние
print ("Конец программы") #информируем о выходе

скрипт2
#!/usr/bin/python3
import RPi.GPIO as GPIO
import time
import os
from time import sleep

try: #Основной цикл
Button2 = 13 #GPIO.3
StateNumber = 0 #Хранение текущего состояния
StateButton = 0 #Отслеживаем отжатие клавиши
GPIO.setmode(GPIO.BCM) #Имя портов по GIOP
GPIO.setup(Button2, GPIO.IN) #Порт как вход

sleep(1) #Задержка перед инициализацией
#print ('Старт') #Начало программы


while 1: #Бесконечный цикл
if StateButton == 0:
if GPIO.input(Button2) == 0: #Кнопка нажата?
StateNumber = StateNumber + 1 #+1
StateButton = 1 #Флаг нажатой клавиши
if StateNumber == 3: #Превысили максимальные 3?
StateNumber = 1 #Да, вернемся к начальной 1

if GPIO.input(Button2) == 1: #Кнопку отпустили?
if StateButton == 1: #Флаг нажатой клавиши активен?
StateButton = 0
if StateNumber == 1: #Первое нажатие
#print ('Запуск первого скрипта')
os.system("sudo /root/script/3_up.py")
elif StateNumber == 2: #Второе нажатие
#print ('Запуск второго скрипта')
os.system("sudo /root/script/3_down.py")
sleep(0.1)


except KeyboardInterrupt:
# ...
print ("Выход") #Выход из программы CTRL+C
except:
# ...
print ("Прочие исключения") #Прочие исключения
traceback.print_exc(limit=2, file=sys.stdout) #Подробности исключения
finally:
GPIO.cleanup() #Возввращаем пины в исходное состояние
print ("Конец программы") #информируем о выходе

скрипт 3
#!/usr/bin/python3
import RPi.GPIO as GPIO
import time
import os
from time import sleep

GPIO.setmode(GPIO.BCM)
GPIO.setup(26, GPIO.IN)

while True:
inputValue = GPIO.input(26)
if (inputValue == False):
os.system("sudo /root/script/sleep.sh")
time.sleep(0.1)

Return to “Русский”