Общие сведения:
В этом уроке мы объясним как выводить показания Trema модуля pH-метр, Flash-I2C на RGB матрицу 64х32 при помощи Raspberry Pi
Видео:
Редактируется...
Подключение:
Для удобства подключения используем RGB Matrix Hat и Trema+Expander Hat. Так же нам понадобится:
1. Установим RGB Matrix Hat на Raspberry Pi и подключим RGB матрицу 64x32


2. Установим Trema+Expander Hat и подключим Датчик кислотности жидкости (pH-метр), FLASH-I2C


Вывод на матрицу
Если Вы ещё ни разу не настраивали Raspberry, то можете сделать это руководствуясь этой статьёй
Весь дальнейший материал предполагает установленную систему Raspberry Pi OS "Bullseye" и отсутствие драйверов и надстроек, которые могут использовать выводы GPIO. Проверить версию ОС можно в терминале командой grep . /etc/os-release
При помощи библиотеки rpi-rgb-led-matrix возможен вывод фигур, изображений, текста и бегущей строки на светодиодную матрицу используя C++, C# или Python. Мы рассмотрим вывод на матрицу используя Python.
Откроем эмулятор терминала в верхней панели графической среды Raspberry.

Создадим директорию для хранения будущих Github проектов командой mkdir (make directory - создать директорию):
mkdir -p Github
Перейдём в директорию командой cd (change directory - сменить директорию):
cd Github
Склонируем репозиторий (необходимо подключение к интернету):
git clone https://github.com/hzeller/rpi-rgb-led-matrix
Далее перейдём в директорию python внутри директории rpi-rgb-led-matrix/bindings
cd rpi-rgb-led-matrix/bindings/python
Теперь наберём три строки, нажимая в конце каждой строки и дожидаясь выполнения сборки и/или установки после каждой строки
sudo apt-get update && sudo apt-get install python3-dev python3-pillow -y
make build-python PYTHON=$(command -v python3)
sudo make install-python PYTHON=$(command -v python3)
После успешной установки можно попробовать вывести текст на матрицу
Перейдём в директорию примеров
cd samples/
Здесь важно сказать, что для работы с матрицей необходимо либо отключить драйвер встроенного в процессор Raspberry аудио генератора, либо передать сценарию python аргумент --led-no-hardware-pulse=1. В первом случае матрица будет работать с аппаратным тактированием и, если нужен звук, можно использовать внешнюю USB карту (так же при этих условиях сценарии необходимо запускать от имени привилегированного пользователя командой sudo). Для отключения встроенного генератора аудио необходимо закомментировать строку dtparam=audio=on в файле /boot/config.txt. Во втором случае можно использовать встроенный звук Raspberry, но программа вывода на матрицу будет использовать программное тактирование.
Для проверки работы матрицы запустим программу с использованием программного тактирования:
python3 runtext.py --led-cols=64 --led-no-hardware-pulse=1 -t "Привет мир!"
Если текст выглядит плохо или вообще не узнаваем, то может помочь добавить к команде выше флаг --led-slowdown-gpio=2. Матрица может быть слишком медленная или Raspberry Pi слишком быстрая, это зависит от версии Вашей Raspberry. Данная команда замедляет работу выводов при использовании матрицы. Число может быть от 0 до 4, по умолчанию 1. Пример:
python3 runtext.py --led-cols=64 --led-no-hardware-pulse=1 -t "Привет мир!" --led-slowdown-gpio=2
Подробнее про аргументы, передаваемые библиотеке можно узнать из файла README.md в корневой директории репозитория.
Чтение показаний датчика
Для корректной работы датчика необходимо отключить аппаратную шину I2C Raspberry Pi убрав или закомментировав строкуdtparam=i2c_arm=on и добавить следующую строку в /boot/confing.txt:
dtoverlay=i2c-gpio,i2c_gpio_sda=2,i2c_gpio_scl=3,i2c_gpio_delay_us=2,bus=1
Теперь установим библиотеку pyiArduinoI2Cph:
sudo pip3 install pyiArduinoI2Cph
Далее запустим следующий скрипт для проверки подключения датчика (скрипт можно ввести прямо в терминале при помощи vim или nano, а так же в редакторе Thonny Python IDE, который можно в графическом меню Raspberry Pi OS в правом верхнем углу.

# Подключаем библиотеку для работы с pH-метром I2C-flash.
from pyiArduinoI2Cph import *
# Объявляем объект sensor для работы с функциями и методами библиотеки pyiArduinoI2Cph
sensor = pyiArduinoI2Cph()
# Выводим показания датчика в stdout
print(sensor.getPH())
Если всё прошло успешно, то мы увидим текущие показания датчика:

Скрипт вывода показаний датчика
Предположим файл скрипта называется ph-demo.py. Для вывода на матрицу, как и в примере выше, необходимо передать аргументы, выявленные экспериментальным путём, которые необходимы для работы Вашей матрицы. Например:
python3 ph-demo.py --led-cols=64 --led-no-hardware-pulse=1 --led-slowdown-gpio=2
Данный пример основан на скрипте Graphics.py из директории rpi-rgb-led-matrix/bingings/python/samples и должен быть запущен из эмулятора терминала в этой же директории.
# Импортируем библиотеки
import colorsys
from samplebase import SampleBase
from rgbmatrix import graphics
from pyiArduinoI2Cph import *
import time
# Функции конвертирования Red, Green, Blue в Hue, Saturation, Value (Brightness)
def hsv_to_rgb(h, s, v):
if s == 0.0: return (v, v, v)
i = int(h*6.)
f = (h*6.)-i; p,q,t = v*(1.-s), v*(1.-s*f), v*(1.-s*(1.-f)); i%=6
if i == 0: return (v, t, p)
if i == 1: return (q, v, p)
if i == 2: return (p, v, t)
if i == 3: return (p, q, v)
if i == 4: return (t, p, v)
if i == 5: return (v, p, q)
def hsv2rgb(h,s,v):
return tuple(round(i * 255) for i in hsv_to_rgb(h,s,v))
# Задаём начало координат для вывода
orig_y = 10
orig_x = 1
# Список цветов для графы
color3 = [None] * 65
# Заполняем список цветов
for k in range(65):
graph_color = hsv2rgb(1/96*k, 1, 1)
color3[k] = graphics.Color(graph_color[0], graph_color[1], graph_color[2])
# Создаём объект датчика кислотности
sens = pyiArduinoI2Cph(0x09)
time.sleep(.5)
# Класс вывода на RGB матрицу
class GraphicsTest(SampleBase):
# Конструктор класса
def __init__(self, *args, **kwargs):
super(GraphicsTest, self).__init__(*args, **kwargs)
# Метод вывода
def run(self):
# Создаём холст (буфер) матрицы
canvas = self.matrix.CreateFrameCanvas()
# Создаём объект шрифта
font = graphics.Font()
# Загружаем шрифт
font.LoadFont("../../../fonts/8x13.bdf")
# Создаём синий цвет
blue = graphics.Color(0, 32, 255)
# Создаём красный цвет
red = graphics.Color(255, 32, 0)
# Текст для вывода на матицу
t1 = "pH.:"
# Выводим циклически на матрицу
while True:
# Отчищаем буфер матрицы
canvas.Clear()
# Получаем показания датчика кислотности
s = sens.getPH()
y = 19
# Приводим значение показаний для вывода на графу
p = int(((s/14) * 1024)/16)
# Выводим графу на матрицу
for i in range(0, p):
if (i < 65):
graphics.DrawLine(canvas, i, y, i, y+10, color3[i])
# Преобразуем значение показания в строку
s1 = str(s)
# Выводим текст и показания на матрицу
graphics.DrawText(canvas, font, orig_x, orig_y, blue, t1)
graphics.DrawText(canvas, font, orig_x+8*len(t1)-1, orig_y, red, s1)
time.sleep(.1)
# Переключаем буфер после вывода последнего пикселя текущего кадра
canvas = self.matrix.SwapOnVSync(canvas)
# Главная функция (если это скрипт запущен не как библиотека)
if __name__ == "__main__":
# Создаём объект графики
graphics_test = GraphicsTest()
# Если процесс вывода не удалось запустить
if (not graphics_test.process()):
# Выводим текст помощи
graphics_test.print_help()
Ссылки:
Комплект для повторения проекта
Что понадобится
Это быстрый ориентир по основным модулям и деталям. Полный список для повторения проекта смотрите в самой статье.
5 позиций
Датчик кислотности жидкости (pH-метр), FLASH-I2C
Trema модуля pH-метр, Flash-I2C
Открыть в iArduino
RGB матрица 64x32, P3.0
RGB матрицу 64х32
Открыть в iArduino
RGB Matrix Hat для Raspberry Pi
RGB Matrix Hat
Открыть в iArduino
Trema+Expander Hat для Raspberry Pi
Hat для Raspberry Pi со встренным DC-DC преобразователем и расширителем выводов с ШИМ (PWM) и АЦП (ADC)
Открыть в iArduino
Буферные калибровочные растворы для pH-метра: 4.00pH, 6.86pH, 9.18pH
Смеси для приготовления буферных растворов калибровки pH-метра
Открыть в iArduino