Перейти к содержимому

Как сделать приложение для ардуино

  • автор:

Arduino.ru

Собираюсь купить ардуино уно для курсача. Вопрос такой: как сделать программку с GUI для управления ардуиной? Т.е. есть форма, на ней кнопки и т.п. При нажатии на одну из них — выполняется какое — то действие ардуиной.

ЗЫ: посоветуйте заранее какие-то полезные ссылки на русскоязычные ресурсы с интересными примерами и полезной информацией.

  • Войдите на сайт для отправки комментариев

Пт, 23/09/2011 — 14:48
Зарегистрирован: 23.09.2011

Присоединяюсь к просьбе.

Как присвоить клавише на компьютере какую-либо функцию?

Спасибо за советы.

  • Войдите на сайт для отправки комментариев

Пт, 23/09/2011 — 14:58
Зарегистрирован: 23.06.2011

Посмотри тут, протокол фирмата и язык программирования процессинг (очень похож на язык ардуина)

Также можно погуглить LabView, это коммерческий навороченный проект с объектно-графическим программированием, большими возможностями и большой ценой лицензии, но можно найти на торентах.

  • Войдите на сайт для отправки комментариев

Чт, 01/03/2012 — 23:02
Зарегистрирован: 09.10.2011
Mogalkov пишет:

Также можно погуглить LabView, это коммерческий навороченный проект с объектно-графическим программированием, большими возможностями и большой ценой лицензии, но можно найти на торентах.

Возможность взаимодействовать ArduinoLabVIEW дает LIFA.

Информации полно, например здесь можно почитать.

  • Войдите на сайт для отправки комментариев

Пт, 02/03/2012 — 01:38
Зарегистрирован: 29.09.2011
alexsaw пишет:

Собираюсь купить ардуино уно для курсача. Вопрос такой: как сделать программку с GUI

Выучить какой-нибудь программирования и написать программу с GUI. Под «какой-нибудь», нынче подразумевается практически «любой». C, C++, C#, Prolog, VB, Matlab, Labview, Java, Питон, Powershell,php и т.д. и т.п. Хоть в ворде или аутлуке делайте свой GUI. На чем вам проще. Ардуине абсолютно без разницы.

alexsaw пишет:

При нажатии на одну из них — выполняется какое — то действие ардуиной.

При нажатии кнопки, вы отправляете в com port любые ваши данные. Любые которые считаете «ардуина должна обработать». Это может быть команда, данные. вообщем просто строчка, которую «вы решили отправить».

Как работать с ком-портом (он же Serial) — смотрите стандартные библиотеки выбранного вами языка.

В ардуине читаете эти данные и из ком-порта (а тут вам поможет чтение раздела документации «Функции передачи данных», ссылку на рускоязычную документация вы тоже можете найти в шапке сайта). И на основании этих данных принимаете решение «включить пин», «ответить что-то в ком порт», «переключить режим порта» и т.д. и т.п.

Когда разберетесь с этим, и надоест самому изобретить велосипеды, формат команд, распарсивать «что пришло» можете почитать про формат/библиотеку фирмата (как советовали выше). Но если у вас одна/две команды типа «включить диод1, включить диод2», то городить фирмату не обязательно. Проще «свой велосипед» из пары строчек соорудить.

Вообщем в своей программе отправляется что нибудь в serial, а ардуине принимаете это из serial и дальше делаете с этим «что-то» на что хватить вашей фантазии.

alexsaw пишет:

ЗЫ: посоветуйте заранее какие-то полезные ссылки на русскоязычные ресурсы с интересными примерами и полезной информацией.

Я думаю, если воспользоватся поиском из шапки сайта, то на этом ресурсе найдутся интересные и полезные примеры.

Создаем мобильное приложение для управления «Умной теплицей» на Arduino

На 5 уроке про Умную теплицу на Ардуино, мы создадим свое собственное мобильное приложение для устройств на Андроиде. Для этого мы используем редактор визуального программирования Android App Invertor 2

