Как связать микроконтроллер AVR c планшетом на Android, с помощью bluetooth модуля HC-05.
В конце прошлой статьи писал о том, что получилось создать интерфейс для Android и в этой статье попробую описать этот процесс. Почему попробую, потому что опыта в создании приложений под Android у меня практически нет и на самом деле, мало что смогу доступно объяснить. Ну всё довольно отмазываться пора переходить к делу.
Для начала качаем и устанавливаем Android Studio, о том как это сделать в интернете достаточно материала. После того как среда разработки установлена, создаём новый проект согласно скриншотам.
После того как проект создан, первым делом изменяем AndroidManifest, добавив в него две строчки, запрашивающие разрешение.
Далее, в activity_my создаём несколько кнопок, присваиваем им id и назначаем методы, которые будут вызываться при нажатии.
Вот как это выглядит на экране.
Кнопки можно назвать как угодно.
Осталось самое интересное — научиться устанавливать соединение по bluetooth и обрабатывать нажатие кнопок.
В начале прошлой статьи писал о том, что когда покупал bluetooth модуль еще не знал куда его применить, но точно знал, что такая вещь в хозяйстве пригодиться. Прошло чуть времени и применение ему нашлось... В общем, есть у меня один проект, в котором МК управляет шаговыми двигателями, находиться всё это добро на балконе. Зимой на балконе холодно и неинтересно, поэтому отлаживать его удобнее из теплой комнаты, вот для этих целей и применил данный модуль.
Код для Atmega16, позволяющий принимать символы с планшета был взят из прошлой статьи.
Проект для Android Studio оставлю в архиве .
Для начала качаем и устанавливаем Android Studio, о том как это сделать в интернете достаточно материала. После того как среда разработки установлена, создаём новый проект согласно скриншотам.
После того как проект создан, первым делом изменяем AndroidManifest, добавив в него две строчки, запрашивающие разрешение.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="domain.my.bluetooth_interface_example" >
//запрашиваем разрешения, необходимые для работы приложения
//BLUETOOTH_ADMIN необходим, когда требуется изменить какие-то свойства адаптера
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MyActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Далее, в activity_my создаём несколько кнопок, присваиваем им id и назначаем методы, которые будут вызываться при нажатии.
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MyActivity">
<Button
android:layout_width="165dp"
android:layout_height="wrap_content"
android:text="increase_diametr"
android:id="@+id/increase_diametr_bt"
android:onclick="onclick"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="25dp" />
<Button
android:layout_width="160dp"
android:layout_height="wrap_content"
android:text="back"
android:id="@+id/back_bt"
android:onclick="onclick"
android:layout_below="@+id/increase_diametr_bt"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_marginLeft="33dp"
android:layout_marginTop="97dp" />
<Button
android:layout_width="160dp"
android:layout_height="wrap_content"
android:text="forward"
android:id="@+id/forward_bt"
android:onclick="onclick"
android:layout_alignTop="@+id/back_bt"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_marginRight="43dp" />
<Button
android:layout_width="160dp"
android:layout_height="wrap_content"
android:text="reduce_diametr"
android:id="@+id/reduce_diametr_bt"
android:onclick="onclick"
android:layout_below="@+id/back_bt"
android:layout_alignRight="@+id/increase_diametr_bt"
android:layout_alignEnd="@+id/increase_diametr_bt"
android:layout_marginTop="91dp" />
<Button
android:layout_width="165dp"
android:layout_height="wrap_content"
android:text="Connect"
android:id="@+id/connect_bt"
android:onclick="сonnect"
android:layout_below="@+id/reduce_diametr_bt"
android:layout_alignLeft="@+id/back_bt"
android:layout_alignStart="@+id/back_bt"
android:layout_marginTop="103dp"
android:background="#ff59ffd1"
android:layout_alignParentStart="false" />
</RelativeLayout>
Вот как это выглядит на экране.
Кнопки можно назвать как угодно.
Осталось самое интересное — научиться устанавливать соединение по bluetooth и обрабатывать нажатие кнопок.
package domain.my.bluetooth_interface_example;
import java.io.OutputStream;
import java.lang.reflect.Method;
import android.util.Log;
import android.content.Intent;
import android.view.View;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.os.Bundle;
import android.widget.Toast;
public class MyActivity extends Activity {
BluetoothSocket clientSocket;
//этот метод вызывается при создании или перезапуске приложения
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
}
public void сonnect(View v)
{
String enableBT = BluetoothAdapter.ACTION_REQUEST_ENABLE;
startActivityForResult(new Intent(enableBT), 0);
BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
boolean connection = true;
try
{
// 10:14:05:26:01:66 - адрес модуля его можно посмотреть в настройках подключения при соединении к ПК
BluetoothDevice device = bluetoothAdapter.getRemoteDevice("10:14:05:26:01:66");
//инициируем соединение с устройством
Method m = device.getClass().getMethod(
"createRfcommSocket", new Class[]{int.class});
clientSocket = (BluetoothSocket) m.invoke(device, 1);
clientSocket.connect();
}
catch (Exception e)
{
//оштбки выводим в лог
Log.d("BLUETOOTH", e.getMessage());
//выводим сообщение что не удалось установить соединение
Toast.makeText(getApplicationContext(), "failed_to_connect", Toast.LENGTH_LONG).show();
connection = false;
}
if (connection) {
//выводим сообщение об успешном подключении
Toast.makeText(getApplicationContext(), "CONNECTED", Toast.LENGTH_LONG).show();
}
}
public void onclick(View v) {
byte value = 0;
//пытаемся послать данные
try
{
//получаем выходной поток для передачи данных
OutputStream outStream = clientSocket.getOutputStream();
//проверяем какая кнопка была нажата
switch (v.getId())
{
case R.id.forward_bt: value = 's'; break;
case R.id.back_bt: value = 'w'; break;
case R.id.increase_diametr_bt: value = 'r'; break;
case R.id.reduce_diametr_bt: value = 'f'; break;
}
//пишем данные в выходной поток
outStream.write(value);
}
catch (Exception e)
{
//если есть ошибки, выводим их в лог
Log.d("BLUETOOTH", e.getMessage());
//и выводим сообщение, что соединение не установлено
Toast.makeText(getApplicationContext(), "not_connected", Toast.LENGTH_LONG).show();
}
}
}
В начале прошлой статьи писал о том, что когда покупал bluetooth модуль еще не знал куда его применить, но точно знал, что такая вещь в хозяйстве пригодиться. Прошло чуть времени и применение ему нашлось... В общем, есть у меня один проект, в котором МК управляет шаговыми двигателями, находиться всё это добро на балконе. Зимой на балконе холодно и неинтересно, поэтому отлаживать его удобнее из теплой комнаты, вот для этих целей и применил данный модуль.
Код для Atmega16, позволяющий принимать символы с планшета был взят из прошлой статьи.
Проект для Android Studio оставлю в архиве .
Похожие статьи