1 of 36

Arduino, Bluetooth

y Android

O cómo encender una luz desde el sofá.

Francisco M Sirvent Sala

Android Developer en Redbooth

@narfss

github.com/narfss

fmSirvent.com

2 of 36

Arduino

Arduino es una plataforma de hardware libre, basada en una placa con un microcontrolador y un entorno de desarrollo, diseñada para facilitar el uso de la electrónica.

  • Wikipeia dixit.

Traducción:

Un chip programable en una placa que facilita mucho la conexión de dispositivos, su alimentación y su programación.

Junto a esta placa también está disponible un IDE oficial, librerías y ejemplos básicos. El lenguaje con el que se programa normalmente es C siendo claro y accesible para todos.

Alrededor de Arduino se han creado componentes, librerías y ejemplos más complejos gracias a la comunidad.

3 of 36

4 of 36

Conexiones

Digitales:

Sobre estas conexiones puede emitir un 1 o 0, en cuanto a corriente se traduce por 5v o 0v. De igual manera puede también recibir el 1 o 0 por el mismo.

PWM:

La salida de corriente en este caso puede variar de 5v a 0v, pudiendo tener voltajes intermedios.

Analogic:

A la inversa que las salidas PWM estas serán las entradas por donde se podrá medir un voltaje.

GND:

Toma tierra.

VCC (5v, 3v):

Salida de voltaje.

5 of 36

IDE

Disponible en arduino.org

Archivo → Ejemplos:

Lista de ejemplos básicos explicados y organizados.

Herramientas → Placa:

Lista de placas Arduino, seleccionar la vuestra.

Herramientas → Puerto:

Seleccionar el puerto usb al que esté conectado el

Arduino.

✓ Verificar:

Comprueba que el código sea correcto.

→ Subir:

Envía el programa al Arduino.

6 of 36

Código ejemplo

