Главная chevron_right Наши уроки chevron_right Raspberry Pi chevron_right Выводим показания датчика кислотности жидкости (pH-метр), FLASH-I2C на RGB-матрицу (Raspberry Pi)

Выводим показания датчика кислотности жидкости (pH-метр), FLASH-I2C на RGB-матрицу (Raspberry Pi)

Подключаем датчик кислотности жидкости pH-метр FLASH-I2C к Raspberry Pi и выводим показания в реальном времени на RGB-матрицу 64×32 с помощью Python

Общие сведения:

В этом уроке мы объясним как выводить показания 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 позиций
Все уроки Raspberry Pi