Android Android-приложение для обмена данными с ардуино при помощи bluetooth-модуля HC-05. Приложение будет отправлять ардуине команды включения-отключения D10…D13, а та, в свою очередь, сообщать о выполненных действиях. Прежде чем приступать к написанию приложения, необходимо проверить настройки bluetooth-модуля и подключить его к ардуине. Настройка модуля подробно описана здесь, проделайте всё, что написано в разделе Bluetooth до фразы «Модуль настроен«. После настройки заливаем в ардуину код… Ардуина получает символы от андройд-приложения, выполняет действие и возвращает ответ. Обратите внимание на скорость Serial.begin(9600), она должна совпадать с настройками модуля. … и соединяем её с модулем по этой схеме: Выполните сопряжение телефона с модулем.

Android

Кто не хочет обременять себя написанием приложения, может скачать готовый apk-файл, а если есть желание попрограммировать тогда… Скачиваем, устанавливаем и запускаем Android Studio.В процессе работы нужно будет установить sdk. Создаём новый проект под названием BlueArduNext… Оставляем как есть…Next… Выбираем Empty ActivityNext… Оставляем как есть…Finish Открываем файл AndroidManifest.xml После строчки package=«com.example.dima.blueardu» > добавляем разрешение на использование bluetooth: Строку делаем так:Портретная ориентация. В результате будет так: Кликаем по вкладке activity_main.xml и внизу выбираем вкладку Text Удаляем всё, что там написано и вставляем вот это: Красным цветом подсвечиваются ошибки. В данном случае среда сообщает об отсутствии картинок offlampи onlamp

Сохраните картинки себе на компьютер. После этого скопируйте offlamp.png в буфер (правой кнопкой «копировать»), выберите (правой кнопкой) в левой колонке папку drawable и нажмите вставить. OK… То же самое проделайте со второй картинкой. После этого надписи станут зелёными. Далее откройте вкладку MainActivity.java, удалите всё кроме первой строчки и вставьте этот код: Если всё сделано правильно, то никаких ошибок не должно быть. Разрешите на телефоне отладку по USB: Подключите телефон к компьютеру и запустите компиляцию нажав зелёную стрелку: Через некоторое время появится окно с выбором устройства на котором будет запущено приложение:Отсутствие в списке телефона, означает какие-то проблемы с драйверами. Нажмите ОК, приложение установится и откроется окно со списком сопряжённых устройств: Выберите ваш модуль и после соединения откроется главное окно программы: На этом всё, далее можно приступать к изучению программирования под Android и добавлять свой функционал. Скачать исходники. Здесь можно почитать о том, как сделать метеостанцию.

  • 7 июня 2016, 22:58
  • —>

  • 32460

—> Поддержать автора Telegram-чат istarikЗадать вопрос по статье Telegram-канал istarikИзвестит Вас о новых публикациях Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.

Что для этого потребуется

  1. Любая Arduino-совместимая плата
  2. Bluetooth-модуль
  3. Устройство на котором установлена ОС Android

В качестве Bluetooth-модуля лучше всего использовать HC-05. Его легко купить в китайском интернет магазине или на eBay. Модуль питается от 3.3 В, но его линии I/O могут работать и с 5-вольтовой логикой, что позволяет подключать его UART к Arduino.

Bluetooth-модуль HC-05

Подключение Bluetooth-модуля к Arduino

Так теперь нам нужно подключить нашу Arduino с Bluetooth. Если на Arduino нет вывода с 3.3В , а только 5В то нужен будет поставить стабилизатор чтобы снизить питание. Назначение выводов HC-05 легко найти в интернете. Для использования рекомендуем вам сделать плату с выведенными линиями питания, Rx и Tx. Подключение к Arduino необходимо производить в следующем порядке:

  • вывод Arduino 3.3В или (5В через стабилизатор!) — к 12 пину модуля Bluetooth
  • вывод Arduino GND — к 13 пину модуля Bluetooth
  • вывод Arduino TX — к 2 пину модуля RX Bluetooth
  • вывод Arduino RX — к 1 пину модуля TX Bluetooth

После подключения необходимо проверить работоспособность Bluetooth модуля. Подключим Светодиод к 12 выводу Arduino и загрузим на плату следующий скетч:

Теперь скачиваем из Play Market программу Bluetooth-терминал и устанавливаем его. Включаем нашу Arduino. В приложении Нажимаем кнопку меню->Connect a device-Secure. Тем самым ваше устройство начнём искать Bluetooth поблизости. Наш модуль должен называться HC-05. Вам потребуется выписать его MAC-адрес, так он понадобится в дальнейшем. Как только он обнаружит устройство HC-05 выберите его. Пароль, если потребуется: 1234 (это стандартный код). После того как вы подключились к нему у вас должно вывести сообщение которое пришло в Bluetooth терминал от Arduino: “Press 1 to LED ON or 0 to LED OFF..” Далее введите 1 и нажмите отправить. Тем самым вы посылаете цифру 1 через Bluetooth на Arduino. Как только он примет цифру 1 должен загореться светодиод подключенный к 12 выводу Arduino. После введите цифру 0 и светодиод должен погаснуть. Если всё получилось переходим дальше.

Установка Android SDK

Скачиваем с официального сайта программу для создания приложений для android любых моделей. Распаковываем архив, запускаем SDK Manager.exe и устанавливаем программу. Вам предложат установить API, и версию android для которой вы в дальнейшем будете устанавливать приложения.

Android SDK Manager

Создание приложения