void setup() {

//Código ejecutado al arrancar el Arduino

�}��void loop() {

//Código ejecutado en bucle constantemente� �}

7 of 36

Código ejemplo

int LED_PIN = 13;��void setup() {� pinMode(LED_PIN, OUTPUT);�}��void loop() {� digitalWrite(LED_PIN, HIGH); � delay(1000); � digitalWrite(LED_PIN, LOW); � delay(1000); �}

8 of 36

Bluetooth

Bluetooth es una especificación industrial para Redes Inalámbricas de Área Personal que posibilita la transmisión datos entre diferentes dispositivos mediante un enlace por radiofrecuencia en la banda ISM de los 2,4 GHz.

  • Wikipedia dixit again.

Traducción:

Dispositivo que conectado a un arduino nos permitirá recibir información de otros dispositivos con bluetooth, como en nuestro caso un móvil Android.

9 of 36

El bluetooth suele venir con un nombre y un password por defecto y podemos cambiarlo.

AT

OK

AT+NAME=NEWNAME

AT+PSWD=1234

Es necesario conectarnos por serial al módulo para utilizar estos comandos.

AT Commands

Inigo Montoya

10 of 36

#include <SoftwareSerial.h>��int RX = 10;�int TX = 11;�int KEY = 9;�SoftwareSerial Bluetooth(RX, TX);��void setup() {� pinMode(KEY, OUTPUT);� digitalWrite(KEY, HIGH);� Serial.begin(9600);� Serial.println("Enter AT commands:");� Bluetooth.begin(38400);�}��void loop() {� if (Bluetooth.available())� Serial.write(Bluetooth.read());� if (Serial.available())� Bluetooth.write(Serial.read());�}

Conexiones

11 of 36

AT por serial

En el IDE de Arduino:

Seleccionar puerto:

Herramientas Puerto

Abrir monitor de serie:

Herramientas Monitor série

12 of 36

#include <SoftwareSerial.h>��int RX = 10;�int TX = 11;�SoftwareSerial bluetooth(RX, TX);�int LED_PIN = 13;�String inputString = "";��void setup() {� bluetooth.begin(9600);� pinMode(LED_PIN, OUTPUT);�}�

Conexiones Arduino y bluetooh

13 of 36

Conexiones Arduino y bluetooh

void loop() {� if(bluetooth.available()) {� while(bluetooth.available()) {� inputString += (char) bluetooth.read();� }� if (inputString == "ON") {� digitalWrite(LED_PIN, HIGH); � } else if (inputString == "OFF") {� digitalWrite(LED_PIN, LOW);� }� inputString = "";� }�}

14 of 36

HotFix

char serialData[3];�char ON[] = "ON"; �char OF[] = "OF";��void loop() {� int bufferSize = bluetooh.available();� if (bufferSize == 2) {� bluetooh.readBytes(serialData, bufferSize);� if (strcmp(serialData, ON) == 0) {� digitalWrite(LED_PIN, HIGH); � } else if (strcmp(serialData, OF) == 0) {� digitalWrite(LED_PIN, LOW);� }� }� delay(20);�}

15 of 36

Android

Android es un sistema operativo basado en el núcleo Linux. Fue diseñado principalmente para dispositivos móviles.

  • Wikipedia last dixit

Traducción:

El sistema operativo de un móvil Android.

La programación de aplicaciones por defecto es en Java.

Es completamente libre y gratuito.

16 of 36

Android Studio

Descargar e instalar Android Studio de

https://developer.android.com/sdk

Podéis descargar el IDE y el SDK necesario

junto.

Necesitareis también java.

17 of 36

First project

Pulsar a ”Start new Android Studio project”.

Completar el nombre y la compañía.

18 of 36

First project

En nuestro ejemplo la plataforma y el target serán Phone y tablet, con API mínima 15.

19 of 36

First project

Para que el proyecto cree automáticamente una vista básica sobre la que trabajemos elegir ”Blank Activity”

20 of 36

First project

Aquí podéis configurar el nombre y título que tendrán esta activity.

21 of 36

First project

Bienvenidos a vuestro primer proyecto:

22 of 36

Main layout

<FrameLayout 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"� tools:context=".MainActivity">�� <Switchandroid:layout_width="wrap_content"� android:layout_height="wrap_content"� android:text="Light"� android:id="@+id/switch1"� android:layout_gravity="center" />��</FrameLayout>

23 of 36

Activity main

@Overrideprotected void onCreate(Bundle savedInstanceState) {� super.onCreate(savedInstanceState);� setContentView(R.layout.activity_main);� Switch lightSwitch = (Switch) findViewById(R.id.switch1);� lightSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {� @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {� if (outputStream != null) {� String outputData;� if (isChecked) {� outputData = "ON";� } else {� outputData= "OF";� }� try {

outputStream.write(outputData.getBytes());� } catch (IOException e) {� e.printStackTrace();� }� }� }� });� }

24 of 36

Activity main

private static final int SELECT_BT = 2;

...

@Overrideprotected void onCreate(Bundle savedInstanceState) {� super.onCreate(savedInstanceState);� setContentView(R.layout.activity_main);

Intent intent = new Intent(this, SelectBluetoothDeviceActivity.class);� startActivityForResult(intent, SELECT_BT);� configureSwitch();� }�� private void configureSwitch() {� Switch lightSwitch = (Switch) findViewById(R.id.switch1);� lightSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {� @Overridepublic void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {� if (outputStream != null) {� String outputData;� if (isChecked) {� outputData = "ON";� } else {� outputData= "OF";� }� try {

outputStream.write(outputData.getBytes());� } catch (IOException e) {� e.printStackTrace();� }� }� }� });� }

25 of 36

Activity bluetooth devices

File → New → Activity → Blank activity

Darle el nombre: SelectBluetoothDeviceActivity

26 of 36

Activity bluetooth devices

Tenemos un nuevo activity, con su código java y su layout.

27 of 36

Layout bluetooth devices

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"� android:layout_width="match_parent"� android:layout_height="match_parent">�� <ListViewandroid:id="@+id/bt_list"� android:layout_width="match_parent"� android:layout_height="match_parent"/>��</FrameLayout>

28 of 36

Activity bluetooth devices

