Arduino, HM-10 и App Inventor 2: Добавление слайдера

Это руководство расширяет статью Arduino, HM-10 и App Inventor 2, добавляя функцию слайдера для управления яркостью светодиода. В статье показано, как интегрировать элемент управления слайдером в существующее Android-приложение, разработанное в MIT App Inventor 2.

Arduino HM-10 App Inventor 2 слайдер

Приложение со слайдером

Протокол команд

Реализация использует ASCII-команды в формате [Snnn], где:

  • S обозначает команду слайдера

  • nnn представляет значение от 000 до 255

Этот подход обеспечивает согласованность с существующей структурой команд и при этом упрощает код Arduino за счёт значений фиксированной длины.

Особенности слайдера App Inventor 2

Важные особенности слайдеров в AI2:

  • Поведение масштабирования: значения слайдера масштабируются в зависимости от диапазона и размера, потенциально перескакивая (1, 4, 7, 10) вместо последовательного увеличения

  • Дробные значения: слайдеры могут возвращать нецелые значения (1.5, 1.6, 1.7)

  • Частота событий: When.Slider.PositionChanged срабатывает непрерывно во время перемещения, а не только по завершении

Добавление слайдера в приложение

Настройка дизайнера

  1. Добавьте метки для отступов (высота: 10px, ширина: fill parent)

  2. Вставьте слайдер между метками со следующими свойствами:

    • Ширина: 95%

    • Min: 0

    • Max: 255

    • ThumbPosition: 0

  3. Поместите слайдер в горизонтальное расположение с центрированием для правильного позиционирования

Макет дизайнера

Добавление слайдера — шаг 1

Добавление слайдера — шаг 2

Добавление слайдера — шаг 3

Предварительный просмотр приложения

Настройка свойств слайдера

Горизонтальное расположение

Завершённый дизайн

Реализация блоков

Обработка изменения позиции:

Округление десятичных значений до целых чисел с помощью блока math round.

Блоки — обработка позиции слайдера

Форматирование команды:

Создание процедуры formatNumber для дополнения значений ведущими нулями, преобразующей одно- или двухзначные числа в трёхсимвольный формат (например, 5 становится «005»).

Блоки — formatNumber

Блоки — отправка команды

Блоки — дополнительная логика

Блоки — итоговый вид

Реализация скетча Arduino

Схема подключения

Схема подключения с 3 светодиодами

Макетная плата

Обработка команд слайдера

if (receivedChars[0] == 'S')      // Проверка команды слайдера
{
    // Фиксированный формат длины: "S123"
    // Извлечение значения из позиций 1, 2, 3

    byte hundreds = (receivedChars[1]-48) * 100;
    byte tens = (receivedChars[2]-48) * 10;
    byte units = receivedChars[3]-48;
    byte value = hundreds + tens + units;

    analogWrite(LED_PIN[0], value);
}

Код преобразует ASCII-символы в числовые значения, вычитая 48 (ASCII-значение „0“) из каждого символа.

Монитор последовательного порта — команды слайдера

Обновлённая логика кнопки

Для светодиода 1 (который теперь поддерживает ШИМ-диммирование):

if (pos+1==1){
    if (LED_State[pos]==0) {
        analogWrite(LED_PIN[pos], 0);
    }
    else {
        analogWrite(LED_PIN[pos], 255);
    }
}
else {
    digitalWrite(LED_PIN[pos], LED_State[pos]);
}

Светодиоды 2 и 3 остаются цифровыми, в то время как светодиод 1 использует analogWrite() для управления яркостью.

Двунаправленные обновления

При нажатии физических кнопок отправляются обновления позиции слайдера в приложение:

if (pos+1==1){
    if (LED_State[pos]==0) {
        BTserial.print("[S,0]");
        Serial.println("[S,0]");
    }
    else {
        BTserial.print("[S,255]");
        Serial.println("[S,255]");
    }
}

Обновления приложения для двунаправленного управления

Обработка команд слайдера от Arduino

Обновление приложения — шаг 1

Обновление приложения — шаг 2

Обновление приложения — шаг 3

Обновление приложения — шаг 4

Обновление приложения — шаг 5

Обновление приложения — шаг 6

Обновление приложения — шаг 7

Добавление нового блока обработки команд в приложение: если первый элемент команды равен «S», установить Slider1.ThumbPosition в значение второго элемента.

Обновление состояния кнопок от слайдера

Добавление логики в событие изменения позиции слайдера: если thumbPosition > 0, вызвать LED_BUTTON_ON(), иначе вызвать LED_BUTTON_OFF().

Это обеспечивает отражение состояния слайдера в программной кнопке.

Известные ограничения

Проблемы производительности:

  • Быстрое перемещение слайдера вызывает искажение команд из-за ограничения скорости 9600 бод

  • Слайдер непрерывно генерирует события, потенциально перегружая соединение

Стратегия решения: автор предлагает увеличить скорость передачи HM-10 до 115200 с помощью AT-команд (требуется отдельная конфигурация, не рассмотренная в этой статье).

Возможности для улучшения

  1. Отключение слайдера при неактивном BLE-соединении

  2. Увеличение скорости последовательного порта для более быстрой передачи данных

  3. Сохранение кнопки как полного включения/выключения, а слайдера — для точной настройки яркости

Примечание

Оригинальная статья: Arduino, HM-10 and App Inventor 2: Adding a Slider (Martyn Currey)