Arduino, HM-10 и App Inventor 2

Обновление: BLE-расширение, включённое в примеры, устарело. Скачайте последнюю версию с сайта App Inventor BLE и замените существующее расширение.

Данное руководство даёт хорошее введение в использование HM-10 с App Inventor 2 и выходит за рамки обычных начальных руководств. Хотя я использую Arduino, принципы будут одинаковы для любого другого микроконтроллера или для использования HM-10 самостоятельно.

Внимание: это очень длинная статья.

https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/martyncurrey/arduino-hm-10-and-app-inventor-2-1.gif

Для использования этого руководства вы должны быть знакомы с App Inventor, иметь Android-устройство с поддержкой BLE, а также Arduino и HM-10.

Содержание:

Часть 1: Включение и выключение LED — базовый пример
Часть 2: Двустороннее управление LED

BLE

Краткое введение в BLE.

BLE — это не обновление Bluetooth Classic, это другая система с другими целями использования. BLE разработан для приложений с низким энергопотреблением и достигает этого за счёт использования редких и малых пакетов данных. Он не предназначен для постоянных подключений и больших объёмов данных. Для этого лучше подходит Bluetooth Classic.

Существует 2 способа общения BLE-устройств:

  • Broadcaster + Observer — нет стандартного соединения, Broadcaster (обычно датчик) периодически отправляет сигналы (пакеты объявления), которые Observer прослушивает.

  • Central + Peripheral — сценарий похож (но не идентичен) классическому подключению. Central (мастер) находит Peripheral (ведомое устройство) и инициирует соединение.

BLE основан на сервисах и характеристиках. Сервис — это коллекция связанных характеристик, а характеристика — это место, где хранятся данные. Каждый сервис и характеристика имеет уникальный идентификатор UUID.

HM-10

HM-10 — это недорогой серийный BLE-модуль от Jinan Huamao. Он имеет серийный/UART уровень, который упрощает использование с Arduino. Для простых подключений или использования в качестве базового iBeacon HM-10 идеален.

Для общего использования HM-10 имеет 2 пользовательские характеристики в одном пользовательском сервисе:

CUSTOM SERVICE
UUID: 0000FFE0-0000-1000-8000-00805F9B34FB
CUSTOM CHARACTERISTICS
UUID: 0000FFE1-0000-1000-8000-00805F9B34FB — READ/WRITE/NOTIFY
UUID: 0000FFE2-0000-1000-8000-00805F9B34FB — WRITE only

Характеристика FFE1 активна по умолчанию. FFE2 неактивна и должна быть включена перед использованием. В следующих примерах я буду использовать UUID FFE1 для чтения и записи данных.

App Inventor 2

App Inventor 2 — довольно простой способ начать создавать Android-приложения. Он использует систему Blockly вместо текста. BLE-расширение можно скачать с http://iot.appinventor.mit.edu.

App Inventor IOT официально поддерживает Arduino 101 и BBC micro:bit, но можно использовать любой BLE-модуль, такой как HM-10.

Я буду использовать файл BaseConnect aia в качестве отправной точки. Это минимальное приложение-шаблон для сканирования и подключения к BLE-устройствам.

Часть 1: Включение и выключение LED — базовый пример

Начнём с очень простого приложения для управления одним светодиодом: включить и выключить.

https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/martyncurrey/arduino-hm-10-and-app-inventor-2-1.gif

Схема Arduino и HM-10

Простая схема: Arduino, HM-10, светодиод и резистор.

Arduino D8 (AltSoftSerial RX) к HM-10 TX
Arduino D9 (AltSoftSerial TX) через делитель напряжения к HM-10 RX
Arduino D2 к резистору 330 Ом и светодиоду

Пин RX HM-10 работает на 3.3 В. Пин TX Arduino — 5 В. Делитель напряжения (резисторы 1 кОм и 2 кОм) понижает 5 В до 3.3 В.

https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/martyncurrey/arduino-hm-10-and-app-inventor-2-10.jpg https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/martyncurrey/arduino-hm-10-and-app-inventor-2-9.jpg

Скетч Arduino

Скетч проверяет входящие данные. Если получен «0» — светодиод выключается, если «1» — включается.

//  Arduino, HM-10, App Inventor 2
//
//  Example Project Part 1: Turn an LED on and off basic
//  By Martyn Currey. www.martyncurrey.com
//
//  Пины
//  BT VCC к Arduino 5V
//  BT GND к GND
//  Arduino D8 (ASS RX) - BT TX (делитель не нужен)
//  Arduino D9 (ASS TX) - BT RX через делитель напряжения
//  Arduino D2 - Резистор + LED

#include <AltSoftSerial.h>
AltSoftSerial ASSserial;

byte LEDPin = 2;
char c=' ';

void setup()
{
    Serial.begin(9600);
    Serial.print("Sketch:   ");   Serial.println(__FILE__);
    Serial.print("Uploaded: ");   Serial.println(__DATE__);
    Serial.println(" ");

    ASSserial.begin(9600);
    Serial.println("ASSserial started at 9600");
    Serial.println(" ");

    pinMode(LEDPin, OUTPUT);
}