public static final String SELECTED_BLUETOOTH = "selected_blue";�private ArrayList<BluetoothDevice> bluetoothDevices;��@Overrideprotected void onCreate(Bundle savedInstanceState) {� super.onCreate(savedInstanceState);� setContentView(R.layout.activity_select_bluetooth_device);� prepareDevices();� configureList();�}��private void prepareDevices() {� BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();� Object[] objects = adapter.getBondedDevices().toArray();� bluetoothDevices = new ArrayList<>();� for (Object object : objects) {� bluetoothDevices.add((BluetoothDevice) object);� }�}�

29 of 36

Activity bluetooth devices

private void configureList() {� ListView btlist = (ListView) findViewById(R.id.bt_list);� btlist.setOnItemClickListener(new AdapterView.OnItemClickListener() {� @Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {� BluetoothDevice bluetoothDevice = bluetoothDevices.get(position);� Bundle conData = new Bundle();� conData.putParcelable(SELECTED_BLUETOOTH, bluetoothDevice);� Intent intent = new Intent();� intent.putExtras(conData);� setResult(RESULT_OK, intent);� finish();� }� });

btlist.setAdapter(new BluetoothListAdapter(bluetoothDevices));�}

30 of 36

Activity bluetooth devices

public class BluetoothListAdapter extends BaseAdapter {� private ArrayList<BluetoothDevice> devices;�� public BluetoothListAdapter(ArrayList<BluetoothDevice> bondedDevices) {� devices = bondedDevices;� }�� @Overridepublic int getCount() {� return devices.size();� }�� @Overridepublic View getView(int position, View convertView, ViewGroup parent) {� LayoutInflater inflater = (LayoutInflater) parent.getContext()� .getSystemService(Context.LAYOUT_INFLATER_SERVICE);� View rowView = inflater.inflate(android.R.layout.simple_list_item_1, parent, false);� TextView textView1 = (TextView) rowView.findViewById(android.R.id.text1);� textView1.setText(devices.get(position).getName());� return rowView;� }�� @Overridepublic Object getItem(int position) {� return devices.get(position);� }�� @Overridepublic long getItemId(int position) {� return position;� }�}

31 of 36

Activity main on result

private BluetoothDevice bluetoothDevice = null;�private OutputStream outputStream;

protected void onActivityResult(int requestCode, int resultCode, Intent data) {� super.onActivityResult(requestCode, resultCode, data);� if (requestCode== SELECT_BT� && data != null� && data.getExtras() != null) {� bluetoothDevice =

data.getExtras().getParcelable(SelectBluetoothDeviceActivity.SELECTED_BLUETOOTH);� openBluetooth();� } else {� finish();� }�}

32 of 36

Activity main open bluetooth

private static final String SPP_UUID = "00001101-0000-1000-8000-00805f9b34fb";

void openBluetooth() {� UUID uuid = UUID.fromString(SPP_UUID); BluetoothSocket socket = null;� try {� socket = bluetoothDevice.createRfcommSocketToServiceRecord(uuid);� socket.connect();� outputStream = socket.getOutputStream();� } catch (IOException e) {� e.printStackTrace();� }� if (socket != null) {� Toast.makeText(this, "BT << " + bluetoothDevice.getName() + " >> is now open ",

Toast.LENGTH_LONG).show();� } else {� Toast.makeText(this, "BT << " + bluetoothDevice.getName() + " >> fail to open ",

Toast.LENGTH_LONG).show();� }�}

33 of 36

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"� package="com.fmsirvent.androidbluetoothyarduino" > <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/> <uses-permission android:name="android.permission.BLUETOOTH"/> <application android:allowBackup="true"� android:icon="@mipmap/ic_launcher"� android:label="@string/app_name"� android:theme="@style/AppTheme" > <activity android:name=".MainActivity"� android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".SelectBluetoothDeviceActivity"� android:label="@string/title_activity_select_bluetooth_device" > </activity> </application>�� </manifest>

Manifest permisos

34 of 36

GO!

Run → Run App...

35 of 36

Código fuente y documentación

https://github.com/Narfss/Arduino-Bluetooth-y-Android

36 of 36

O cómo encender una luz desde el sofá.

Francisco M Sirvent Sala

Android Developer en Redbooth

@narfss

github.com/narfss

fmSirvent.com

Arduino, Bluetooth y Android

Q&A