Выбираем File->New->Project. Так как мы создаём приложение для android, выбираем Android-> Android Application Project, и нажимаем Next Следующее диалоговое окно: Application Name -> пишем имя приложение, Project Name -> пишем имя проекта, Package Name -> Ни чего не пишем он создается автоматически! Minimum Required SDK -> это минимальные требование указываем нашу версию Android у меня 4.1 её я и выбираю. Target SDK -> выбираем вашу версию Android Compile with -> выбираем вашу версию Android Theme: для начала я бы советовал выбрать None. Нажимаем Next. В следующем окне ничего менять не нужно. Просто жмем Next. Далее нам предлагают создать свою иконку для приложения, можете изменить стандартный ярлык загрузив свою картинку, я же для начала предлагаю просто нажать Next. В следующем необходимо выбрать пункт меню Blank Activity и нажимать Next. Жмем Finish и через несколько секунд открывается главное окно нашей программы. Выбираем вкладку Activity_main.xml и видим наш редактор:

  1. Файлы нашего проекта.
  2. Run Запуск эмулятора для проверки программы на наличие ошибок
  3. Панель кнопок текста и многое другое от сюда вы будите выбирать что вам нужно и добавлять в качестве элементов приложения
  4. Для выбора размера дисплея вашего телефона или планшета
  5. Выбор ориентации. Два вида: горизонтальный и вертикальный
  6. API уровень (лучше не трогать)
  7. Тут будет отображаться всё то что вы добавили в приложение, так же тут можно переименовать ваши добавленные элементы или удалять их.
  8. Показывает свойства элемента, его размер цвет и т.д., так же тут можно редактировать элемент
  9. Показывает наличие ошибок.
  10. Выбор редактирования (графический либо текстовой). Для начинающих конечно лучше пользоваться графическим режимом
  11. Окно вашего приложения , можно видеть интерфейс будущего приложения

Теперь добавим две кнопки в интерфейс приложения. Выбираем элемент Button и переносим его на форму. Справа вверху мы видим объекты которые мы добавили. Так же важно, какой из объектов выбран в данный момент. Справа внизу можно редактировать кнопку, давайте изменим текст подписи кнопки и его цвет. Для этого в поле свойств элемента «Text» введите, вместо button1, значение «ВКЛ», а у button2 — “ВЫКЛ”. Должно получиться вот так: Мы можем запустить только что созданное приложение на эмуляторе. Идем в настройки запуска «Run» → Run Configurations», в левой части нажимаем на «Android Application». Появляется новая конфигурация «New_configuration». В правой части окна выбираем вкладку «Target» и выбираем опцию «Launch on all compatible devices/AVD» и добавляем устройство. Проверяем что кнопки появились и их можно нажимать. Если всё хорошо — продолжаем дальше. Теперь в файлах проекта выбираем bin->AndroidManifest.hml Теперь нажмём снизу на AndroudManifest.hml В этот файл нам нужно будет добавить две строки:

Они будут запрашивать включение Bluetooth при старте приложение, если он будет выключен приложение попросит пользователя его включить. Добавить его нужно сюда: Далее откроем другой файл: src->com.example(name) В этом файле и будет наш основной код. Все его содержимое нужно удалить и вставить вот этот код:

ОБЯЗАТЕЛЬНО! Введите вместо 00:00:00:00:00 МАС вашего Bluetooth модуля, который можно узнать через Bluetooth терминал!!! Ваше приложение готово. Теперь нам нужно проверить, как оно поведёт себя на устройстве. Запустите для этого симулятор. Если он запустился нормально без ошибок, то в папке, где вы создавали свой проект, будет создан файл с вашей программой. Его необходимо скопировать и установить на свое устройство.

Работа приложения

При нажатии на кнопку “Вкл” ваше Android-устройство передаст через Bluetooth цифру 1 и, как только Arduino примет цифру 1, светодиод загорится. При нажатии на кнопку “Выкл” передается цифра 2 и светодиод выключится, как показано на видео в начале статьи. Всё просто))

Мы будем очень рады, если вы поддержите наш ресурс и посетите магазин наших товаров shop.customelectronics.ru.

Метки: Bluetooth, создание Android-приложения Просмотров: 45741

    Firstly, take a glance at Bluetooth technology defining on Wikipedia:

Bluetooth is a wireless technology standard for exchanging data over short distances (using short-wavelength UHF radio waves in the ISM band from 2.4 to 2.485 GHz[4]) from fixed and mobile devices, and building personal area networks (PANs). Invented by telecom vendor Ericsson in 1994,[5] it was originally conceived as a wireless alternative to RS-232 data cables. It can connect several devices, overcoming problems of synchronization.

    According to this, we can «build» a local are network (LAN) by connecting devices over Bluetooth. The Android platform includes support for the Bluetooth network stack, which allows a device to wirelessly exchange data with other Bluetooth devices. The application framework provides access to the Bluetooth functionality through the Android Bluetooth APIs. These APIs let applications wirelessly connect to other Bluetooth devices, enabling point-to-point and multipoint wireless features so we absolutely able to transferring data to other devices in the network circle.     Now, in this tutorial, I will note some important works to make a simple chat application which allows two Android devices to carry out two-way text chat over Bluetooth. If you only need full application code, please go to end of this post!

Requesting Bluetooth permissions

    In order to use Bluetooth service, please add BLUETOOTH permission to your AndroidManifest.xml. Moreover, because we need to discover available devices nearby later, BLUETOOTH_ADMIN permission should be required, too:

  

Checking if device supports Bluetooth

    Now to check whether Bluetooth is supported on device or not, we use object of BluetoothAdapter class. If getDefaultAdapter() return null, your device not supports Bluetooth. This is the «check code»:

BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();         if (bluetoothAdapter == null) {             Toast.makeText(this, "Bluetooth is not available!", Toast.LENGTH_SHORT).show();             finish(); //automatic close app if Bluetooth service is not available!         } 

Check if Bluetooth is Enabled

    The 2nd important works is check if your device is enabled Bluetooth. If not, request to turn it on:

if (!bluetoothAdapter.isEnabled()) {             Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);             startActivityForResult(enableIntent, REQUEST_ENABLE_BLUETOOTH);         } 

    You should put this code in onStart() to ensure that your app always check the connection when it launched! The «enabling request» dialog may be like this:

Discovering Bluetooth devices

    In android, available devices is not discoverable by default. To scanning them, use startDiscovery() method of BluetoothAdapter class. The activity which starts scanning must register a BroadCastReceiver with BluetoothDevice.ACTION_FOUND action. After completing discovery, system will broadcast BluetoothDevice.ACTION_FOUNDIntent. This Intent contains extra fields EXTRA_DEVICE and EXTRA_CLASS, representing a BluetoothDevice and a BluetoothClass, respectively. In this application, I will add detected devices to an ArrayAdapter and show by ListView:

if (bluetoothAdapter.isDiscovering()) {             bluetoothAdapter.cancelDiscovery();         }         bluetoothAdapter.startDiscovery();          // Register for broadcasts when a device is discovered         IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);         registerReceiver(discoveryFinishReceiver, filter);          // Register for broadcasts when discovery has finished         filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);         registerReceiver(discoveryFinishReceiver, filter); 

The BroadcastReceiver variable seem like this:

private final BroadcastReceiver discoveryFinishReceiver = new BroadcastReceiver() {         @Override         public void onReceive(Context context, Intent intent) {             String action = intent.getAction();              if (BluetoothDevice.ACTION_FOUND.equals(action)) {                 BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);                 if (device.getBondState() != BluetoothDevice.BOND_BONDED) {                     discoveredDevicesAdapter.add(device.getName() + "n" + device.getAddress());                 }             } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {                 if (discoveredDevicesAdapter.getCount() == 0) {                     discoveredDevicesAdapter.add(getString(R.string.none_found));                 }             }         }     }; 

Listing paired devices

    Moreover, your devices can be connected to some other devices before, so you can listing them by call getBondedDevices():

 bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();         Set pairedDevices = bluetoothAdapter.getBondedDevices();          // If there are paired devices, add each one to the ArrayAdapter         if (pairedDevices.size() > 0) {             for (BluetoothDevice device : pairedDevices) {                 pairedDevicesAdapter.add(device.getName() + "n" + device.getAddress());             }         } else {             pairedDevicesAdapter.add(getString(R.string.none_paired));         }

    In this sample application, I show a Dialog which contains 2 ListViews of paired devices and discovered devices and this result look like this:

Connecting to a device

    To connect two devices, we must implement server side and client side mechanism. One device shall open the server socket and another should initiate the connection (the remain device is a client device).     With connection as server:

  • Initializing an instance of BluetoothServerSocket by calling the listenUsingRfcommWithServiceRecord() method.
  • Listening for connection requests by calling accept()
  • Release server socket by calling close()
private class AcceptThread extends Thread {         private final BluetoothServerSocket serverSocket;          public AcceptThread() {             BluetoothServerSocket tmp = null;             try {                 tmp = bluetoothAdapter.listenUsingInsecureRfcommWithServiceRecord(APP_NAME, MY_UUID);             } catch (IOException ex) {                 ex.printStackTrace();             }             serverSocket = tmp;         }          public void run() {             setName("AcceptThread");             BluetoothSocket socket;             while (state != STATE_CONNECTED) {                 try {                     socket = serverSocket.accept();                 } catch (IOException e) {                     break;                 }                  // If a connection was accepted                 if (socket != null) {                     synchronized (ChatController.this) {                         switch (state) {                             case STATE_LISTEN:                             case STATE_CONNECTING:                                 // start the connected thread.                                 connected(socket, socket.getRemoteDevice());                                 break;                             case STATE_NONE:                             case STATE_CONNECTED:                                 // Either not ready or already connected. Terminate                                 // new socket.                                 try {                                     socket.close();                                 } catch (IOException e) {                                 }                                 break;                         }                     }                 }             }         } 

    As connected as a client:

  • Create an instance of BluetoothSocket by calling createRfcommSocketToServiceRecord(UUID) on BluetoothDevice object.
  • Initializing the connection by calling connect().
private class ConnectThread extends Thread {         private final BluetoothSocket socket;         private final BluetoothDevice device;          public ConnectThread(BluetoothDevice device) {             this.device = device;             BluetoothSocket tmp = null;             try {                 tmp = device.createInsecureRfcommSocketToServiceRecord(MY_UUID);             } catch (IOException e) {                 e.printStackTrace();             }             socket = tmp;         }          public void run() {             setName("ConnectThread");              // Always cancel discovery because it will slow down a connection             bluetoothAdapter.cancelDiscovery();              // Make a connection to the BluetoothSocket             try {                 socket.connect();             } catch (IOException e) {                 try {                     socket.close();                 } catch (IOException e2) {                 }                 connectionFailed();                 return;             }              // Reset the ConnectThread because we're done             synchronized (ChatController.this) {                 connectThread = null;             }              // Start the connected thread             connected(socket, device);         }          public void cancel() {             try {                 socket.close();             } catch (IOException e) {             }         }     } 

