Как использовать RGB LED матрицу Waveshare для Raspberry Pi Pico — Часть 2
Это вторая часть двухчастного руководства по использованию RGB Full-colour LED Matrix Panel Waveshare для Raspberry Pi Pico.
В первой части мы показали, как отображать базовые цвета, выводить числовые значения и показывать время. В этой части мы покажем, как:
Прокручивать цветной текст и числовые значения по экрану с использованием расширенного набора символов
Отображать показания датчика BME680 (температура)
Что вам понадобится
Для второй части вам потребуется всё из первой части, плюс:
1x Adafruit BME680 — датчик температуры, влажности, давления и газа
(Опционально) 1x PicoDecker
В статье также упоминаются другие опциональные компоненты для дополнительных экспериментов.
Прокрутка строки символов по экрану
Это оказалось гораздо проще, чем мы предполагали, и потребовалась всего одна процедура. Мы скачали стандартный 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.
Процедура разбита на две части:
Взять строку символов и преобразовать её в список байт. Добавить пробелы в начало и конец, чтобы сообщение появлялось справа и полностью уходило за левый край экрана. Вставить один пустой пиксель между каждым символом.
Пройтись по списку, отображая байты вертикально на экране и медленно перемещая их справа налево. Для этого требуются вложенные циклы.
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
Подключение
Это удобно выполнить с помощью 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