В следующей статье про перенос « функции мониторинга и управления теплицей на телефон или планшет с ОС Androi d» мы установили связь нашей системы с телефоном (или планшетом) с операционной системой Android по Bluetooth, что позволило нам отправлять данные мониторига данных нашей теплицы на телефон и получать команды управления с телефона. Но для связи теплицы с телефоном мы использовали на телефоне приложение Bluetooth Terminal, что совсем неудобно. Нам нужно полноценное приложение. В этом уроке мы и займемся его созданием.
Глубоко внимать в вопросы программирования для операционной системы Android не входит в наши планы, поэтому нам нужна простая и понятная система создания кода для Android, наподобие системы Sctratch для Arduino, которую мы рассматривали на этом уроке – Программируем с Arduino… К счастью подобный визуальный редактор есть. Это онлайн визуальный редактор для визуального программирования для Android App Invertor 2. Страница проекта – http://ai2.appinventor.mit.edu.

Страница онлайн-редактора App Invertor 2 01

Рисунок 1. Страница онлайн-редактора App Invertor 2.

Рисунок 2 Ваш профиль программы App Invertor 2 Создание проекта для ардуино 02

После авторизации (можно использовать профиль google) или регистрации попадаем в свой профиль программы, где можем создать новый проект.

Рисунок 2. Ваш профиль программы. Создание проекта.

создаем моб приложение Создание интерфейса в Design 03

Сначала в панети Design создаем интерфейс нашего приложения, перетаскивая на экран необходимые компоненнты. Кроме визуальных компонентов необходимо добавить 3 невизуальных:
Bluetooth client из раздела Connectivity;
Clock из раздела Sensors (для получения данных из Bluetooth c периодичностью, установленной в Clock);
Notifer из UserInterface.

Рисунок 3. Создание интерфейса в Design.

Код для инициализации Bluetooth соединения и создания Bluetooth клиента 04

Теперь создаем код. Переходим в раздел Block. Сначала создаем код для инициализации Bluetooth соединения и создания Bluetooth клиента (рисунок 4).

Рисунок 4. Код для инициализации Bluetooth соединения и создания Bluetooth клиента.

Затем код для отправки сообщений при изменениии состояний chexckbox-ов для насоса, вентилятора и лампы (рисунок 5).

Код для отправки сообщений при изменениии состояний chexckbox-ов 05

Рисунок 5. Код для отправки сообщений при изменениии состояний chexckbox-ов.

И код получения по таймеру сообщений, поступающих по Bluetooth из Arduino (рисунок 6).

Код получения по таймеру сообщений поступающих из Arduino 06

Рисунок 6. Код получения по таймеру сообщений, поступающих из Arduino

Создаем app приложение (рисунок 7) и загружаем его на телефон.

Генерация app приложения 07

Рисунок 7. Генерация app приложения

Нам надо внести самые маленькие изменения в наш предыдущий скетч, заменив разделитель с пробела на символ ‘*’ при отправке данных с Arduino на Android.
Создадим в Arduino IDE новый скетч, занесем в него код из листинга 1 и загрузим скетч на на плату Arduino. Напоминаем, что в настройках Arduino IDE необходимо выбрать тип платы (Arduino UNO) и порт подключения платы.

