Как использовать RGB LED матрицу Waveshare для Raspberry Pi Pico — Часть 2

RGB LED матрица Waveshare для Raspberry Pi Pico — Часть 2

Это вторая часть двухчастного руководства по использованию RGB Full-colour LED Matrix Panel Waveshare для Raspberry Pi Pico.

В первой части мы показали, как отображать базовые цвета, выводить числовые значения и показывать время. В этой части мы покажем, как:

  • Прокручивать цветной текст и числовые значения по экрану с использованием расширенного набора символов

  • Отображать показания датчика BME680 (температура)

Что вам понадобится

Для второй части вам потребуется всё из первой части, плюс:

  • 1x Adafruit BME680 — датчик температуры, влажности, давления и газа

  • (Опционально) 1x PicoDecker

В статье также упоминаются другие опциональные компоненты для дополнительных экспериментов.

Прокрутка строки символов по экрану

Пример прокрутки текста на RGB LED матрице Waveshare

Это оказалось гораздо проще, чем мы предполагали, и потребовалась всего одна процедура. Мы скачали стандартный ASCII-шрифт 5x8 с GitHub, который отлично подошёл. К сожалению, 255 символов занимают довольно много места, поэтому программа насчитывает более 450 строк.

Подробнее об ASCII можно узнать на https://www.asciitable.com/ — ASCII расшифровывается как American Standard Code for Information Interchange (Американский стандартный код для обмена информацией).

Вы можете скачать демонстрационную программу по ссылке: https://cdn.shopify.com/s/files/1/0176/3274/files/WS_RGB_LED_160_Scrolling.py?v=1651668877

Каждый символ шрифта состоит из 5 байт, которые отображаются вертикально, слева направо, с наименее значимым битом сверху, что делает прокрутку простой. Шрифт хранится в виде длинного списка байт с именем FONT.

Процедура разбита на две части:

  1. Взять строку символов и преобразовать её в список байт. Добавить пробелы в начало и конец, чтобы сообщение появлялось справа и полностью уходило за левый край экрана. Вставить один пустой пиксель между каждым символом.

  2. Пройтись по списку, отображая байты вертикально на экране и медленно перемещая их справа налево. Для этого требуются вложенные циклы.

def scroll(msg,r,g,b): # Прокрутка строки по экрану
    # Преобразование сообщения в список байт для вертикального отображения
    lines = []
    msg1 = " " + msg + "      " # Добавляем пробелы спереди и сзади
    cc=(r,g,b)              # Цвет Neopixel
    for ch in(msg1):        # Берём символ
        asc = ord(ch)       # Получаем его ASCII-код
        code =asc * 5       # Вычисляем начальную позицию в списке шрифта
        for ii in range(5): # Получаем 5 вертикальных линий для каждого символа
            line = FONT[code + ii]
            lines.append(line)  # Добавляем линию в список
        lines.append(0x00)  # Вставляем 1 пиксель-пробел между символами

    # Прокрутка из списка линий
    pos = 0  # Указатель списка с начала
    line_length = len(lines)           # Длина списка байт
    while pos < (line_length-16):      # Цикл до сдвига последнего символа за левый край
        for i in range(16):            # Цикл по ширине экрана
            line = lines[i+pos]        # Получаем текущий вертикальный столбец байт
            for yy in range(8):        # Пиксели в столбце по очереди
                if (line >> yy) & 0x1: # Это 1?
                    xy_set(i,yy+1,cc)  # Цветной пиксель если 1
                else:
                    xy_set(i,yy+1,(0,0,0)) # Чёрный пиксель если 0
        pixels_show()                      # Обновляем дисплей
        time.sleep(0.1)                # Задержка для замедления
        pos = pos + 1                  # Увеличиваем указатель списка

Последняя новая функция записывает один неподвижный символ на дисплей.

def character(asc,xx,r,g,b):
    # Отображение одного ASCII-символа на позиции xx, цвет (r,b,g)
    cc = (r,g,b)
    code = asc *5
    for ii in range(5):
        line = FONT[code + ii]
        for yy in range(8):
            if (line >> yy) & 0x1:
                xy_set(ii+xx,yy+1,cc)
            else:
                xy_set(ii+xx,yy+1,(0,0,0))
    pixels_show()

