【问题标题】:Controlling a 16x16 led dot matrix with pyfirmata使用 pyfirmata 控制 16x16 led 点阵
【发布时间】:2018-11-10 07:58:13
【问题描述】:

好吧,我想做的是能够通过 pyfirmata 用 python 动态重新绘制一个 16x16 兼容 arduino 的 led 点阵。我似乎找不到解决方法... 我想知道怎么做,是使用 python 将 16x16 矩阵转换为 LED 矩阵显示器。 - 这是我使用 pyfirmata 在 python 中制作的滚动时钟的示例。 (此示例适用于 8x8 led 点阵,而不是我想要的 16x16...

"""led_matrix.py"""

from time import sleep

from pyfirmata import Arduino

HIGH = 1
LOW = 0

dataIn = 2
load = 3
clock = 4
maxInUse = 1
Intensity = 3

max7219_reg_noop = 0x00
max7219_reg_digit0 = 0x01
max7219_reg_digit1 = 0x02
max7219_reg_digit2 = 0x03
max7219_reg_digit3 = 0x04
max7219_reg_digit4 = 0x05
max7219_reg_digit5 = 0x06
max7219_reg_digit6 = 0x07
max7219_reg_digit7 = 0x08
max7219_reg_decodeMode = 0x09
max7219_reg_intensity = 0x0a
max7219_reg_scanLimit = 0x0b
max7219_reg_shutdown = 0x0c
max7219_reg_displayTest = 0x0f

intensity = 0x01

class LedMatrix:
    def __init__(self, board, dataIn, load, clock, maxInUse=1):
        self._board = board

        self.pins = dict()
        self.pins['dataIn'] = dataIn
        self.pins['load'] = load
        self.pins['clock'] = clock
        self.maxInUse = maxInUse

    def _digitalWrite(self, pin, val):
        self._board.digital[pin].write(val)

    def _putByte(self, data):
        for i in range(8, 0, -1):
            mask = 0x01 << (i - 1)
            self._digitalWrite(self.pins["clock"], LOW)
            if data & mask:
                self._digitalWrite(self.pins["dataIn"], HIGH)
            else:
                self._digitalWrite(self.pins["dataIn"], LOW)
            self._digitalWrite(self.pins["clock"], HIGH)

    def maxSingle(self, reg, col):
        """ Change the row of lights at reg to read as binary of col. """
        self._digitalWrite(self.pins["load"], LOW)
        self._putByte(reg)
        self._putByte(col)
        self._digitalWrite(self.pins["load"], LOW)
        self._digitalWrite(self.pins["load"], HIGH)

    def maxAll(self, reg, col):
        """ Like calling maxSingle on every chained matrix """
        self._digitalWrite(self.pins["load"], LOW)
        for _ in range(0, self.maxInUse):
            self._putByte(reg)
            self._putByte(col)
        self._digitalWrite(self.pins["load"], LOW)
        self._digitalWrite(self.pins["load"], HIGH)

    def maxOne(self, maxNr, reg, col):
        """ Specify the matrix to be written to with maxNr. Then acts as maxSingle on that specific matrix. """
        self._digitalWrite(self.pins["load"], LOW)

        for _ in range(self.maxInUse, maxNr, -1):
            self._putByte(0)
            self._putByte(0)

        self._putByte(reg)
        self._putByte(col)

        for _ in range(maxNr - 1, 0, -1):
            self._putByte(0)
            self._putByte(0)

        self._digitalWrite(self.pins["load"], LOW)
        self._digitalWrite(self.pins["load"], HIGH)

    def clear(self):
        for e in range(1, 9):
            self.maxAll(e, 0)

    def draw_matrix(self, point_matrix):
        for col, pointlist in enumerate(point_matrix):
            self.maxSingle(col + 1, int(''.join(str(v) for v in pointlist), 2))

    def setup(self):
        print('Initializing _matrix...')
        self._digitalWrite(13, HIGH)
        self.maxAll(max7219_reg_scanLimit, 0x07)
        self.maxAll(max7219_reg_decodeMode, 0x00)
        self.maxAll(max7219_reg_shutdown, 0x01)
        self.maxAll(max7219_reg_displayTest, 0x00)
        self.clear()
        self.maxAll(max7219_reg_intensity, intensity & intensity)
        print('Done')

rotated = True

import numpy as np

def convertarray(array):

    m = np.array(array)
    m = np.rot90(m, 3)

    return m.tolist()

import datetime as date



import json

data = json.loads(open('jsonNums.json', 'r').read())

def getTime():
    n = date.datetime.now()
    hour = n.hour
    minute = n.minute
    second = n.second

    PM = False
    if hour > 12: hour -= 12; PM = True

    if len(str(hour)) < 2: hour = str( f"0{hour}" )
    hour=str(hour)

    if len(str(minute)) < 2: minute = str( f"0{minute}" )
    minute = str(minute)

    if len(str(second)) < 2: second = str( f"0{second}" )
    second = str(second)

    pm = "AM"
    if PM: pm = "PM"

    fullTime = f"{hour}:{minute}.{pm}"

    display = []
    for i in range(8):
        row = [0,0,0,0,0,0,0,0]
        for char in fullTime:
            if char == "0":
                row.extend(data["0"][i])
            elif char == "1":
                row.extend(data["1"][i])
            elif char == "2":
                row.extend(data["2"][i])
            elif char == "3":
                row.extend(data["3"][i])
            elif char == "4":
                row.extend(data["4"][i])
            elif char == "5":
                row.extend(data["5"][i])
            elif char == "6":
                row.extend(data["6"][i])
            elif char == "7":
                row.extend(data["7"][i])
            elif char == "8":
                row.extend(data["8"][i])
            elif char == "9":
                row.extend(data["9"][i])

            elif char == ":":
                row.extend(data["COLON"][i])
            elif char == ".":
                row.extend(data["POINT"][i])

            elif char == "A":
                row.extend(data["AM"][i])
                break

            elif char == "P":
                row.extend(data["PM"][i])
                break

        row.extend([0,0,0,0,0,0,0,0])

        display.append(row)

    return display




for row in (getTime()): print(row)

scrollMultiplier = 1

if __name__ == "__main__":
    board = Arduino('COM1')
    matrix = LedMatrix(board, dataIn, load, clock)
    matrix.setup()
    print("Loop running")



    while True:

        # print("New iteration")
        displayx = getTime()
        # print("Time collected")

        r = int(len(displayx[0]) - 8)
        # print(f"Repeat = {r}")

        for i in range(0, r, scrollMultiplier): # Scrolling effect

            x=[]

            for XX in displayx:

                # print(f"XX = {XX}")

                r=[]
                nr = XX[i:i+8]

                # print(f"nr = {nr}")

                x.append(nr)

                # print("X.append(nr)")

            x = convertarray(x)

            matrix.draw_matrix(x)

我似乎无法在网上找到任何帮助,所以我才在这里问... 任何帮助表示赞赏! :)

【问题讨论】:

    标签: python python-3.x matrix arduino led


    【解决方案1】:

    欢迎来到 stackoverflow。

    从您的代码中可以看出,有几个变量控制着点阵显示的单元数。

    max7219_reg_digit{ 0-1 }
    
    row = [0,0,0,0,0,0,0,0]
    
    r = int(len(displayx[0]) - 8)
    
    def _putByte(self, data):
        for i in range(8, 0, -1): 
            nr = XX[i:i+8]`
    

    如果我猜对了,您的库会处理将小数转换为二进制值数组的工作。如果是这种情况,您的工作就是将所有与将 8 个单元格限制为 16 个单元格相关的变量。

    希望这有帮助,享受吧!

    【讨论】:

      猜你喜欢
      • 2020-09-25
      • 1970-01-01
      • 2022-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多