void loop()
{
    // Чтение из Bluetooth-модуля и управление LED
    if (ASSserial.available())
    {
        c = ASSserial.read();
        Serial.println(c);

        // ASCII код 0 — десятичный 48
        // ASCII код 1 — десятичный 49
        if ( c== 48) { digitalWrite(LEDPin, LOW); }
        if ( c== 49) { digitalWrite(LEDPin, HIGH); }
    }
}

Проверить работу скетча можно в мониторе порта:

https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/martyncurrey/arduino-hm-10-and-app-inventor-2-31.jpg

Android-приложение

Начнём с простого приложения, отправляющего 2 кода: «0» (выключить LED) и «1» (включить LED). Начальное приложение «глупое» — оно не знает фактическое состояние LED, просто отправляет коды при нажатии кнопок.

Используем шаблон BaseConnect от команды AI2. Скачать можно с http://iot.appinventor.mit.edu.

https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/martyncurrey/arduino-hm-10-and-app-inventor-2-2.jpg

Откройте App Inventor, загрузите файл BaseConnect aia и сохраните как «ARD_HM10_AI2_Single_LED_01». Нажмите Scan и посмотрите, какие устройства найдены.

https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/martyncurrey/arduino-hm-10-and-app-inventor-2-3.jpg

Приложение нашло различные BLE-устройства, включая HM-10. К сожалению, текст слишком мелкий. В дизайнере выберите ListBLE и измените TextSize на 48.

https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/martyncurrey/arduino-hm-10-and-app-inventor-2-4.jpg https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/martyncurrey/arduino-hm-10-and-app-inventor-2-5.jpg

Приложение BaseConnect содержит только 7 блоков.

https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/martyncurrey/arduino-hm-10-and-app-inventor-2-8.jpg

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

Добавим кнопки для включения и выключения LED. Используем два блока Button внутри Horizontal Arrangement с текстовыми метками-разделителями.

https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/martyncurrey/arduino-hm-10-and-app-inventor-2-6.jpg https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/martyncurrey/arduino-hm-10-and-app-inventor-2-7.jpg

Переименование элементов:

https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/martyncurrey/arduino-hm-10-and-app-inventor-2-11.jpg https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/martyncurrey/arduino-hm-10-and-app-inventor-2-12.jpg

С BLE нужно записывать данные в определённую характеристику, что означает необходимость знать UUID характеристики и сервиса. В данном примере используется характеристика HM-10 по умолчанию 0000FFE1-0000-1000-8000-00805F9B34FB под сервисом 0000FFE0-0000-1000-8000-00805F9B34FB.

https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/martyncurrey/arduino-hm-10-and-app-inventor-2-13.jpg

Блоки BLE Write обычно ожидают данные в виде списка. Если использовать простые данные, AI2 сконвертирует их автоматически. Нужны UUID сервиса и UUID характеристики.

https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/martyncurrey/arduino-hm-10-and-app-inventor-2-14.jpg

Добавьте глобальные переменные для UUID и блоки событий нажатия кнопок:

https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/martyncurrey/arduino-hm-10-and-app-inventor-2-15.jpg

При нажатии ON отправляется «1», при OFF — «0».

Нужно добавить проверку включённости Bluetooth перед сканированием. Добавляем BluetoothClient и Notifier:

https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/martyncurrey/arduino-hm-10-and-app-inventor-2-16.jpg https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/martyncurrey/arduino-hm-10-and-app-inventor-2-17.jpg

Изменяем ButtonScan.Click для проверки Bluetooth:

https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/martyncurrey/arduino-hm-10-and-app-inventor-2-18.jpg

Предупреждение при выключенном Bluetooth:

https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/martyncurrey/arduino-hm-10-and-app-inventor-2-19.png

Проверка подключения перед отправкой:

https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/martyncurrey/arduino-hm-10-and-app-inventor-2-20.jpg

Результат — 3 экрана приложения:

https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/martyncurrey/arduino-hm-10-and-app-inventor-2-21.png https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/martyncurrey/arduino-hm-10-and-app-inventor-2-22.png https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/martyncurrey/arduino-hm-10-and-app-inventor-2-23.png

Блоки:

https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/martyncurrey/arduino-hm-10-and-app-inventor-2-24.jpg https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/martyncurrey/arduino-hm-10-and-app-inventor-2-25.jpg

Экран дизайнера:

https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/martyncurrey/arduino-hm-10-and-app-inventor-2-27.jpg https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/martyncurrey/arduino-hm-10-and-app-inventor-2-26.jpg https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/martyncurrey/arduino-hm-10-and-app-inventor-2-28.jpg https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/martyncurrey/arduino-hm-10-and-app-inventor-2-29.jpg

Результат на телефоне:

https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/martyncurrey/arduino-hm-10-and-app-inventor-2-30.png