// подключение библиотеки SoftwareSerial #include // подключение библиотеки DHT #include "DHT.h" // тип датчика DHT #define DHTTYPE DHT11 // контакты подключения bluetooth-модуля HC-05 int pinBlRx=17; int pinBlTx=18; // контакт подключения входа данных модуля DHT11 int pinDHT11=9; // контакт подключения аналогового выхода модуля влажности почвы int pinSoilMoisture=A0; // контакт подключения аналогового выхода датчика температуры TMP36 int pinTMP36=A1; // контакт подключения аналогового выхода фоторезистора int pinPhotoresistor=A2; // пины светодиодов индикации #define LED_TEMP 5 #define LED_MOISTURE 6 #define LED_LIGHT 7 // значения для условий #define TEMP_DETECT 30 #define MOISTURE_DETECT 500 #define LIGHT_DETECT 250 // реле int pinRelays[]=; // статусы полива, освещения, вентилятора boolean statusRelays[]=; // создание экземпляра объекта SoftwareSerial SoftwareSerial HC05Serial(pinBlRx,pinBlTx); // создание экземпляра объекта DHT DHT dht(pinDHT11, DHTTYPE); unsigned long millisupdate=0; // для получения данных из SoftwareSerial String inputString0 = ""; // признак конца полученной строки boolean stringComplete0 = false; void setup() < // запуск последовательного порта Serial.begin(9600); // pinMode(LED_TEMP,OUTPUT);digitalWrite(LED_TEMP,LOW); pinMode(LED_MOISTURE,OUTPUT);digitalWrite(LED_MOISTURE,LOW); pinMode(LED_LIGHT,OUTPUT);digitalWrite(LED_LIGHT,LOW); // инициализация dht dht.begin(); // запуск SoftwareSerial HC05Serial.begin(9600); // резервирование 50 bytes для the inputString: inputString0.reserve(50); >void loop() < // ожидание конца строки для анализа поступившего запроса: serialEvent0(); if (stringComplete0) < Serial.println(inputString0); parse_string0(inputString0); // очистить : inputString0 = ""; stringComplete0 = false; >// каждые 5 сек - получение показаний датчиков // и вывод на дисплей if(millis()-millisupdate>5000) < millisupdate=millis(); // получение данных с DHT11 float h = dht.readHumidity(); if (isnan(h)) < Serial.println("Failed to read from DHT"); HC05Serial.println("H1=101"); delay(10); >else < Serial.print("HumidityDHT11= "); Serial.print(h);Serial.println(" %"); HC05Serial.print("aH=");HC05Serial.print(h);HC05Serial.print("*"); delay(10); >// получение значения с аналогового вывода модуля влажности почвы int val0=analogRead(pinSoilMoisture); Serial.print("SoilMoisture= "); Serial.println(val0); HC05Serial.print("SM=");HC05Serial.print(h);HC05Serial.print("*"); delay(10); // получение значения с аналогового вывода датчика температуры TMP36 int val1=analogRead(pinTMP36); // перевод в мВ int mV= val1*1000/1024; // перевод в градусы цельсия int t=(mV-500)/10+75;//t=23; Serial.print("TempTMP36= "); Serial.print(t);Serial.println(" C"); HC05Serial.print("aT=");HC05Serial.print(t);HC05Serial.print("*"); delay(10); // получение значения с аналогового вывода фоторезистора int val2=analogRead(pinPhotoresistor); Serial.print("Light= "); Serial.println(val2); HC05Serial.print("Ph=");HC05Serial.print(val2);HC05Serial.print("*"); delay(10); // обновить // вывод состояние полива, лампы, вентилятора Serial.print("pump - "); Serial.println(statusRelays[2]); Serial.print("fun - "); Serial.println(statusRelays[1]); Serial.print("lamp - "); Serial.println(statusRelays[0]); HC05Serial.print("PM=");HC05Serial.print(statusRelays[2]);HC05Serial.print("*"); delay(10); HC05Serial.print("FN=");HC05Serial.print(statusRelays[1]);HC05Serial.print("*"); delay(10); HC05Serial.print("LM=");HC05Serial.print(statusRelays[0]); delay(10); //// проверка условий // увлажненность почвы if(val0 > MOISTURE_DETECT) digitalWrite(LED_MOISTURE,HIGH); else digitalWrite(LED_MOISTURE,LOW); // температура воздуха if(t > TEMP_DETECT) digitalWrite(LED_TEMP,HIGH); else digitalWrite(LED_TEMP,LOW); // освещенность if(val2 < LIGHT_DETECT) digitalWrite(LED_LIGHT,HIGH); else digitalWrite(LED_LIGHT,LOW); // пауза 5 секунд Serial.println(); >> // SerialEvent для HC05 void serialEvent0() < while (HC05Serial.available()) < // получить очередной байт: char inChar = (char)HC05Serial.read(); // добавить в строку inputString0 += inChar; // /n - конец передачи if (inChar == '#') < stringComplete0 = true; >> > // парсинг строки из android void parse_string0(String inputString) < // длина строки int length1=inputString.length(); if(length1!=5) if(inputString.charAt(2)!='=') if(inputString.charAt(4)!='#') String param1=inputString.substring(0,2); int param2=inputString.substring(3,4).toInt(); Serial.print("param1=");Serial.println(param1); Serial.print("param2=");Serial.println(param2); if(param1=="PM") doCommand(2,min(param2,1)); else if(param1=="FN") doCommand(1,min(param2,1)); else if(param1=="LM") doCommand(0,min(param2,1)); > // исполнение команды от смартфона void doCommand(int relay, int status1) < // изменить статус statusRelays[relay]=status1; // изменить состояние реле digitalWrite(pinRelays[relay],statusRelays[relay]); >

