16 мая 2020 г.

CubieBoard2 делаем кнопки III

Купил резисторы на 10КОм и переделал на макетке и подключение и программу.
Подключение идет по логике PD0-PD8 - кнопки, все остальное - лампочки.
Вот собственно схема:
На схеме изображена вид сверху на разъем GPIO, как на фото ниже


Так как расстояние между пинами не 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, но оно работает

Комментариев нет:

Отправка комментария