    This is definition of My_UUID constant:

private static final UUID MY_UUID = UUID.fromString("8ce255c0-200a-11e0-ac64-0800200c9a66"); 

Read and write data (text messages)

    Of course, after establishing connection successfully, we’ll do the most important work of a chat application: send/receive text messages. Now, each device has a connected BluetoothSocket, both of them can read and write data to the streams using read(byte[]) and write(byte[]):

private class ReadWriteThread extends Thread {         private final BluetoothSocket bluetoothSocket;         private final InputStream inputStream;         private final OutputStream outputStream;          public ReadWriteThread(BluetoothSocket socket) {             this.bluetoothSocket = socket;             InputStream tmpIn = null;             OutputStream tmpOut = null;              try {                 tmpIn = socket.getInputStream();                 tmpOut = socket.getOutputStream();             } catch (IOException e) {             }              inputStream = tmpIn;             outputStream = tmpOut;         }          public void run() {             byte[] buffer = new byte[1024];             int bytes;              // Keep listening to the InputStream             while (true) {                 try {                     // Read from the InputStream                     bytes = inputStream.read(buffer);                      // Send the obtained bytes to the UI Activity                     handler.obtainMessage(MainActivity.MESSAGE_READ, bytes, -1,                             buffer).sendToTarget();                 } catch (IOException e) {                     connectionLost();                     // Start the service over to restart listening mode                     ChatController.this.start();                     break;                 }             }         }          // write to OutputStream         public void write(byte[] buffer) {             try {                 outputStream.write(buffer);                 handler.obtainMessage(MainActivity.MESSAGE_WRITE, -1, -1,                         buffer).sendToTarget();             } catch (IOException e) {             }         }          public void cancel() {             try {                 bluetoothSocket.close();             } catch (IOException e) {                 e.printStackTrace();             }         }     } 

NOTE: In my sample project, I put AcceptThread, ConnectThread and ReadWriteThread classes into a class named ChatController.

Application output

    Some screenshots of this simple chat app:

When you have connected to a dive
Sending/receiving messages with connected device
When user close app on other device, the connection was lost

Conclusions

    I have presented some important works in developing a simple bluetooth chat application, hope this is helpful with your work! To make a better chat messages interface, please a glance in «Design Chat bubble UI» post. Moreover, visit these official document pages to deep understanding about Bluetooth connection in Android:

  • BluetoohAdapter
  • BluetoothSocket

В данной статье будет подробно расписано создание небольшого приложения для мобильной операционной системы Android и скетча для Arduino. На Arduino Uno будет стоять Wireless Shield с Bluetooth-модулем. Приложение будет подключаться к Bluetooth-модулю и посылать некую команду. В свою очередь скетч по этой команде будет зажигать или гасить один из подключенных к Arduino светодиодов.

Нам понадобится

  1. Arduino Uno
  2. Arduino Wireless Shield
  3. Bluetooth Bee
  4. Красные и зеленые светодиоды
  5. Резисторы
  6. Провода «папа-папа»
  7. Breadboard Half
  8. Телефон на базе ОС Android

Создание приложения для Android

Заготовка

Разработка для ОС Android ведется в среде разработки ADT, Android Development Tools. Которую можно скачать с портала Google для разработчиков. После скачивания и установке ADT, смело его запускаем. Однако, еще рано приступать к разработке приложения. Надо еще скачать Android SDK нужной версии. Для этого необходимо открыть Android SDK Manager «Window → Android SDK Manager». В списке необходимо выбрать нужный нам SDK, в нашем случае Android 2.3.3 (API 10). Если телефона нет, то выбирайте 2.3.3 или выше; а если есть — версию, совпадающую с версией ОС телефона. Затем нажимаем на кнопку «Install Packages», чтобы запустить процесс установки.

После завершения скачивания и установки мы начинаем создавать приложение. Выбираем «File → New → Android Application Project». Заполним содержимое окна так, как показано на рисунке.