Загружаем скетч на Arduino, на телефоне запускаем приложение.

08 Рисунок Приложение в работе 09 Рисунок Приложение в работе10 Рисунок Приложение в работе

Рисунок 8, 9, 10. Приложение в работе.
На следующем уроке рассмотрим вопрос превращения нашей теплицы в объект IoT (Интернет вещей).

Как сделать приложение для ардуино

ARDUINO Андроид-приложение для управление ардуино по НС-06.

  • Автор темы Юрий Бронников
  • Дата начала 22 Авг 2020

Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нём некорректно.
Вам необходимо обновить браузер или попробовать использовать другой.

Юрий Бронников

25 Май 2020 3 0

Все андроид-приложения, которые я нашел, отправляют команду ардуино по кликанию на кнопку (например «1»).
Мне же важно чтобы команда на ардуино поступала только в момент удержания кнопки. После, ардуино переходила обратно в ждущий режим.
То есть, держим кнопку на телефоне — на ардуино приходит «1», отпускаем кнопку на телефоне — приходит «0».
Дайте, пожалуйста, ссылку на подобное приложение.

Wan-Derer

Команда форума
31 Июл 2018 1,856 410 Москва wan-derer.ru

Un_ka

13 Июл 2020 241 75 других форумов.

Sketchware — можете создать приложение на телефоне и для телефона. Thunkable — браузерный пакет для создания приложений, про него у Alex’a на сайте есть гайд, правда устаревший. MIT app inventor — подобное Thunkable, только старее.
Если что-нибудь у вас получится, обязательно покажите.

PiratFox

13 Фев 2020 1,650 497

@Юрий Бронников, можете попробовать ещё также браузерную среду RemoteXY. Там всякие кнопки есть, и не только кнопки.

Изменено: 25 Авг 2020

Юрий Бронников

25 Май 2020 3 0

Sketchware — можете создать приложение на телефоне и для телефона. Thunkable — браузерный пакет для создания приложений, про него у Alex’a на сайте есть гайд, правда устаревший. MIT app inventor — подобное Thunkable, только старее.
Если что-нибудь у вас получится, обязательно покажите.

Решение своей задачи я нашел в MIT app inventor. Thunkable не осилил, не разобрался.
Во вложении:
Perekl.Rele.ino Скетч для ардуино
Snaryd.rar в архиве проект расширения .aia
И фотки проекта MIT app inventor (скрин не смог сделать — комп контузило)

Передача данных по Bluetooth между Android и Arduino

