Включение и выключение светодиода с помощью Arduino, HC-06 и Android

Хотя в примерах ниже используется HC-06, HC-05 в режиме Slave также подойдёт.

С помощью MIT App Inventor довольно легко создать приложение, которое может включать и выключать светодиод с Android-устройства.

Это простой пример отправки команд на Arduino для включения или выключения светодиода. Android-приложение отправляет ASCII-коды на Arduino через Bluetooth-модуль HC-06: ON для включения и OF для выключения.

Загрузите приложение, подключитесь к HC-06, а затем используйте кнопку LED для включения и выключения светодиода.

Использование приложения для управления LED Arduino Android LED включение и выключение

Вы также можете открыть монитор порта, чтобы видеть команды по мере их получения:

Монитор порта Arduino

Необходимые шаги:

  1. Создать схему, включающую Bluetooth-модуль и светодиод

  2. Создать скетч Arduino, который может принимать команды от HC-06 и включать/выключать светодиод

  3. Создать Android-приложение, которое отправляет команды через Bluetooth

Схема

Схема аналогична используемой в статье Arduino and HC-06 (ZS-040), за исключением добавления светодиода с резистором, подключённого к пину D12. Автор использовал резистор 220 Ом, но подходят и другие номиналы.

Согласно закону Ома: при источнике 5В, зелёном светодиоде с прямым падением напряжения 2.2В и прямым током 20мА рекомендуется резистор 150 Ом. Таким образом, подойдёт любое значение от 180 Ом до примерно 680 Ом.

Схема подключения Принципиальная схема подключения

Скетч Arduino

Скетч получает данные от Bluetooth-модуля через программный последовательный порт. Затем он проверяет данные на наличие команд ON и OF. При получении ON светодиод включается, при получении OF — выключается.

Для надёжного приёма данных, данные обрамляются начальным и конечным маркерами. В этом примере используются < и >. Используется функция recvWithStartEndMarkers, которая была опубликована на форуме Arduino пользователем Robin2. Функция была скопирована без изменений.

Функция recvWithStartEndMarkers() проверяет данные, полученные через последовательное соединение, и копирует всё, что находится между начальным и конечным маркерами, в переменную receivedChars. Когда данные найдены, переменная newData устанавливается в true.

В основном цикле мы продолжаем вызывать функцию recvWithStartEndMarkers() до тех пор, пока не будет установлена newData. Когда newData становится true, мы знаем, что получена новая команда, и вызываем parseData() для её обработки. Внутри parseData() мы сбрасываем newData в false, и процесс продолжается.

void loop()
{
     if (BTserial.available() > 0)     {  recvWithStartEndMarkers(); }
     if (newData) { parseData(); }
}

Полный скетч:

// Bluetooth sketch HC-06_02
// Turn a LED on and off from an Android app
// App can be downloaded from www.martyncurrey.com
//
// Pins
// 2 Software serial - RX
// 3 Software serial - TX
// 12 LED

boolean debug = true;

#include <SoftwareSerial.h>
SoftwareSerial BTserial(2,3); // RX | TX
// Connect the HC-06 TX to the Arduino RX.
// Connect the HC-06 RX to the Arduino TX through a voltage divider.

// max length of command is 20 chrs
const byte numChars = 20;
char receivedChars[numChars];
boolean newData = false;

byte LEDpin = 12;


void setup()
{
     pinMode(LEDpin, OUTPUT);
     Serial.begin(9600);
     Serial.println("<Arduino is ready>");

     // The default baud rate for the HC-06s I have is 9600. Other modules may have a different speed. 38400 is common.
     BTserial.begin(9600);
}

void loop()
{
     if (BTserial.available() > 0)     {  recvWithStartEndMarkers(); }
     if (newData) { parseData(); }
}


void parseData()
{
        newData = false;
        if (debug) {  Serial.println( receivedChars ); }
        if (receivedChars[0] == 'O'  && receivedChars[1] == 'N' )  { digitalWrite(LEDpin,HIGH);  }
        if (receivedChars[0] == 'O'  && receivedChars[1] == 'F' )  { digitalWrite(LEDpin,LOW);   }
}


