2016-08-25 4 views
1

Я работаю над простой программой подсчета для RPi-3 с семисегментный-дисплей. У меня есть два способа подсчета от одного до десяти, один вручную, всегда освещая отдельные сегменты, которые мне нужны, и другой способ, основанный на матрице numpy."" TypeError: только массивы длиной-1 могут быть преобразованы в сканеры Python "" "при попытке запустить счетчик на Pi3 с отображением 7сегмента

Ручной режим работает нормально, но у меня есть проблемы с матричным способом его выполнения. Вот код с некоторыми пояснениями к пониманию:

import RPi.GPIO as GPIO 
import time 
import numpy 

GPIO.setmode(GPIO.BOARD) 

GPIO.setup(31, GPIO.OUT) #up right 
GPIO.setup(32, GPIO.OUT) #up 
GPIO.setup(33, GPIO.OUT) #up left 
GPIO.setup(35, GPIO.OUT) #middle 
GPIO.setup(36, GPIO.OUT) #down right 
GPIO.setup(37, GPIO.OUT) #down left 
GPIO.setup(38, GPIO.OUT) #decimal point(in the bottom right corner) 
GPIO.setup(40, GPIO.OUT) #down 

def all_off():     #turns all segments off, works as well! 
    GPIO.output(31, False) 
    GPIO.output(32, False) 
    GPIO.output(33, False) 
    GPIO.output(35, False) 
    GPIO.output(36, False) 
    GPIO.output(37, False) 
    GPIO.output(38, False) 
    GPIO.output(40, False) 

matrix = numpy.matrix([[1,0,0,0,1,0,0,0], #those are the combinations 
         [1,1,0,1,0,1,0,1], #from one to nine and finishing 
         [1,1,0,1,1,0,0,1], #with zero 
         [1,0,1,1,1,0,0,0], #first number of a line is value for Pin31 then 32, 
         [0,1,1,1,1,0,0,1], #33, 35, 36, 37, 38, 40 
         [0,1,1,1,1,1,0,1], 
         [1,1,0,0,1,0,0,0], #combinations are correct, btw! 
         [1,1,1,1,1,1,0,1], 
         [1,1,1,1,1,0,0,1]]) 

def set_to(byte): 
    all_off() 
    GPIO.output(31, int(byte[0])) #<-- this is the line where the error 
    GPIO.output(32, int(byte[1])) #occurs 
    GPIO.output(33, int(byte[2])) 
    GPIO.output(35, int(byte[3])) 
    GPIO.output(36, int(byte[4])) 
    GPIO.output(37, int(byte[5])) 
    GPIO.output(38, int(byte[6])) 
    GPIO.output(40, int(byte[7])) 

for line in matrix:  #the actual counting program 
    set_to(matrix[line]) 
    time.sleep(1) 

GPIO.cleanup() 

Проблема, по-видимому, в том, что массив не может быть прочитан? Я не понимаю, в чем проблема или что делать, чтобы исправить эту проблему. Кажется, что это имеет какое-то отношение к «линии» матрицы, это просто другая матрица (всего одна строка).

Я действительно не знаю, что делать, пожалуйста, помогите !!

+1

Может ли этот ответ из другого вопроса дать вам ключ: http://stackoverflow.com/a/21697288/2696355 в любом случае, почему вы используете матрицу numpy? Я думаю, вы могли бы просто использовать список списков без каких-либо проблем. – Tryph

+1

Мне кажется, вам нужно изменить вызов set_to, похоже, что он должен быть set_to (строка), вы в настоящее время пытаетесь индексировать массив, с другим массивом, который является тем, что он жалуется, что он не может превратиться в скаляр , Я также соглашаюсь с Трифом о просто использовании списков. Кроме того, доказательство фактического отслеживания, возможно, сделало это легче обнаружить. –

ответ

1

Я изменил свою стратегию и теперь использую массив numpy. Теперь у меня есть рабочий код:

import RPi.GPIO as GPIO 
import time 
import numpy 

GPIO.setmode(GPIO.BOARD) 
GPIO.setwarnings(False) 

GPIO.setup(31, GPIO.OUT) 
GPIO.setup(32, GPIO.OUT) 
GPIO.setup(33, GPIO.OUT) 
GPIO.setup(35, GPIO.OUT) 
GPIO.setup(36, GPIO.OUT) 
GPIO.setup(37, GPIO.OUT) 
GPIO.setup(38, GPIO.OUT) 
GPIO.setup(40, GPIO.OUT) 

pinlist = [(31, 0), (32, 1) ,(33, 2) ,(35, 3) ,(36, 4) ,(37, 5) ,(38, 6), (40, 7)] 

def all_off(): 
    GPIO.output(31, False) 
    GPIO.output(32, False) 
    GPIO.output(33, False) 
    GPIO.output(35, False) 
    GPIO.output(36, False) 
    GPIO.output(37, False) 
    GPIO.output(38, False) 
    GPIO.output(40, False) 

matrix = numpy.array([[1,0,0,0,1,0,0,0], 
         [1,1,0,1,0,1,0,1], 
         [1,1,0,1,1,0,0,1], 
         [1,0,1,1,1,0,0,0], 
         [0,1,1,1,1,0,0,1], 
         [0,1,1,1,1,1,0,1], 
         [1,1,0,0,1,0,0,0], 
         [1,1,1,1,1,1,0,1], 
         [1,1,1,1,1,0,0,1]]) 

for i in range(0, 9): 
    all_off() 
    for (pin, j) in pinlist: 
     GPIO.output(pin, int(matrix[i][j])) 
    time.sleep(0.25) 

GPIO.cleanup() 

Это работает следующим образом:

Я создал список всех контактов с их номером (упакованный в кортеже). Эти Tuple's считываются для цикла внутри большого цикла for. Теперь я ссылаюсь на «координаты» одной точки внутри моего массива. Это означает, что он немного медленный (вы можете увидеть всплывающее окно одного сегмента), но мне, к счастью, не нужно заботиться!

Тем не менее большое спасибо за вашу поддержку!

+0

Не могли бы вы посмотреть и посмотреть улучшения кода? Это самый эффективный способ сделать это? –

 Смежные вопросы

  • Нет связанных вопросов^_^