На главную страницу Технологии Smart Display Узнать больше о SmartDisplay (RS485 интерфейс)

Узнать больше о SmartDisplay (RS485 интерфейс)

1. Введение

В предыдущей статье “Smart Display с RS485 интерфейсом” было дано введение в протоколы RS485 и Modbus. В этой статье мы дополнительно проиллюстрируем несколько часто используемых техник на примере нескольких страниц, а также проиллюстрируем спецификации и технологии SmartDisplay, включая:

  • Переключение страницы с помощью виджета Button.
  • Обновление значения виджета после смены страницы.
  • Использование зуммера для издания звуков разной длительности.
  • Использование виджетов «Graph».

2. Требуемые компоненты

  • SmartDisplay с интерфейсом RS485. В данном примере мы будем использовать SmartDisplay диагональю 3,5 дюйма.
  • Arduino (Uno или Mega2560).
  • Карта расширения Arduino RS485 (Link to DFRobot).
  • Потенциометр (VR).

3. Подключение

  • Потенциометр: подать напряжение питания 5В, подключить GND к GND, а выходной сигнал к Arduino A0.
  • Подключите A карты расширения RS485 к SmartDisplay RS485+
  • Подключите B карты расширения RS485 к SmartDisplay RS485-

4. Демонстрация

Данный проект состоит из трех страниц, и каждую страницу можно переключать с помощью виджета Button. Содержание и функциональность каждой страницы будут следующими:

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

Демонстрация - Страница 1

Страница 2:
Слева находится кнопка для возврата на предыдущую страницу, а справа - кнопка для перехода на следующую страницу. Кроме того, внизу есть три кнопки, которые позволяют издавать короткие, средние и длинные звуки зуммера.

Демонстрация - Страница 2

Страница 3:
Слева находится кнопка для возврата на предыдущую страницу. Симулируйте аналоговый вход с помощью потенциометра и отобразите результаты на виджете Graph.

Демонстрация - Страница 3-1

Поскольку в данном примере используется карта расширения RS485, перед началом программирования требуется скачайте библиотеку:

Демонстрация - Страница 3-2

5. Создание содержания страницы

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

Создание содержания страницы - 1

Пожалуйста, ознакомьтесь с подробным содержанием виджетов в таблице ниже:

Создание содержания страницы - 2

Вы можете выбрать модель SmartDisplay в зависимости от имеющихся материалов и использовать разные виджеты для создания различного дизайна. Единственное, на что нужно обратить внимание, это то, что ID и тип виджета на каждой странице должны соответствовать определениям в программе. Чтобы упростить процесс, рекомендуется создавать содержание страницы на основе ID и типа виджета, предоставленных в таблице выше.

Далее, перейдем к программированию.

6. Объяснение

(1) Включение файлов

После загрузки библиотеки ModbusMaster, убедитесь, что вы включили ее с помощью директивы #include:

(1) Включение файлов -1

Кроме того, мы разместили некоторые константы, связанные с SmartDisplay, в SmartDisplayModbus.h для более удобного управления. Убедитесь, что вы также его включили.

(2) Преобразование ID виджета в регистр

В предыдущей статье метод преобразования ID виджета в адрес регистра объяснялся следующим образом:

(2) Преобразование ID виджета в регистр-1

Однако, эта форма была разработана, когда на каждой странице было максимум 10 виджетов. Теперь на каждой странице может быть до 64 виджетов. Эта таблица по-прежнему применима к первым 10 виджетам, но для виджетов, идущих за 10-м, нам нужно перейти на новый блок регистров. Поэтому мы определили следующие макросы:

(2) Преобразование ID виджета в регистр-2

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

Explanation - (2) Widget ID to Register Conversion - 3(2) Преобразование ID виджета в регистр-3

(3) Идентификатор виджета и дизайн GUI

При проектировании содержимого страницы с помощью конструктора GUI упоминалось, что идентификаторы виджетов должны оставаться неизменными, поэтому программа определяет константы идентификаторов виджетов следующим образом:

(3) Идентификатор виджета и дизайн GUI - 1

Использование этих определений констант может помочь нам запомнить тип виджета и облегчить сравнение с фактическим дизайном страницы. Если в будущем будет изменен дизайн GUI, не забудьте сравнить эти значения, чтобы избежать ошибок.

(4) Зуммер

