Arduino, HM-10 и App Inventor 2: Добавление слайдера
Это руководство расширяет статью Arduino, HM-10 и App Inventor 2, добавляя функцию слайдера для управления яркостью светодиода. В статье показано, как интегрировать элемент управления слайдером в существующее Android-приложение, разработанное в MIT 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срабатывает непрерывно во время перемещения, а не только по завершении
Добавление слайдера в приложение
Настройка дизайнера
Добавьте метки для отступов (высота: 10px, ширина: fill parent)
Вставьте слайдер между метками со следующими свойствами:
Ширина: 95%
Min: 0
Max: 255
ThumbPosition: 0
Поместите слайдер в горизонтальное расположение с центрированием для правильного позиционирования
Реализация блоков
Обработка изменения позиции:
Округление десятичных значений до целых чисел с помощью блока math round.
Форматирование команды:
Создание процедуры formatNumber для дополнения значений ведущими нулями, преобразующей одно- или двухзначные числа в трёхсимвольный формат (например, 5 становится «005»).
Реализация скетча Arduino
Схема подключения
Обработка команд слайдера
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
Добавление нового блока обработки команд в приложение: если первый элемент команды равен «S», установить Slider1.ThumbPosition в значение второго элемента.
Обновление состояния кнопок от слайдера
Добавление логики в событие изменения позиции слайдера: если thumbPosition > 0, вызвать LED_BUTTON_ON(), иначе вызвать LED_BUTTON_OFF().
Это обеспечивает отражение состояния слайдера в программной кнопке.
Известные ограничения
Проблемы производительности:
Быстрое перемещение слайдера вызывает искажение команд из-за ограничения скорости 9600 бод
Слайдер непрерывно генерирует события, потенциально перегружая соединение
Стратегия решения: автор предлагает увеличить скорость передачи HM-10 до 115200 с помощью AT-команд (требуется отдельная конфигурация, не рассмотренная в этой статье).
Возможности для улучшения
Отключение слайдера при неактивном BLE-соединении
Увеличение скорости последовательного порта для более быстрой передачи данных
Сохранение кнопки как полного включения/выключения, а слайдера — для точной настройки яркости
Примечание
Оригинальная статья: Arduino, HM-10 and App Inventor 2: Adding a Slider (Martyn Currey)