В статье Arduino и Bluetooth был рассмотрен один из способов передачи информации между Android-устройством и ПК по Bluetooth-соединению. Там же, в двух словах было упомянуто и Android-устройство, но для принятия и передачи данных использовался Android Bluetooth терминал. Однако, для реальных устройств необходима полноценная программа (не будем же мы управлять тем же роботом из терминала. ), написанная для Android’а. В данной статье хотелось бы затронуть тему программного обеспечения для работы с Bluetooth, с применением языка Java и среды разработки Eclipse. Установка и настройка Eclipse хорошо описана в этой статье: Android и Arduino. Программное обеспечение.

Arduino

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

Я буду использовать Bluetooth модуль HC-06, однако для других модулей HC-04, HC-05 и т.п. схема подключения такая же (за исключением светодиода). Плата Arduino Nano V3. Для наглядности, к плате Arduino я подключил красный светодиод, к 12-пину, но можно использовать и встроенный LED (обычно 13 пин). Скетч для Arduino следующий:

char incomingByte; // входящие данные int LED = 12; // LED подключен к 12 пину void setup() < Serial.begin(9600); // инициализация порта pinMode(LED, OUTPUT); Serial.println("Press 1 to LED ON or 0 to LED OFF. "); >void loop() < if (Serial.available() >0) < //если пришли данные incomingByte = Serial.read(); // считываем байт if(incomingByte == '0') < digitalWrite(LED, LOW); // если 1, то выключаем LED Serial.println("LED OFF. Press 1 to LED ON!"); // и выводим обратно сообщение >if(incomingByte == '1') < digitalWrite(LED, HIGH); // если 0, то включаем LED Serial.println("LED ON. Press 0 to LED OFF!"); >> >

MAC-адрес

Программа работает очень просто. После запуска или сброса устройства, в последовательный порт выводится сообщение с предложением нажать 1 или 0. В зависимости от нажатой (принятой) цифры светодиод будет загораться или гаснуть. В общем программа абсолютно такая же как и в статье: Arduino и Bluetooth. Теперь, что касается Android. Мы рассмотрим два примера, в первом мы будем передавать данные от Android-устройства к arduino, а во втором примере мы рассмотрим двусторонний обмен данными между устройствами. Второй пример сложнее и в части понимания и по сложности кода, т.к. используются потоки (thread). Мы будем использовать Java код, с явным указанием MAC-адреса устройства, к которому мы будем подключаться. Т.к. если делать интерфейс обнаружения Bluetooth-устройств, их выбора, подключения к ним и т.д., то код будет очень большой и для некоторых читателей труднопонимаем. Но для тех, кому интересно могут посмотреть стандартный пример Bluetooth Chat. Узнать MAC-адрес можно к примеру в программе для Android’а: Bluetooth Terminal: Нас интересует устройство BOLUTEK (наш модуль HC-06, подключенный к Arduino), его MAC адрес: 00:15:FF:F2:19:4C. Его и надо будет в дальнейшем прописать в программе.

Android — передаем данные в Arduino

Главное активити

Первая программа очень простая, главное окно активити будет содержать 2 кнопки: включить LED и выключить LED. При нажатии на кнопку включения LED, по Bluetooth будет передаваться «1», при нажатии на выключение LED — «0». В файле манифеста необходимо прописать 2 строки разрешения работы с Bluetooth:
Сам код главного активити:

