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.

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

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

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

Теперь создаем код. Переходим в раздел Block. Сначала создаем код для инициализации Bluetooth соединения и создания Bluetooth клиента (рисунок 4).
Рисунок 4. Код для инициализации Bluetooth соединения и создания Bluetooth клиента.
Затем код для отправки сообщений при изменениии состояний chexckbox-ов для насоса, вентилятора и лампы (рисунок 5).

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

Рисунок 6. Код получения по таймеру сообщений, поступающих из Arduino
Создаем app приложение (рисунок 7) и загружаем его на телефон.

Рисунок 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, на телефоне запускаем приложение.


Рисунок 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, однако для других модулей 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!"); >> >

Программа работает очень просто. После запуска или сброса устройства, в последовательный порт выводится сообщение с предложением нажать 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 Кб)