Enviar datos desde android a arduino por Puerto serie-usb. (Parte 3 de 4)

La aplicación android (Lo que todos esperaban):
En esta parte construiremos la interfaz de la aplicación y la funcionalidad de esta interfaz. Así que empezaremos por la interfaz trabajando sobre el fichero activity_main.xml el cual editaremos para que quede de la siguiente forma:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.dcastro.ardroid.MainActivity">

    <Button
        android:id="@+id/buttonConectarse"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="0.33"
        android:text="Conectarse"/>

    <Button
        android:id="@+id/buttonEncender"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="0.33"
        android:text="Encender"/>

    <Button
        android:id="@+id/buttonApagar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="0.33"
        android:text="Apagar" />

</LinearLayout>
Con lo cual obtendremos la siguiente interfaz:

Para darle funcionalidad a esta interfaz trabajaremos sobre el fichero MainActivity.java. Como se puede observar en la interfaz tenemos 3 botones uno para conectarse y los otro dos para para encender y apagar el led.

Para empezar deberemos añadir las dos variable que utilizaremos para utilizar el puerto.
private UsbManager usbManager;
private UsbSerialDriver device;
Ahora en el método onCreate lo primero es obtener el servicio USB con esta línea de código:
usbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
Ahora vamos a programar la funcionalidad del botón de Conectarse (Este código va dentro de la función onCreate):
Button bConectarse=(Button)findViewById(R.id.buttonConectarse);
bConectarse.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Toast.makeText(getApplicationContext(), "Conectandose", Toast.LENGTH_LONG).show();
        device = UsbSerialProber.acquire(usbManager);
        if (device == null) {
            //No hay ningún dispositivo conectado.
            Toast.makeText(getApplicationContext(), "No hay ningún dispositivo conectado.", Toast.LENGTH_LONG).show();
        } else {
            try {
                //Abrir el dispositivo.
                device.open();
                //Ajuste la velocidad de comunicación.
                device.setBaudRate(115200); //Asegúrese de que este coincida con la configuración de su dispositivo.
                Toast.makeText(getApplicationContext(), "Conectado", Toast.LENGTH_LONG).show();
            } catch (IOException err) {
                Toast.makeText(getApplicationContext(), "Error al configurar el dispositivo USB: " + err.getMessage(), Toast.LENGTH_LONG).show();
                try {
                    //Algo falló, intente cerrar el dispositivo.
                    device.close();
                } catch (IOException err2) {
                    //No se pudo cerrar, no hay nada mas que hacer.
                }
                device = null;
                return;
            }
        }
    }
});
Antes de realizar la funcionalidad de Encender y Apagar vamos a programar una función que es la que se llamara para enviar los datos. Esta función quedaría así:

private void sendToArduino(String data){
    byte[] dataToSend = data.getBytes();
    if (device != null){
        try{
            device.write(dataToSend, 500);
            Toast.makeText(this, "Enviando...", Toast.LENGTH_LONG).show();
        }
        catch (IOException e){
            Toast.makeText(getApplicationContext(), "No se pudo enviar los datos por el puerto serie.", Toast.LENGTH_LONG).show();
        }
    }
}
Teniendo esta función ahora si podemos hacer las funcionalidades de los dos botones que nos quedan las cuales son muy parecidas lo único que cambia es el dato que se envía (Este código va dentro de la función onCreate):

Button bEncender=(Button)findViewById(R.id.buttonEncender);
bEncender.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        sendToArduino("1");
    }
});

Button bApagar=(Button)findViewById(R.id.buttonApagar);
bApagar.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        sendToArduino("0");
    }
});
Con esto hemos terminado de programar la funcionalidad de la aplicación en general el fichero deberá quedar así:

import android.content.Context;
import android.hardware.usb.UsbManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import com.hoho.android.usbserial.driver.UsbSerialDriver;
import com.hoho.android.usbserial.driver.UsbSerialProber;

import java.io.IOException;

public class MainActivity extends AppCompatActivity {

    private UsbManager usbManager;
    private UsbSerialDriver device;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        usbManager = (UsbManager) getSystemService(Context.USB_SERVICE);

        Button bConectarse=(Button)findViewById(R.id.buttonConectarse);
        bConectarse.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(getApplicationContext(), "Conectandose", Toast.LENGTH_LONG).show();
                device = UsbSerialProber.acquire(usbManager);
                if (device == null) {
                    //No hay ningún dispositivo conectado.
                    Toast.makeText(getApplicationContext(), "No hay ningún dispositivo conectado.", Toast.LENGTH_LONG).show();
                } else {
                    try {
                        //Abrir el dispositivo.
                        device.open();
                        //Ajuste la velocidad de comunicación.
                        device.setBaudRate(115200); //Asegúrese de que este coincida con la configuración de su dispositivo.
                        Toast.makeText(getApplicationContext(), "Conectado", Toast.LENGTH_LONG).show();
                    } catch (IOException err) {
                        Toast.makeText(getApplicationContext(), "Error al configurar el dispositivo USB: " + err.getMessage(), Toast.LENGTH_LONG).show();
                        try {
                            //Algo falló, intente cerrar el dispositivo.
                            device.close();
                        } catch (IOException err2) {
                            //No se pudo cerrar, no hay nada mas que hacer.
                        }
                        device = null;
                        return;
                    }
                }
            }
        });

        Button bEncender=(Button)findViewById(R.id.buttonEncender);
        bEncender.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                sendToArduino("1");
            }
        });

        Button bApagar=(Button)findViewById(R.id.buttonApagar);
        bApagar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                sendToArduino("0");
            }
        });
    }

    private void sendToArduino(String data){
        byte[] dataToSend = data.getBytes();
        if (device != null){
            try{
                device.write(dataToSend, 500);
                Toast.makeText(this, "Enviando...", Toast.LENGTH_LONG).show();
            }
            catch (IOException e){
                Toast.makeText(getApplicationContext(), "No se pudo enviar los datos por el puerto serie.", Toast.LENGTH_LONG).show();
            }
        }
    }
}

Comments

  1. Hola buenas me gustaria saber si podrias compartirme o ayudarme de alguna manera de poder realizar lo mismo pero en vez de enviar... Leer los datos del arduino. He buscado meses, pero no logro que funcione...

    Gracias

    ReplyDelete
    Replies
    1. Hola un saludo, también estoy buscando esa información, encontraste algo acerca de tema y si es asi sería posible que me compartas la información, gracias

      Delete

Post a Comment

Popular posts from this blog

Algoritmo genético: Problema del viajante.

Enviar datos desde android a arduino por Puerto serie-usb. (Parte 1 de 4)