package com.example.bluetooth1; import java.io.IOException; import java.io.OutputStream; import java.util.UUID; import com.example.bluetooth1.R; import android.app.Activity; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothSocket; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast; public class MainActivity extends Activity < private static final String TAG = "bluetooth1"; Button btnOn, btnOff; private static final int REQUEST_ENABLE_BT = 1; private BluetoothAdapter btAdapter = null; private BluetoothSocket btSocket = null; private OutputStream outStream = null; // SPP UUID сервиса private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); // MAC-адрес Bluetooth модуля private static String address = "00:15:FF:F2:19:4C"; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnOn = (Button) findViewById(R.id.btnOn); btnOff = (Button) findViewById(R.id.btnOff); btAdapter = BluetoothAdapter.getDefaultAdapter(); checkBTState(); btnOn.setOnClickListener(new OnClickListener() < public void onClick(View v) < sendData("1"); Toast.makeText(getBaseContext(), "Включаем LED", Toast.LENGTH_SHORT).show(); >>); btnOff.setOnClickListener(new OnClickListener() < public void onClick(View v) < sendData("0"); Toast.makeText(getBaseContext(), "Выключаем LED", Toast.LENGTH_SHORT).show(); >>); > @Override public void onResume() < super.onResume(); Log.d(TAG, ". onResume - попытка соединения. "); // Set up a pointer to the remote node using it's address. BluetoothDevice device = btAdapter.getRemoteDevice(address); // Two things are needed to make a connection: // A MAC address, which we got above. // A Service ID or UUID. In this case we are using the // UUID for SPP. try < btSocket = device.createRfcommSocketToServiceRecord(MY_UUID); >catch (IOException e) < errorExit("Fatal Error", "In onResume() and socket create failed: " + e.getMessage() + "."); >// Discovery is resource intensive. Make sure it isn't going on // when you attempt to connect and pass your message. btAdapter.cancelDiscovery(); // Establish the connection. This will block until it connects. Log.d(TAG, ". Соединяемся. "); try < btSocket.connect(); Log.d(TAG, ". Соединение установлено и готово к передачи данных. "); >catch (IOException e) < try < btSocket.close(); >catch (IOException e2) < errorExit("Fatal Error", "In onResume() and unable to close socket during connection failure" + e2.getMessage() + "."); >> // Create a data stream so we can talk to server. Log.d(TAG, ". Создание Socket. "); try < outStream = btSocket.getOutputStream(); >catch (IOException e) < errorExit("Fatal Error", "In onResume() and output stream creation failed:" + e.getMessage() + "."); >> @Override public void onPause() < super.onPause(); Log.d(TAG, ". In onPause(). "); if (outStream != null) < try < outStream.flush(); >catch (IOException e) < errorExit("Fatal Error", "In onPause() and failed to flush output stream: " + e.getMessage() + "."); >> try < btSocket.close(); >catch (IOException e2) < errorExit("Fatal Error", "In onPause() and failed to close socket." + e2.getMessage() + "."); >> private void checkBTState() < // Check for Bluetooth support and then check to make sure it is turned on // Emulator doesn't support Bluetooth and will return null if(btAdapter==null) < errorExit("Fatal Error", "Bluetooth не поддерживается"); >else < if (btAdapter.isEnabled()) < Log.d(TAG, ". Bluetooth включен. "); >else < //Prompt user to turn on Bluetooth Intent enableBtIntent = new Intent(btAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); >> > private void errorExit(String title, String message) < Toast.makeText(getBaseContext(), title + " - " + message, Toast.LENGTH_LONG).show(); finish(); >private void sendData(String message) < byte[] msgBuffer = message.getBytes(); Log.d(TAG, ". Посылаем данные: " + message + ". "); try < outStream.write(msgBuffer); >catch (IOException e) < String msg = "In onResume() and an exception occurred during write: " + e.getMessage(); if (address.equals("00:00:00:00:00:00")) msg = msg + ".\n\nВ переменной address у вас прописан 00:00:00:00:00:00, вам необходимо прописать реальный MAC-адрес Bluetooth модуля"; msg = msg + ".\n\nПроверьте поддержку SPP UUID: " + MY_UUID.toString() + " на Bluetooth модуле, к которому вы подключаетесь.\n\n"; errorExit("Fatal Error", msg); >> >

Данный код найден на одном из зарубежных блогов и слегка модернизирован. Как видно выше, на кнопки мы вешаем обработчики событий. При нажатии на кнопку передается строка 1 или 0 через sendData() в буфер Bluetooth адаптера. Полный проект с исходными кодами приведен ниже. Для работы программы, необходим Android не ниже версии API15, т.е. 4.0.3 и выше.