Основная программа демонстрирует прокрутку текстовой строки с несколькими сообщениями, показывающими различные секции расширенного набора символов. Включены греческие буквы и математические символы.

Далее следует раздел, где пользователю предлагается вводить ASCII-значения через клавиатуру в диапазоне от 0 до 255 для просмотра символа. Ввод -999 завершит этот раздел. Кликните курсором в окне Shell программы Thonny в конце запроса ввода, чтобы начать вводить значения. Введённое значение проверяется на выход за пределы диапазона и нецелочисленный формат. Допустимые ASCII-значения отображают символ и ASCII-значение в шестнадцатеричном формате, поскольку недостаточно места для отображения значения в десятичном виде.

Наконец, следует довольно медленный показ всех доступных символов — одни более полезны, другие менее!

Что попробовать

  • Добавьте потенциометр 10K Ом и кнопку в качестве устройств ввода. Вам понадобятся макетная плата и нижние контакты дисплея для подключения компонентов.

  • Настройте диапазон ввода от потенциометра от 0 до 255.

  • Отображайте число на дисплее и изменяйте его при повороте ручки потенциометра.

  • Пока кнопка нажата — показывайте текстовый символ с ASCII-значением от потенциометра на экране в другом цвете вместо числа. Возвращайтесь к числу при отпускании кнопки.

  • Остановите цикл и завершите программу, если кнопка нажата на значении 255 (третий символ <пробел> — другие на 0 и 32).

Отображение показаний датчика BME680

RGB LED матрица Waveshare для Pico с датчиком BME680

Подключение

Это удобно выполнить с помощью Pico Decker и соединительных проводов:

  • Пин SDI/SDA — к GP0

  • Пин SCL — к GP1

  • Пин 2-6V — к 3.3V

  • GND — к GND

Скачайте библиотеку BME680 по ссылке: https://cdn.shopify.com/s/files/1/0176/3274/files/bme680_05fdd817-b7b3-4afd-8959-7ef09fdbedc9.py?v=1651669967 Переименуйте файл в bme680.py. Сохраните его в папку lib на Pico (в Thonny нажмите View -> Files, если это окно не отображается).

Демонстрационную программу можно скачать по ссылке: https://cdn.shopify.com/s/files/1/0176/3274/files/WS_Neo_160_Scrolling_BME680.py?v=1651670430

Программа

Следующий раздел включается вместе с остальными импортами в начале скрипта, перед определениями процедур:

from bme680 import *
i2c=I2C(0,sda=Pin(0), scl=Pin(1), freq=400000)    #инициализация метода I2C
bme = BME680_I2C(i2c=i2c)

Основная часть программы довольно проста, поскольку вся тяжёлая работа выполняется библиотекой, шрифтами и ранее определёнными процедурами:

# =========== Основная часть ==========
while True:
    clear()
    t = str(round(bme.temperature, 2)) + ' '+chr(248)+'C'
    h = str(round(bme.humidity, 2)) + ' %'
    p = str(round(bme.pressure, 2)) + ' hPa'
    g = str(round(bme.gas/1000, 2)) + ' K' + chr(234)

    scroll("Temperature:"+t,100,0,0)
    scroll("Humidity: "+h,0,0,100)
    scroll("Pressure: "+p,0,100,0)
    scroll("GAS: "+g,140,0,145)

Вот видео с демонстрацией в действии:

Значения chr() используются для символа градуса и символа Омега (для единицы сопротивления).

Что попробовать

Замените датчик BME680 на модуль окружающей среды Waveshare для Pico и прокручивайте данные с различных встроенных датчиков:

  • Датчик BME280 — температура, влажность и давление

  • Цифровой датчик окружающего освещения TSL25911FN — измерение ИК и видимого света

  • Датчик LTR390-UV-1 — измерение ультрафиолетового излучения

  • Попробуйте датчик SGP40 — обнаружение качества воздуха / летучих органических соединений (VOC)

Все необходимые драйверы устройств включены в вики устройства на сайте Waveshare: https://www.waveshare.com/wiki/Pico-Environment-Sensor