void recvWithStartEndMarkers()
{

     // function recvWithStartEndMarkers by Robin2 of the Arduino forums
     // See  http://forum.arduino.cc/index.php?topic=288234.0

     static boolean recvInProgress = false;
     static byte ndx = 0;
     char startMarker = '<';
     char endMarker = '>';
     char rc;

     if (BTserial.available() > 0)
     {
          rc = BTserial.read();
          if (recvInProgress == true)
          {
               if (rc != endMarker)
               {
                    receivedChars[ndx] = rc;
                    ndx++;
                    if (ndx >= numChars) { ndx = numChars - 1; }
               }
               else
               {
                     receivedChars[ndx] = '\0'; // terminate the string
                     recvInProgress = false;
                     ndx = 0;
                     newData = true;
               }
          }

          else if (rc == startMarker) { recvInProgress = true; }
     }
}

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

Автор создал Android-приложение в MIT App Inventor. Это было довольно просто, когда он разобрался с работой Bluetooth.

Приложение очень простое — оно просто отправляет команды. Нет проверки, действительно ли Arduino получила команды. Экран также очень прост: кнопка для подключения к Bluetooth и кнопка включения/выключения светодиода. Приложение использует ListPicker для хранения доступных Bluetooth-устройств, который не отображается на экране. Он вызывается кнопкой подключения.

Экран приложения

Приложение содержит 4 блока и список:

Блоки App Inventor

Блок 1

Этот блок обрабатывает кнопку подключения. При нажатии кнопки блок/функция сначала проверяет, включён ли Bluetooth, а затем — есть ли уже активное Bluetooth-соединение. Если Bluetooth не включён, отображается сообщение об ошибке. Если уже есть активное соединение, пользователю предлагается закрыть его. Ответ пользователя обрабатывается в Блоке 3, Notifier1.AfterChoosing.

Если Bluetooth включён и нет текущего соединения, сопряжённые Bluetooth-устройства копируются в список pairedDevices. Если в списке есть хотя бы 1 элемент, содержимое списка копируется в ListPicker. ListPicker затем активируется, позволяя пользователю выбрать Bluetooth-устройство. Список pairedDevices используется для подсчёта количества сопряжённых устройств. Если список пуст, отображается сообщение об ошибке.

Блок 1 — обработка подключения

Блок 2

Блок 2, BT_LP.AfterPicking, обрабатывает ListPicker после того, как пользователь выбрал одно из сопряжённых Bluetooth-устройств. Он берёт выбранный элемент и пытается подключиться. В случае успеха текст на кнопке Bluetooth меняется на «Connected». Если подключение не удалось, отображается сообщение об ошибке.

После установления соединения приложение ожидает нажатия кнопки LED.

Блок 2 — обработка выбора устройства

Блок 3

Блок 3 обрабатывает диалог Notifier, который спрашивает пользователя, хочет ли он закрыть соединение.

Блок 3 — закрытие соединения

Блок 4

Блок 4, LED_BUTTON_btn.Click, обрабатывает кнопку LED. Проверяя текст кнопки, можно определить, какую команду отправить. Если текст говорит «ON», значит светодиод включён и нужно его выключить — отправляем команду OF. Если текст «OFF», светодиод выключен — отправляем команду ON. Фактически отправляемые команды — <ON> и <OF>. Текст и цвет фона кнопки обновляются для отражения нового состояния светодиода.

Если кнопка LED нажата при отсутствии активного соединения, отображается сообщение об ошибке.

Блок 4 — управление LED

Загрузка

Скачать zip-файл, содержащий скетч Arduino, приложение arduinoBTcontrol и файл App Inventor aia.

В части 2 добавляется двусторонняя связь и возможность управления светодиодом как с Arduino, так и из приложения.

Связанные материалы:

Добавление функции автоподключения в приложение App Inventor: https://www.martyncurrey.com/android-mit-app-inventor-auto-connect-to-bluetooth/