Android — прием и передача данных к Arduino

А вот здесь пришлось повозиться. Дело в том, что в Android’е для приема данных от какого-либо устройства необходимо создавать отдельный фоновый поток, чтобы у нас не зависало основное активити. Для этого мы задействуем thread и все данные будут приниматься в отдельном потоке. На окно главного активити мы добавим новый элемент TextView, который будет служить для отображения принятых данных от Arduino. Сам java-код главного активити я постарался хорошо прокомментировать, чтобы сделать его удобочитаемым:

package com.example.bluetooth2; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.UUID; import com.example.bluetooth2.R; import android.app.Activity; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothSocket; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends Activity < private static final String TAG = "bluetooth2"; Button btnOn, btnOff; TextView txtArduino; Handler h; private static final int REQUEST_ENABLE_BT = 1; final int RECIEVE_MESSAGE = 1; // Статус для Handler private BluetoothAdapter btAdapter = null; private BluetoothSocket btSocket = null; private StringBuilder sb = new StringBuilder(); private ConnectedThread mConnectedThread; // SPP UUID сервиса private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); // MAC-адрес Bluetooth модуля private static String address = "00:15:FF:F2:19:4C"; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnOn = (Button) findViewById(R.id.btnOn); // кнопка включения btnOff = (Button) findViewById(R.id.btnOff); // кнопка выключения txtArduino = (TextView) findViewById(R.id.txtArduino); // для вывода текста, полученного от Arduino h = new Handler() < public void handleMessage(android.os.Message msg) < switch (msg.what) < case RECIEVE_MESSAGE: // если приняли сообщение в Handler byte[] readBuf = (byte[]) msg.obj; String strIncom = new String(readBuf, 0, msg.arg1); sb.append(strIncom); // формируем строку int endOfLineIndex = sb.indexOf("\r\n"); // определяем символы конца строки if (endOfLineIndex >0) < // если встречаем конец строки, String sbprint = sb.substring(0, endOfLineIndex); // то извлекаем строку sb.delete(0, sb.length()); // и очищаем sb txtArduino.setText("Ответ от Arduino: " + sbprint); // обновляем TextView btnOff.setEnabled(true); btnOn.setEnabled(true); >//Log.d(TAG, ". Строка:"+ sb.toString() + "Байт:" + msg.arg1 + ". "); break; > >; >; btAdapter = BluetoothAdapter.getDefaultAdapter(); // получаем локальный Bluetooth адаптер checkBTState(); btnOn.setOnClickListener(new OnClickListener() < // определяем обработчик при нажатии на кнопку public void onClick(View v) < btnOn.setEnabled(false); mConnectedThread.write("1"); // Отправляем через Bluetooth цифру 1 //Toast.makeText(getBaseContext(), "Включаем LED", Toast.LENGTH_SHORT).show(); >>); btnOff.setOnClickListener(new OnClickListener() < public void onClick(View v) < btnOff.setEnabled(false); mConnectedThread.write("0"); // Отправляем через Bluetooth цифру 0 //Toast.makeText(getBaseContext(), "Выключаем LED", Toast.LENGTH_SHORT).show(); >>); > @Override public void onResume() < super.onResume(); Log.d(TAG, ". onResume - попытка соединения. "); // Set up a pointer to the remote node using it's address. BluetoothDevice device = btAdapter.getRemoteDevice(address); // Two things are needed to make a connection: // A MAC address, which we got above. // A Service ID or UUID. In this case we are using the // UUID for SPP. try < btSocket = device.createRfcommSocketToServiceRecord(MY_UUID); >catch (IOException e) < errorExit("Fatal Error", "In onResume() and socket create failed: " + e.getMessage() + "."); >// Discovery is resource intensive. Make sure it isn't going on // when you attempt to connect and pass your message. btAdapter.cancelDiscovery(); // Establish the connection. This will block until it connects. Log.d(TAG, ". Соединяемся. "); try < btSocket.connect(); Log.d(TAG, ". Соединение установлено и готово к передачи данных. "); >catch (IOException e) < try < btSocket.close(); >catch (IOException e2) < errorExit("Fatal Error", "In onResume() and unable to close socket during connection failure" + e2.getMessage() + "."); >> // Create a data stream so we can talk to server. Log.d(TAG, ". Создание Socket. "); mConnectedThread = new ConnectedThread(btSocket); mConnectedThread.start(); > @Override public void onPause() < super.onPause(); Log.d(TAG, ". In onPause(). "); try < btSocket.close(); >catch (IOException e2) < errorExit("Fatal Error", "In onPause() and failed to close socket." + e2.getMessage() + "."); >> private void checkBTState() < // Check for Bluetooth support and then check to make sure it is turned on // Emulator doesn't support Bluetooth and will return null if(btAdapter==null) < errorExit("Fatal Error", "Bluetooth не поддерживается"); >else < if (btAdapter.isEnabled()) < Log.d(TAG, ". Bluetooth включен. "); >else < //Prompt user to turn on Bluetooth Intent enableBtIntent = new Intent(btAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); >> > private void errorExit(String title, String message) < Toast.makeText(getBaseContext(), title + " - " + message, Toast.LENGTH_LONG).show(); finish(); >private class ConnectedThread extends Thread < private final BluetoothSocket mmSocket; private final InputStream mmInStream; private final OutputStream mmOutStream; public ConnectedThread(BluetoothSocket socket) < mmSocket = socket; InputStream tmpIn = null; OutputStream tmpOut = null; // Get the input and output streams, using temp objects because // member streams are final try < tmpIn = socket.getInputStream(); tmpOut = socket.getOutputStream(); >catch (IOException e) < >mmInStream = tmpIn; mmOutStream = tmpOut; > public void run() < byte[] buffer = new byte[256]; // buffer store for the stream int bytes; // bytes returned from read() // Keep listening to the InputStream until an exception occurs while (true) < try < // Read from the InputStream bytes = mmInStream.read(buffer); // Получаем кол-во байт и само собщение в байтовый массив "buffer" h.obtainMessage(RECIEVE_MESSAGE, bytes, -1, buffer).sendToTarget(); // Отправляем в очередь сообщений Handler >catch (IOException e) < break; >> > /* Call this from the main activity to send data to the remote device */ public void write(String message) < Log.d(TAG, ". Данные для отправки: " + message + ". "); byte[] msgBuffer = message.getBytes(); try < mmOutStream.write(msgBuffer); >catch (IOException e) < Log.d(TAG, ". Ошибка отправки данных: " + e.getMessage() + ". "); >> /* Call this from the main activity to shutdown the connection */ public void cancel() < try < mmSocket.close(); >catch (IOException e) < >> > >

В данном примере для отправки данных мы используем отдельный поток Thread. Тоже самое и для приема данных — метод run(). Также обратите внимание на класс Handler, который служит для организации очереди сообщений и их вывода в главное активити. Дело в том, что в фоновом потоке нельзя напрямую выводить что-либо в главное активити, т.к. это приведет к «крашу» программы.
Класс StringBuilder используется для формирования строки из принятых данных. После, происходит поиск конца строки с символами \r\n, и если они найдены, то строка отображается на активити и обьект sb очищается, чтобы не произошло склейка с последующими принятыми данными. К статье прилагаются скомпилированные файлы для Android: bluetooth1.apk и bluetooth2.apk, а также исходники проекта для Arduino IDE и Eclipse

  • arduino64.rar (1371 Кб)
  • Bluetooth1.apk (161 Кб)
  • Bluetooth2.apk (161 Кб)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *