Включение и выключение светодиода с помощью 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 для включения и выключения светодиода.
Вы также можете открыть монитор порта, чтобы видеть команды по мере их получения:
Необходимые шаги:
Создать схему, включающую Bluetooth-модуль и светодиод
Создать скетч Arduino, который может принимать команды от HC-06 и включать/выключать светодиод
Создать 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 блока и список:
Блок 1
Этот блок обрабатывает кнопку подключения. При нажатии кнопки блок/функция сначала проверяет, включён ли Bluetooth, а затем — есть ли уже активное Bluetooth-соединение. Если Bluetooth не включён, отображается сообщение об ошибке. Если уже есть активное соединение, пользователю предлагается закрыть его. Ответ пользователя обрабатывается в Блоке 3, Notifier1.AfterChoosing.
Если Bluetooth включён и нет текущего соединения, сопряжённые Bluetooth-устройства копируются в список pairedDevices. Если в списке есть хотя бы 1 элемент, содержимое списка копируется в ListPicker. ListPicker затем активируется, позволяя пользователю выбрать Bluetooth-устройство. Список pairedDevices используется для подсчёта количества сопряжённых устройств. Если список пуст, отображается сообщение об ошибке.
Блок 2
Блок 2, BT_LP.AfterPicking, обрабатывает ListPicker после того, как пользователь выбрал одно из сопряжённых Bluetooth-устройств. Он берёт выбранный элемент и пытается подключиться. В случае успеха текст на кнопке Bluetooth меняется на «Connected». Если подключение не удалось, отображается сообщение об ошибке.
После установления соединения приложение ожидает нажатия кнопки LED.
Блок 3
Блок 3 обрабатывает диалог Notifier, который спрашивает пользователя, хочет ли он закрыть соединение.
Блок 4
Блок 4, LED_BUTTON_btn.Click, обрабатывает кнопку LED. Проверяя текст кнопки, можно определить, какую команду отправить. Если текст говорит «ON», значит светодиод включён и нужно его выключить — отправляем команду OF. Если текст «OFF», светодиод выключен — отправляем команду ON. Фактически отправляемые команды — <ON> и <OF>. Текст и цвет фона кнопки обновляются для отражения нового состояния светодиода.
Если кнопка LED нажата при отсутствии активного соединения, отображается сообщение об ошибке.
Загрузка
Скачать zip-файл, содержащий скетч Arduino, приложение arduinoBTcontrol и файл App Inventor aia.
В части 2 добавляется двусторонняя связь и возможность управления светодиодом как с Arduino, так и из приложения.
Связанные материалы:
Добавление функции автоподключения в приложение App Inventor: https://www.martyncurrey.com/android-mit-app-inventor-auto-connect-to-bluetooth/