Прошивка реализует звук зуммера, задерживая счетчик, а затем отправляя сигнал 0/1 на зуммер, и используя другие счетчики для контроля времени начала и остановки звука. Чтобы сгенерировать звук, нам нужно записать в четыре регистра, включая:

(4) Идентификатор виджета и дизайн GUI - 1

Чтобы отрегулировать продолжительность звука, мы можем создать функцию, которая принимает параметр SMARTDISPLAY_BUZZER_HIGH для генерации звука. Ниже находится пример данной функции:

(4) Идентификатор виджета и дизайн GUI - 2

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

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

(4) Идентификатор виджета и дизайн GUI - 3

(5) Переключение страниц

Перед переключением страниц необходимо войти в CONFIG_MODE. После настройки новой страницы ее можно установить в DISPLAY_MODE. При переключении страниц SmartDisplay перезагружает все виджеты на новой странице. Чтобы избежать выполнения операций чтения/записи до завершения процесса перезагрузки SmartDisplay, обычно добавляют задержку для предоставления достаточного времени. Длительность этой задержки зависит от сложности страницы. Если после переключения страниц наблюдается какое-либо аномальное поведение, вы можете попробовать увеличить время задержки, чтобы увидеть, решит ли это проблему.

(5) Переключение страниц - 1

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

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

(5) Переключение страниц - 2

Далее создаем таблицу страниц:

(5) Переключение страниц - 3

Константа MAX_WIDGETS_PER_PAGE определяет количество виджетов для записи значений на каждой странице. Если вы добавите больше виджетов в будущем, обязательно обновите это значение соответствующим образом.

Затем, в функции loop() вы можете обрабатывать переключение страниц и обработку виджетов:

(5) Переключение страниц - 4

Если текущая страница _curPage не равна следующей странице _nextPage, установите флаг переключения страниц newPage в true. Таким образом, функция обработки страниц будет знать, что требуется инициализация. Возьмем Page0 в качестве примера:

(5) Переключение страниц - 5

Если параметр init равен true, указывая на то, что мы только что вошли на страницу, мы устанавливаем значение WIDGET_P0_BUTTON_NEXT равным 0. Это связано с тем, что при переключении на новую страницу значение кнопки по умолчанию равно 0. Мы хотим выполнить определенные команды (в данном случае, переключение на PAGE_1) только при нажатии кнопки (когда значение меняется с 0 на 1). Поэтому нам нужно сбросить его до 0 (так как оно могло быть уже изменено на 1 ранее).

Для виджета Slider его начальное значение также равно 0 при загрузке. Однако оно могло быть изменено ранее для регулировки яркости. Поэтому нам нужно восстановить его до текущего значения яркости _brightness.

В других случаях (init равен false), мы можем обрабатывать виджеты по-разному, основываясь на том, изменились ли они. Наконец, мы сохраняем значения всех виджетов для ссылки в следующем цикле обработки.

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

(5) Переключение страниц - 6

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

(5) Переключение страниц - 7

(6) Виджет графика

Виджет графика может визуально представлять значения, которые в него записываются, в виде графика. Здесь мы используем переменный резистор, подключенный к A0, чтобы смоделировать аналоговый вход, и мы отображаем изменение данных с помощью виджета графика. Поскольку диапазон аналогового ввода Arduino составляет 0-1023, в то время как виджет графика принимает значения от 0 до 100, нам нужно использовать функцию map() для корректировки диапазона.

Виджет графика был разработан для обновления дисплея только при изменении значения. Если вы хотите добиться эффекта периодического обновления, вы можете использовать небольшой трюк: периодически проверяйте значение, и если оно остается таким же, как и последнее прочитанное значение, слегка измените его (добавив или вычтя 1). Таким образом, вы можете создать иллюзию периодического обновления с динамическими эффектами.

(6) Виджет графика-1

7. Заключение

В завершении мы надеемся, что пример приведенный в данный статье предоставит читателям более глубокое понимание SmartDisplay (RS485 интерфейс). Этот пример также может служить отправной точкой для будущих проектов, помогая сократить время разработки. Вы можете скачать полную программу по следующему URL: Modbus-MultiPageOperation on GitHub.

Если вы не знакомы с RS485/Modbus, вы можете обратиться к предыдущей статье для получения дополнительной информации: SmartDisplay RS485 Introduction.

Вернуться к списку
go top
close