Есть одна мысль с кнопками и лампочками на кубике.
Для начала решил получить простую программу:
Нажимаем кнопку - лампочка начинает переливаться (трех-контактный светодиод) красный-красный+зеленый-зеленый. нажимаем снова - выключается.
Расчеты резисторов на диод (ARL-5013URGC/3L):
Сеть 3.3
Красный 2В 0,02 (max) 0,01 (min)
Зеленый 3В 0,02 (max) 0,01 (min)
Красный R=(3.3-2)/0.01=130Ом
P=1.3*0.01=0.013=Обоб 0,25Вт
Красный R=(3.3-2)/0.02=65Ом
P=1.3*0.02=0.026=Обоб 0,25Вт
Зеленый R=(3.3-3)/0.01=30Ом
P=0.3*0.01=0.003=Обоб 0,25Вт
Зеленый R=(3.3-3)/0.02=15Ом
P=0.3*0.02=0.006=Обоб 0,25Вт
подготовка
Листинг скрипта:
#!/usr/bin/env python
import SUNXI_GPIO as GPIO
import time
import logging
from threading import Thread
from Queue import Queue
#GPIO.setmode(GPIO.BCM)
RED_LED = GPIO.PD1
GREEN_LED = GPIO.PD2
IN_KEY = GPIO.PD0
GPIO.init()
GPIO.setcfg(RED_LED, GPIO.OUT)
GPIO.setcfg(GREEN_LED, GPIO.OUT)
GPIO.setcfg(IN_KEY, GPIO.IN)
runJob=Queue(1)
def blink_led(runJob):
nowJob=False
logging.basicConfig(filename="blink_led.log", level=logging.INFO)
while True:
if runJob.empty() == False:
nowJob=runJob.get()
if nowJob is None:
break
logging.info(nowJob)
if nowJob==True:
logging.info(nowJob)
GPIO.output(RED_LED, GPIO.HIGH)
time.sleep(1)
GPIO.output(GREEN_LED, GPIO.HIGH)
time.sleep(1)
GPIO.output(RED_LED, GPIO.LOW)
time.sleep(1)
GPIO.output(GREEN_LED, GPIO.LOW)
time.sleep(1)
else:
GPIO.output(GREEN_LED, GPIO.LOW)
GPIO.output(RED_LED, GPIO.LOW)
LedJob = Thread(target=blink_led, args=(runJob,))
LedJob.start()
stateJob=False
while True:
state=True #Checking that state pin GPIO do not has changed (contact bounce)
if GPIO.input(IN_KEY) == False:
state=False
time.sleep(0.1)
if GPIO.input(IN_KEY) == state:
print 'Key pressed.'
if stateJob == False:
runJob.put(True)
stateJob=True
print 'runJob'
else:
runJob.put(False)
stateJob=False
print 'Stop'
print stateJob
runJob.put(None)
LedJob.join()
Здесь в потоке проверяем переменную из очереди и если Истина мигаем лампочкой.Также добавлено логирование потока для дебаггинга.
time.sleep(0.1) - создан для решения проблемы с дребезгом контактов (подробнее и о стягивающих/подтягивающих резисторах туда же) аппаратно решить пока не удалось.
Данный вариант не может прослушивать более одной кнопки, поэтому он мне не очень подходит, но это следующий этап.
Внес некоторые изменения. Весь блок проверки пина вывел в функцию и запустил вторым потоком. Дабы скрипт не завершался - установил бесконечный цикл со слипом, может есть вариант кашерней? в таком виде можно запустить мониторинг нескольких кнопок
#!/usr/bin/env python
import SUNXI_GPIO as GPIO
import time
import logging
from threading import Thread
from Queue import Queue
#GPIO.setmode(GPIO.BCM)
RED_LED = GPIO.PD1
GREEN_LED = GPIO.PD2
IN_KEY = GPIO.PD0
GPIO.init()
GPIO.setcfg(RED_LED, GPIO.OUT)
GPIO.setcfg(GREEN_LED, GPIO.OUT)
GPIO.setcfg(IN_KEY, GPIO.IN)
runJob=Queue(1)
def blink_led(runJob):
nowJob=False
logging.basicConfig(filename="blink_led.log", level=logging.INFO)
while True:
if runJob.empty() == False:
nowJob=runJob.get()
if nowJob is None:
break
logging.info(nowJob)
if nowJob==True:
logging.info(nowJob)
GPIO.output(RED_LED, GPIO.HIGH)
time.sleep(1)
GPIO.output(GREEN_LED, GPIO.HIGH)
time.sleep(1)
GPIO.output(RED_LED, GPIO.LOW)
time.sleep(1)
GPIO.output(GREEN_LED, GPIO.LOW)
time.sleep(1)
else:
GPIO.output(GREEN_LED, GPIO.LOW)
GPIO.output(RED_LED, GPIO.LOW)
def check_button(runJob):
stateJob=False
while True:
state=True #Checking that state pin GPIO do not has changed (contact bounce)
if GPIO.input(IN_KEY) == False:
state=False
time.sleep(0.1)
if GPIO.input(IN_KEY) == state:
print 'Key pressed.'
if stateJob == False:
runJob.put(True)
stateJob=True
print 'runJob'
else:
runJob.put(False)
stateJob=False
print 'Stop'
print stateJob
LedJob = Thread(target=blink_led, args=(runJob,))
ButtonJob = Thread(target=check_button, args=(runJob,))
LedJob.start()
ButtonJob.start()
while True:
time.sleep(1)
runJob.put(None)
LedJob.join()
ButtonJob.join()
Комментариев нет:
Отправить комментарий