Финальный дизайнер и блоки:

https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/martyncurrey/arduino-hm-10-and-app-inventor-2-62.jpg https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/martyncurrey/arduino-hm-10-and-app-inventor-2-61.png

Часть 2: Двустороннее управление LED

В этой части добавляем кнопку на стороне Arduino и двустороннее управление. Когда LED включается/выключается кнопкой на Arduino, приложение обновляется. И наоборот.

Схема с кнопкой

К предыдущей схеме добавляем кнопку на пине D3 с подтягивающим резистором 10 кОм.

https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/martyncurrey/arduino-hm-10-and-app-inventor-2-48.jpg https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/martyncurrey/arduino-hm-10-and-app-inventor-2-49.jpg

Скетч Arduino — Часть 2

//  Arduino, HM-10, App Inventor 2
//
//  Example Project Part 2: Turn an LED on and off 2 way control 01
//  By Martyn Currey. www.martyncurrey.com
//
//  Пины
//  BT VCC к Arduino 5V
//  BT GND к GND
//  Arduino D8 (ASS RX) - BT TX (делитель не нужен)
//  Arduino D9 (ASS TX) - BT RX через делитель напряжения
//  Arduino D2 - Резистор + LED
//  Arduino D3 - Резистор 10K + кнопка

#include <AltSoftSerial.h>
AltSoftSerial ASSserial;

// Константы для аппаратного обеспечения
const byte LEDPin = 2;
const byte SwitchPin = 3;

// Общие переменные
boolean LED_State = false;
boolean switch_State = false;
boolean oldswitch_State = false;

char c=' ';

void setup()
{
    Serial.begin(9600);
    Serial.print("Sketch:   ");   Serial.println(__FILE__);
    Serial.print("Uploaded: ");   Serial.println(__DATE__);
    Serial.println(" ");

    ASSserial.begin(9600);
    Serial.println("AltSoftSerial started at 9600");
    Serial.println(" ");

    pinMode(LEDPin, OUTPUT);
    digitalWrite(LEDPin,LOW);

    pinMode(SwitchPin, INPUT);

} // void setup()

void loop()
{
       checkSwitch();
       checkRecievedData();
}

void checkSwitch()
{
     // Простая функция переключения с дребезгоподавлением
     boolean state1 = digitalRead(SwitchPin); delay(1);
     boolean state2 = digitalRead(SwitchPin); delay(1);
     boolean state3 = digitalRead(SwitchPin);

     if ((state1 == state2) && (state1==state3))
     {
          switch_State = state1;
          if ( (switch_State == HIGH) && (oldswitch_State == LOW) )
          {
               // переключаем LED_State
               LED_State = ! LED_State;

               // Если LED_State HIGH — включаем LED
               if ( LED_State == HIGH)
               {
                    digitalWrite(LEDPin,HIGH);   // включить LED
                    ASSserial.print("1" );       // сообщить приложению
                    Serial.println("Sent - 1");
               }

               else
               {
                   digitalWrite(LEDPin,LOW);    // выключить LED
                   ASSserial.print("0");        // сообщить приложению
                   Serial.println("Sent - 0");
               }
          }
          oldswitch_State = switch_State;
      }
}

void checkRecievedData()
{
    // Чтение из Bluetooth-модуля и управление LED
    if (ASSserial.available())
    {
        c = ASSserial.read();
        Serial.println(c);

        // ASCII 0 = 48, ASCII 1 = 49
        if ( c== 48) { digitalWrite(LEDPin, LOW);     LED_State = LOW;  }
        if ( c== 49) { digitalWrite(LEDPin, HIGH);    LED_State = HIGH; }
    }
}

Обновление приложения — приём данных

Для приёма данных от HM-10 необходимо подписаться на характеристику для получения уведомлений. Используется блок RegisterForStrings.

https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/martyncurrey/arduino-hm-10-and-app-inventor-2-50.jpg https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/martyncurrey/arduino-hm-10-and-app-inventor-2-51.jpg https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/martyncurrey/arduino-hm-10-and-app-inventor-2-52.jpg

При получении данных обновляем состояние кнопки:

https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/martyncurrey/arduino-hm-10-and-app-inventor-2-53.jpg https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/martyncurrey/arduino-hm-10-and-app-inventor-2-54.jpg https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/martyncurrey/arduino-hm-10-and-app-inventor-2-55.jpg https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/martyncurrey/arduino-hm-10-and-app-inventor-2-56.jpg https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/martyncurrey/arduino-hm-10-and-app-inventor-2-57.jpg https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/martyncurrey/arduino-hm-10-and-app-inventor-2-58.jpg https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/martyncurrey/arduino-hm-10-and-app-inventor-2-59.jpg https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/martyncurrey/arduino-hm-10-and-app-inventor-2-60.jpg

Финальные блоки:

https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/martyncurrey/arduino-hm-10-and-app-inventor-2-63.png

Скачать

Все файлы aia и скетчи Arduino доступны на странице оригинальной статьи.