Купил резисторы на 10КОм и переделал на макетке и подключение и программу.
Подключение идет по логике PD0-PD8 - кнопки, все остальное - лампочки.
Вот собственно схема:
Так как расстояние между пинами не 2.5мм, а 2мм, пришлось снять пластик, поджать и изолировать контакт (термоусадка)
А вот так выглядит макетка:
Листинг программы (переделана с учетом изменений в схеме):
#!/usr/bin/env python
import SUNXI_GPIO as GPIO
import time
import logging
from threading import Thread
from Queue import Queue
def blink_led(runJob,RED_LED,GREEN_LED,NameLED):
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,IN_KEY,NameKey):
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 '+NameKey+' pressed.'
if stateJob == False:
runJob.put(True)
stateJob=True
print 'runJob_'+NameKey
else:
runJob.put(False)
stateJob=False
print 'StopJob_'+NameKey
print stateJob
#BLOCK_1
# RED_LED = GPIO.PD9
# GREEN_LED = GPIO.PD8
# IN_KEY = GPIO.PD0
#BLOCK_2
# RED_LED = GPIO.PD11
# GREEN_LED = GPIO.PD10
# IN_KEY = GPIO.PD1
#BLOCK_3
# RED_LED = GPIO.PD113
# GREEN_LED = GPIO.PD12
# IN_KEY = GPIO.PD2
#BLOCK_4
# RED_LED = GPIO.PD115
# GREEN_LED = GPIO.PD14
# IN_KEY = GPIO.PD3
GPIO.init()
GPIO.setcfg(GPIO.PD0, GPIO.IN)
GPIO.setcfg(GPIO.PD1, GPIO.IN)
GPIO.setcfg(GPIO.PD2, GPIO.IN)
GPIO.setcfg(GPIO.PD3, GPIO.IN)
GPIO.setcfg(GPIO.PD8, GPIO.OUT)
GPIO.setcfg(GPIO.PD9, GPIO.OUT)
GPIO.setcfg(GPIO.PD10, GPIO.OUT)
GPIO.setcfg(GPIO.PD11, GPIO.OUT)
GPIO.setcfg(GPIO.PD12, GPIO.OUT)
GPIO.setcfg(GPIO.PD13, GPIO.OUT)
GPIO.setcfg(GPIO.PD14, GPIO.OUT)
GPIO.setcfg(GPIO.PD15, GPIO.OUT)
runJob=Queue(1)
ButtonJob_1 = Thread(target=check_button, args=(runJob,GPIO.PD0,'1',))
LedJob_1 = Thread(target=blink_led, args=(runJob,GPIO.PD9,GPIO.PD8,'1',))
ButtonJob_1.start()
LedJob_1.start()
runJob=Queue(1)
ButtonJob_2 = Thread(target=check_button, args=(runJob,GPIO.PD1,'2',))
LedJob_2 = Thread(target=blink_led, args=(runJob,GPIO.PD11,GPIO.PD10,'2',))
ButtonJob_2.start()
LedJob_2.start()
runJob=Queue(1)
ButtonJob_3 = Thread(target=check_button, args=(runJob,GPIO.PD2,'3',))
LedJob_3 = Thread(target=blink_led, args=(runJob,GPIO.PD13,GPIO.PD12,'3',))
ButtonJob_3.start()
LedJob_3.start()
runJob=Queue(1)
ButtonJob_4 = Thread(target=check_button, args=(runJob,GPIO.PD3,'4',))
LedJob_4 = Thread(target=blink_led, args=(runJob,GPIO.PD15,GPIO.PD14,'4',))
ButtonJob_4.start()
LedJob_4.start()
while True:
time.sleep(1)
runJob.put(None)
LedJob_1.join()
ButtonJob_1.join()
LedJob_2.join()
ButtonJob_2.join()
LedJob_3.join()
ButtonJob_3.join()
LedJob_4.join()
ButtonJob_4.join()
Не могу понять почему программа работает, как потоки отличают свой runJob, но оно работает
Комментариев нет:
Отправить комментарий