  • Application Name — то имя приложения, которое будет показываться в Google Play Store. Но выкладывать приложение мы не собираемся, поэтому имя нам не особо важно.
  • Project Name — имя проекта в ADT.
  • Package Name — идентификатор приложения. Он должен быть составлен следующим образом: название Вашего сайта задом наперед, плюс какое-либо название приложения.

В выпадающих списках «Minimum Required SDK», «Target SDK», «Compile With» выбираем ту версию, которую мы скачали ранее. Более новые версии SDK поддерживают графические темы для приложений, а старые нет. Поэтому в поле «Theme» выбираем «None». Нажимаем «Next».

Снимаем галочку с «Create custom launcher icon»: в рамках данной статьи не будем заострять внимание на создании иконки приложения. Нажимаем «Next».

В появившемся окне можно выбрать вид «Activity»: вид того, что будет на экране, когда будет запущено приложение. Выбираем «Blank activity», что означает, что мы хотим начать всё с чистого листа. Нажимаем «Next».

В нашем приложении будет всего одно Activity, поэтому в появившемся окне можно ничего не менять. Поэтому просто жмем на «Finish».

Все, наше приложение создано.

Настройка эмулятора

Отладка приложений для Android производится на реальном устройстве или, если такового нет, то на эмуляторе. Сконфигурируем свой.

Для этого запустим «Window → Android Virtual Device Manager». В появившемся окне нажмем «New». Заполняем поля появившейся формы. От них зависит сколько и каких ресурсов будет предоставлять эмулятор «телефону». Выберите разумные значения и нажимайте «ОК».

В окне Android Virtual Device Manager нажимаем кнопку «Start». Это запустит эмулятор. Запуск занимает несколько минут. Так что наберитесь терпения.

В результате вы увидите окно эмулятора подобное этому:

Пробный запуск

Мы можем запустить только что созданное приложение на эмуляторе. Идем в настройки запуска «Run» → Run Configurations», в левой части нажимаем на «Android Application». Появляется новая конфигурация «New_configuration». В правой части окна выбираем вкладку «Target» и выбираем опцию «Launch on all compatible devices/AVD».

Написание кода для Android

Правка манифеста

Каждое Android-приложение должно сообщить системе о том, какие права необходимо ему предоставить. Перечисление прав идет в так называемом файле манифеста AndroidManifest.xml. В нем мы должны указать тот факт, что хотим использовать Bluetooth в своем приложении. Для этого достаточно добавить буквально пару строк:

AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"xmlns:android="http://schemas.android.com/apk/res/android"package="ru.amperka.arduinobtled"android:versionCode="1"android:versionName="1.0">       android:minSdkVersion="10"android:targetSdkVersion="10"/>       androi="android.permission.BLUETOOTH"/>android:name>="android.permission.BLUETOOTH_ADMIN"/>       android:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme">android:name="ru.amperka.arduinobtled.MainActivity"android:label="@string/app_name">>android:name="android.inten.MAIN"/>                   android:name="android.intent.category.Lspan>/></intent-filter></activity>       </application>   </manifest>

Добавляем основной код

Пришла пора вдохнуть жизнь в наше приложение. Открываем файл MainActivity.java (src → ru.amperka.arduinobtled). Изначально он содержит следующий код:

MainActivityAutogen.java
packageru.amperka.arduinobtled;   importandroid.os.Bundle;importandroid.app.Activity;importandroid.view.Menu;   publicclass MainActivity extends Activity {           @Override protectedvoid onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);}   @Override publicboolean onCreateOptionsMenu(Menu menu){// Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu);returntrue;}   }

Дополним код в соответствии с тем, что нам нужно:

  1. Будем включать Bluetooth, если он выключен.
  2. Будем обрабатывать нажатия на кнопки
  3. Будем посылать информацию о том, какая кнопка была нажата.

Передавать на Arduino мы будем один байт с двузначным числом. Первая цифра числа — номер пина, к которому подключен тот или иной светодиод, вторая — состояние светодиода: 1 — включен, 0 — выключен.

Число-команда, рассчитывается очень просто: Если нажата красная кнопка, то берется число 60 (для красного светодиода мы выбрали 6-й пин Arduino) и к нему прибавляется 1 или 0 в зависимости от того, должен ли сейчас гореть светодиод или нет. Для зеленой кнопки всё аналогично, только вместо 60 берется 70 (поскольку зеленый светодиод подключен к 7 пину). В итоге, в нашем случае, возможны 4 команды: 60, 61, 70, 71.

Напишем код, который реализует всё сказанное.

MainActivity.java
packageru.amperka.arduinobtled;   importjava.io.IOException;importjava.io.OutputStream;importjava.lang.reflect.InvocationTargetException;importjava.lang.reflect.Method;   importandroid.app.Activity;importandroid.bluetooth.BluetoothAdapter;importandroid.bluetooth.BluetoothDevice;importandroid.bluetooth.BluetoothSocket;importandroid.content.Intent;importandroid.os.Bundle;importandroid.util.Log;importandroid.view.Menu;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.widget.Toast;importandroid.widget.ToggleButton;   publicclass MainActivity extends Activity implementsView.OnClickListener{       //Экземпляры классов наших кнопок     ToggleButton redButton;     ToggleButton greenButton;       //Сокет, с помощью которого мы будем отправлять данные на Arduino     BluetoothSocket clientSocket;       //Эта функция запускается автоматически при запуске приложения     @Override     protectedvoid onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);         setContentView(R.layout.activity_main);           //"Соединям" вид кнопки в окне приложения с реализацией         redButton =(ToggleButton) findViewById(R.id.toggleRedLed);         greenButton =(ToggleButton) findViewById(R.id.toggleGreenLed);           //Добавлем "слушатель нажатий" к кнопке         redButton.setOnClickListener(this);         greenButton.setOnClickListener(this);           //Включаем bluetooth. Если он уже включен, то ничего не произойдетString enableBT = BluetoothAdapter.ACTION_REQUEST_ENABLE;         startActivityForResult(new Intent(enableBT), );           //Мы хотим использовать тот bluetooth-адаптер, который задается по умолчанию         BluetoothAdapter bluetooth = BluetoothAdapter.getDefaultAdapter();           //Пытаемся проделать эти действияtry{//Устройство с данным адресом - наш Bluetooth Bee//Адрес опредеяется следующим образом: установите соединение//между ПК и модулем (пин: 1234), а затем посмотрите в настройках//соединения адрес модуля. Скорее всего он будет аналогичным.             BluetoothDevice device = bluetooth.getRemoteDevice("00:13:02:01:00:09");                //Инициируем соединение с устройствомMethod m = device.getClass().getMethod("createRfcommSocket", newClass[]{int.class});               clientSocket =(BluetoothSocket) m.invoke(device, 1);             clientSocket.connect();               //В случае появления любых ошибок, выводим в лог сообщение}catch(IOException e){             Log.d("BLUETOOTH", e.getMessage());}catch(SecurityException e){             Log.d("BLUETOOTH", e.getMessage());}catch(NoSuchMethodException e){             Log.d("BLUETOOTH", e.getMessage());}catch(IllegalArgumentException e){             Log.d("BLUETOOTH", e.getMessage());}catch(IllegalAccessException e){             Log.d("BLUETOOTH", e.getMessage());}catch(InvocationTargetException e){             Log.d("BLUETOOTH", e.getMessage());}           //Выводим сообщение об успешном подключении         Toast.makeText(getApplicationContext(), "CONNECTED", Toast.LENGTH_LONG).show();       }       @Override     publicboolean onCreateOptionsMenu(Menu menu){// Inflate the menu; this adds items to the action bar if it is present.         getMenuInflater().inflate(R.menu.main, menu);returntrue;}         //Как раз эта функция и будет вызываться        @Override     publicvoid onClick(View v){           //Пытаемся послать данныеtry{//Получаем выходной поток для передачи данныхOutputStream outStream = clientSocket.getOutputStream();               int value =;               //В зависимости от того, какая кнопка была нажата, //изменяем данные для посылкиif(v == redButton){                 value =(redButton.isChecked()?1:)+60;}elseif(v == greenButton){                 value =(greenButton.isChecked()?1:)+70;}               //Пишем данные в выходной поток             outStream.write(value);           }catch(IOException e){//Если есть ошибки, выводим их в лог             Log.d("BLUETOOTH", e.getMessage());}}}

Написание скетча

Данные, которые принимает Bluetooth-модуль, приходят через UART (он же Serial-соединение) на скорости 9600 бит/с. Настраивать Bluetooth-модуль нет никакой необходимости: он сразу готов к работе. Поэтому скетч должен уметь следующее:

  1. Принять данные по UART
  2. Зажечь нужный светодиод в зависимости от принятого кода
bluetooth.ino
void setup(){//Устанавливаем скорость UART     Serial.begin(9600);        //Настраиваем нужные пины на выход     pinMode(6, OUTPUT);     pinMode(7, OUTPUT);}   void loop(){//Если данные пришлиif(Serial.available()>){           //Считываем пришедший байт         byte incomingByte = Serial.read();           //Получаем номер пина путем целочисленного деления значения принятого байта на 10//и нужное нам действие за счет получения остатка от деления на 2://(1 - зажечь, 0 - погасить)         digitalWrite(incomingByte /10, incomingByte %2);}}

Особенности заливки скетча

Для связи Bluetooth-Bee с контроллером используются те же пины (0 и 1), что и для прошивки. Поэтому при программировании контроллера переключатель «SERIAL SELECT» на «Wireless Shield» должен быть установлен в положение «USB», а после прошивки его надо вернуть в положение «MICRO».

Результат

Заключение

В данной статье мы научились создавать приложения для операционной системы Android и передавать данные по Bluetooth. Теперь при нажатии на кнопку на экране телефона на базе операционной системы Android, произойдет изменение состояния светодиода на плате.

Вы можете развить мысль и сделать более дружественный интерфейс на Android, управлять с его помощью гораздо более сложными устройствами, публиковать классные приложения в Android Market и ещё много-много всего интересного!

  • Вы здесь:  
  • Главная
  • Программер
  • Android
  • Блютуз подключение в Android (проект для Arduino). Часть 1.
Категория: Android
Опубликовано: 12 апреля 2019

Всем привет, сегодня я хотел бы показать вам, как написать приложение для Android, которое будет использовать Bluetooth для подключения к Arduino.

Смотрите видео: Блютуз подключение в Android (проект для Arduino)

В частности, это в рамках моего проекта связи Android устройства с Arduino, поскольку меня недавно с АлиЭкспресс пришел модуль hc-06, это модуль Bluetooth для подключения.

Давайте напишем небольшой проект, большой небольшой, ну посмотрим, и в середине, когда дойдём до графической части написания layout для приложения, я вам покажу интересный эмулятор который я думаю вас заинтересует и решит Ваши проблемы с производительностью.

Давайте создадим новый проект, это как обычно EmptyActivity, дадим названием, допустим Bt-hc-06, да будет так.

Делаем под минимальную, под пятую версию, там разберемся.

Завершилось создание проекта, давайте перейдём в наш проект в манифест, нам нужно будет добавить строки для разрешение работы с блютузом.

Обратите внимание, в примерах кода для AndroidManifest.xml и activity_main.xml после угловой скобки я добавил пробел, чтобы на сайте теги разметки не перемешались с тегами самой статьи. В своем коде < uses-permission, < TextView, < ListView, < FrameLayout, < ToggleButton и т.д., а так же закрывающие теги пишите слитно!!!


Будет 2 строки в 2 разрешения Bluetooth и Bluetooth_ADMIN также давайте сделаем чтобы наша MainActivity располагалась в портретном виде.


Манифест больше нам не понадобится перейдём в ActivityMain.xml в слой LayOut, поскольку код у меня уже в принципе набран, сверстан, я буду лишь добавлять блоками фрагменты кода и буду где-то походу пояснять, так сказать, что у нас к чему и зачем.

Закрываем RelativeLayout это будет у нас общая так сказать рамка, канва.


Добавляем textview с Id textinfo, добавим listview, список куда у нас будут подгружаться данные об найденных устройствах, далее мы добавим FrameLayout, он будет нужен для отображение всех устройств, которые мы будем видеть, к которым вернее мы подключимся.

 /// **************/// 

Также во внутрь FrameLayout мы добавим RelativerLayout для позиционирования элементов внутри.

 /// **************/// 

Я хочу показать вам на примере четырех канального включателя-выключателя, который будет подключаться к Bluetooth адаптеру и передавать команды, которые Arduino будет принимать и соответственно на этих 4 пинах Arduino будет выполняться какие-либо действия.

Это может быть, как включение реле, как мигание светодиодов, различное, то есть мы конкретно здесь в коде и не прописываем, что мы на самом деле будем подключать в Arduino, но в принципе у нас будет кнопка 1, кнопка 2, кнопка 3, кнопка 4, типа ToggleButton, которая фиксирует нажатое состояние.


С RelativeLayout мы практически закончили, давайте теперь перейдем в дизайн, и обратите внимание, в виде компонентов получается следующая картина: надпись, список, и вот это вся панель.

На данный момент кнопки у нас не видны, когда мы выберем какой-то пункт из списка сопряженных устройств, а это будет наша Arduino с Bluetooth модулем, то мы должны будем увидеть список с кнопками.

Давайте мы переключим listView, мы его сделаем невидимым,

android:visibility="gone"

а для FrameLayout напишем

android:visibility="visible"

сделав его видимым, сохраним, и вот у нас просто будут располагаться кнопки.

Эти кнопки типа ToggleButton, при нажатии на которые они фиксируют, свое состояние, при повторном нажатии, естественно меняется цвет, меняются названия.

По поводу кнопок, я хотел вам показать, как у меня проставлены названия кнопок, здесь событии нажатия свойство textOff примет значение название кнопки + OFF, при повторном нажатии textOn примет значение название кнопки + ON, кнопки я называл по номеру используемых пинов в ардуинке.

Всё здесь позиционировано, отступы по 70 единиц от краев, и 48 друг от друга, поскольку то устройство на котором будут тестировать немножко не совпадает по размерам и скорей всего съедет в сторону…)

Давайте теперь посмотрим, что у нас получилось по поводу эмулятора, я хочу вам представить очень удобный, на мой взгляд, эмулятор называется LDPlayer (не путать с ЛДПР)…)

Смотрите видео: Найдена лучшая замена эмулятора Android!!! (для Android Studio)

Так же дополнительная информация есть в основном видео к этой статье. А в двух словах — стоит попробовать!

Переключим обратно значения видимости для ListView и FrameLayout с кнопками: скроем как это было и вернёмся всё-таки к написанию кода.

Список у нас пока пустой, собственно тут есть кнопки, но они будут скрыты, пока не произойдет соединение по блютуз и никакие данные в него не передаются.

Займемся теперь самой большой частью кода, скопируйте весь текст MainActivity.java, изменив только имя пакета, если оно отличается от моего.

package ru.maxfad.bt_hc_06;  import android.app.Activity; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothSocket; import android.content.Intent; import android.content.pm.PackageManager; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.CompoundButton; import android.widget.FrameLayout; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import android.widget.ToggleButton;  import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.Set; import java.util.UUID;   import static android.R.layout.simple_list_item_1;  public class MainActivity extends AppCompatActivity  implements CompoundButton.OnCheckedChangeListener{      ToggleButton tb1,tb2,tb3,tb4;     private static final int REQUEST_ENABLE_BT = 1;     public TextView textInfo;     BluetoothAdapter bluetoothAdapter;     ArrayList pairedDeviceArrayList;     ListView listViewPairedDevice;     FrameLayout ButPanel;     ArrayAdapter pairedDeviceAdapter;     ThreadConnectBTdevice myThreadConnectBTdevice;     ThreadConnected myThreadConnected;     private UUID myUUID;     private StringBuilder sb = new StringBuilder();        @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.activity_main);         tb1 = (ToggleButton) findViewById(R.id.toggleButton1);         tb2 = (ToggleButton) findViewById(R.id.toggleButton2);         tb3 = (ToggleButton) findViewById(R.id.toggleButton3);         tb4 = (ToggleButton) findViewById(R.id.toggleButton4);          tb1.setOnCheckedChangeListener(this);         tb2.setOnCheckedChangeListener(this);         tb3.setOnCheckedChangeListener(this);         tb4.setOnCheckedChangeListener(this);         final String UUID_STRING_WELL_KNOWN_SPP = "00001101-0000-1000-8000-00805F9B34FB";         textInfo = (TextView)findViewById(R.id.textInfo);         listViewPairedDevice = (ListView)findViewById(R.id.list);         ButPanel = (FrameLayout) findViewById(R.id.panel);         if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH)){             Toast.makeText(this, "BLUETOOTH NOT support", Toast.LENGTH_LONG).show();             finish();             return;         }         myUUID = UUID.fromString(UUID_STRING_WELL_KNOWN_SPP);         bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();         if (bluetoothAdapter == null) {             Toast.makeText(this, "Bluetooth is not supported on this hardware platform", Toast.LENGTH_LONG).show();             finish();             return;         }         String stInfo = bluetoothAdapter.getName() + " " + bluetoothAdapter.getAddress();         textInfo.setText(String.format("Это устройство: %s", stInfo));     }      @Override     protected void onStart() { // Запрос на включение Bluetooth         super.onStart();         if (!bluetoothAdapter.isEnabled()) {             Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);             startActivityForResult(enableIntent, REQUEST_ENABLE_BT);         }         setup();     }      private void setup() { // Создание списка сопряжённых Bluetooth-устройств         Set pairedDevices = bluetoothAdapter.getBondedDevices();         if (pairedDevices.size() > 0) { // Если есть сопряжённые устройства             pairedDeviceArrayList = new ArrayList();             for (BluetoothDevice device : pairedDevices) { // Добавляем сопряжённые устройства - Имя + MAC-адресс                 pairedDeviceArrayList.add(device.getName() + "n" + device.getAddress());             }             pairedDeviceAdapter = new ArrayAdapter(this, simple_list_item_1, pairedDeviceArrayList);             listViewPairedDevice.setAdapter(pairedDeviceAdapter);             listViewPairedDevice.setOnItemClickListener(new AdapterView.OnItemClickListener() { // Клик по нужному устройству                  @Override                 public void onItemClick(AdapterView 0) {                         sbprint = sb.substring(0, endOfLineIndex);                         sb.delete(0, sb.length());                         runOnUiThread(new Runnable() { // Вывод данных                              @Override                             public void run() {                                 switch (sbprint) {                                      case "D10 ON":                                         Toast.makeText(MainActivity.this, sbprint, Toast.LENGTH_SHORT).show();                                         break;                                      case "D10 OFF":                                         Toast.makeText(MainActivity.this, sbprint, Toast.LENGTH_SHORT).show();                                         break;                                      case "D11 ON":                                         Toast.makeText(MainActivity.this, sbprint, Toast.LENGTH_SHORT).show();                                         break;                                      case "D11 OFF":                                         Toast.makeText(MainActivity.this, sbprint, Toast.LENGTH_SHORT).show();                                         break;                                      case "D12 ON":                                         Toast.makeText(MainActivity.this, sbprint, Toast.LENGTH_SHORT).show();                                         break;                                      case "D12 OFF":                                         Toast.makeText(MainActivity.this, sbprint, Toast.LENGTH_SHORT).show();                                         break;                                      case "D13 ON":                                         Toast.makeText(MainActivity.this, sbprint, Toast.LENGTH_SHORT).show();                                         break;                                      case "D13 OFF":                                         Toast.makeText(MainActivity.this, sbprint, Toast.LENGTH_SHORT).show();                                         break;                                      default:                                         break;                                 }                             }                         });                     }                 } catch (IOException e) {                     break;                 }             }         }           public void write(byte[] buffer) {             try {                 connectedOutputStream.write(buffer);             } catch (IOException e) {                 e.printStackTrace();             }         }      }      @Override     public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {         switch (compoundButton.getId()) {             case R.id.toggleButton1:                 if(isChecked){                     if(myThreadConnected!=null) {                         byte[] bytesToSend = "a".getBytes();                         myThreadConnected.write(bytesToSend );                     }                     Toast.makeText(MainActivity.this, "D10 ON", Toast.LENGTH_SHORT).show();                 }else{                     if(myThreadConnected!=null) {                         byte[] bytesToSend = "A".getBytes();                         myThreadConnected.write(bytesToSend );                     }                     Toast.makeText(MainActivity.this, "D10 OFF", Toast.LENGTH_SHORT).show();                 }                 break;             case R.id.toggleButton2:                 if(isChecked){                     if(myThreadConnected!=null) {                          byte[] bytesToSend = "b".getBytes();                         myThreadConnected.write(bytesToSend );                     }                      Toast.makeText(MainActivity.this, "D11 ON", Toast.LENGTH_SHORT).show();                 }else{                     if(myThreadConnected!=null) {                          byte[] bytesToSend = "B".getBytes();                         myThreadConnected.write(bytesToSend );                     }                      Toast.makeText(MainActivity.this, "D11 OFF", Toast.LENGTH_SHORT).show();                 }                 break;             case R.id.toggleButton3:                 if(isChecked){                     if(myThreadConnected!=null) {                          byte[] bytesToSend = "c".getBytes();                         myThreadConnected.write(bytesToSend );                     }                      Toast.makeText(MainActivity.this, "D12 ON", Toast.LENGTH_SHORT).show();                 }else{                     if(myThreadConnected!=null) {                          byte[] bytesToSend = "C".getBytes();                         myThreadConnected.write(bytesToSend );                     }                      Toast.makeText(MainActivity.this, "D12 OFF", Toast.LENGTH_SHORT).show();                 }                 break;             case R.id.toggleButton4:                 if(isChecked){                     if(myThreadConnected!=null) {                          byte[] bytesToSend = "d".getBytes();                         myThreadConnected.write(bytesToSend );                     }                      Toast.makeText(MainActivity.this, "D13 ON", Toast.LENGTH_SHORT).show();                 }else{                     if(myThreadConnected!=null) {                          byte[] bytesToSend = "D".getBytes();                         myThreadConnected.write(bytesToSend );                     }                      Toast.makeText(MainActivity.this, "D13 OFF", Toast.LENGTH_SHORT).show();                 }                 break;         }     }  } 

Поясню идею в целом: при соединении телефона с блютуз модулем станут видны кнопки, при нажатии на них будет меняться их состояние, вид, текст. Функция Toast будет писать, какая кнопка нажата и по блютуз будут передаваться команды – буква a – (английская, маленькая)- нажата кнопка D10 – включить, на выход Arduino 10 десятый идет напряжение. Буква A — (английская, большая)- повторно кнопка D10, выключить, на выход Arduino десятый пин напряжение перестает подаваться.

То же самое правило действует и для остальных кнопок: D11, D12, D13, — b/B, c/C, d/D – вкл/выкл.

Статью со скетчем для Arduino выложу в ближайшее время, так что посещайте сайт чаще, добавляйтесь в группы в Одноклассниках, вКонтакте, или на facebook, в них я всегда публикую анонсы новых статей. Подписывайтесь на канал в ютубе, чтобы не пропустить выход видео, исходники проекта вы можете скачать по ссылке ниже.

Cкачать архив для ознакомления — проект Блютуз подключение Android и Arduino:

ZIP архив с проектом

Смотрите видео: Блютуз подключение в Android (проект для Arduino)

Понравилась статья? Поделитесь ею с друзьями и напишите отзыв в комментариях!

ОСТАВЬТЕ ОТВЕТ

Please enter your name here
Please enter your comment!