Community Engee

Arduino: Новогодний выпуск

作者
avatar-alexevsalexevs
Notebook

Пакет поддержки Arduino: цифровые входы и выходы

В этом примере мы снова работаем с цифровыми выходами Arduino MEGA, используя динамическую индикацию на четырёхразрядном семисегментном индикаторе 5461AS-1. Кроме того, мы задействуем цифровой вход для переключения отображаемых данных, а выделение фронта входного сигнала реализуем при помощи конечного автомата.

Введение

В предыдущих примерах мы уже рассмотрели: программирование семисегментного индикатора и динамической индикации. В этом примере мы объединим обе модели - разряды индикатора 5461AS будем переключать динамически, на каждый разряд выводя соответствующую последовательность зажигаемых сегментов.

Так как индикатор четырёхразрядный, а проект разрабатывается накануне Нового 2026 года, то мы реализуем индикацию смены года по нажатию на кнопку.

В примере мы используем также Arduino MEGA с цифровыми входами/выходами : 30 - 36 для сегментов, 40-44 для разрядов, 2 - для кнопки.

Кроме этого, для схемы понадобятся: макетная плата, кнопка, 4 резистора по 330 Ом для разрядов, 1 резистор 10 кОм и конденсатор 68 нФ для антидребезговой схемы.

Аппаратная часть

Схема соединений представлена ниже.

scheme.png

Подключения удобно выполнить согласно следующей таблице:

Пин Arduino

№ контакта 5461AS-1

Имя контакта 5461AS-1

Цвет кабеля на схеме

2

-

-

Розовый

30

11

a

Красный

31

7

b

Оранжевый

32

4

c

Жёлтый

33

2

d

Зелёный

34

1

e

Голубой

35

10

f

Синий

36

5

g

Фиолетовый

40

12

D1

Коричневый (через 330 Ом)

41

9

D2

Охра (через 330 Ом)

42

8

D3

Серый (через 330 Ом)

43

6

D4

Белый (через 330 Ом)

5V

-

-

Красный

GND

-

-

Чёрный

Модель примера

Модель примера представлена на скриншоте ниже:

model.png

Управление динамической индикацией (переключением сегментов) осуществляется так же, как в примере с LED матрицей, за исключением того, что здесь только 4 разряда, переключающиеся с младшего до старшего.

Блок on_digit также определяет номер зажигаемого разряда, а между включениями разрядов гасятся все сегменты. Таким образом, последовательность в блоке определяется таким образом:

In [ ]:
on_digit_data = [1, 0, 2, 0, 3, 0, 4, 0];

Формирование же последовательностей, которые включают сегменты, реализовано аналогично примеру с семисегментным индикатором. Управляющие данные для включения сегментов - последовательности в блоках Repeating Sequence Stair, которые согласно включаемому разряду индикатору передают на вывод ту или иную цифру для отображения. В модели заданы следующие входные данные:

In [ ]:
year25_data = [2, 11, 0, 11, 2, 11, 5, 11];
year26_data = [2, 11, 0, 11, 2, 11, 6, 11];

Здесь, в векторе содержится число 11 - для переключателя multiportswitch оно находится вне диапазона номеров входов, что приводит к его переключению на вход по умолчанию, передавая на сегменты последовательность [0, 0, 0, 0, 0, 0, 0].

Источник сигнала для переключения входных данных - периферийный блок Arduino из пакета поддержки Arduino - digitalRead. В блоке задан номер цифрового входа - 2. При помощи конечного автомата edge_detector (блок Chart) происходит выделение переднего фронта входного сигнала. То есть, при нажатии на кнопку источник входных данных для индикатора переключаются с блока year25 на блок year26.

Подготовка

При помощи этого блока кода автоматизируем запуск серверной программы Engee.Интеграции:

In [ ]:
import .engee.package as epkg

const PKGNAME = "Engee-Device-Manager"

function epkg_start(pkg::String)
    if !epkg.isinstalled(pkg)
        @info "Package not installed. Installing and Starting..."
        epkg.install(pkg)
        @info "Package is up to date. Starting..."
        # println("Ссылка для подключения к серверу:\n"*epkg.start(pkg))
    else
        updates = epkg.checkupdates(pkg)
        if isnothing(updates)
            @info "Package is up to date. Starting..."
            # println("Ссылка для подключения к серверу:\n"*epkg.start(pkg))
        else
            @info "Updates available. Reinstalling and Starting..."
            epkg.update(pkg)
            @info "Package is up to date. Starting..."
            # println("Ссылка для подключения к серверу:\n"*epkg.start(pkg))
        end
    end
end

epkg_start(PKGNAME)
Пакет поддержки 'Engee-Device-Manager' установлен.
У вас установлена актуальная версия пакета поддержки 'Engee-Device-Manager'.
[ Info: Package is up to date. Starting...

Также за кадром, как обычно, запустим клиентскую программу Engee.Интеграции и подключим наше устройство.

Выполнение модели

Выполним модель в независимом режиме.

На записи мы можем наблюдать, что все заложенные функциональности:

  • динамическая индикация по разрядам,
  • вывод на сегменты заданных числовых значений,
  • переключение отображаемых данных по переднему фронту входного сигнала

реализованы так, как и было задумано.

Заключение

В этом примере мы соединили два предыдущих примера работы с цифровыми выходами Arduino MEGA из пакета поддержки, динамическую индикацию и вывод семисегментных цифр. Кроме того, мы добавили цифровой вход и реализовали логику выделения переднего фронта сигнала при помощи конечного автомата.