Mostrando entradas con la etiqueta android. Mostrar todas las entradas
Mostrando entradas con la etiqueta android. Mostrar todas las entradas

martes, 18 de octubre de 2022

Transistor Téster para Arduino Nano - Visualización en Android

  Página principal



Transistor Téster para Arduino Nano
Visualización en Android


En un montaje anterior había realizado un analizador de componentes llamado  TransistorTester, cuyo autor era  Karl-Heinz Kübbeler .
Según la configuración del programa se podía utilizar diferentes tipos de visualizadores, en mi caso había utilizado un OLED.
También posteriormente había realizado un programa en gambas y Visual Basic  para representar datos.
  12/12/2021 - Transistor Tester para Arduino Nano.representación en PC con Gambas (VB linux). GTESTER
Para los que deseen utilizar un dispositivo android a modo de presentación de resultados del téster, he programado una aplicación en android para representar los resultados.
Como el arduino no tiene conexión bluetooth, he añadido un módulo de bluetooth a serie HC-05.
Anteriormente había realizado :
  03/06/2021 - Balanza con XFW-HX711 - ESP32 - Bluetooth -Interface Android. ESP_Bluetooth
He utilizado parte del código de android y lo he modificado para este montaje.


El módulo HC-05 debemos conectarlo con 3 cables al arduino, GND-VCC- (TX.arduino->RX.hc05).
Si queremos cambiar el nombre y contraseña del dispositivo bluetooth  HC05, podéis ver el modo en ardisx.html.

Circuito montado.


Programa android.


PROGRAMAS ANDROID Y ARDUINO

VIDEO DEMOSTRATIVO

Saludos.
Juan Galaz



Bibliografía:

https://github.com/kr4fty/Ardutester
https://www.sysadminsdecuba.com/2020/08/ardutester-tester-de-componentes-con-arduino/
https://create.arduino.cc/projecthub/mircemk/diy-super-simple-electronic-component-tester-234752
https://create.arduino.cc/projecthub/plouc68000/ardutester-v1-13-the-arduino-uno-transistor-tester-dbafb4
12/12/2021 - Transistor Tester para Arduino Nano.representación en PC con Gambas (VB linux). GTESTER
03/06/2021 - Balanza con XFW-HX711 - ESP32 - Bluetooth -Interface Android. ESP_Bluetooth

jueves, 3 de junio de 2021

Balanza con XFW-HX711 - ESP32 - Bluetooth - Interface Android


Balanza con XFW-HX711
ESP32 - Bluetooth
Interface Android


Hace unos años (6) , había trabajado con dispositivos  Bluetooth, utilizaba arduino y el módulo HC05.
Marcador controlado por bluetooth.
El módulo HC05 transmite señales con protocolo serie mediante el bluetooth.
Al disponer el ESP32 de interface interna  bluetooth, se puede utilizar para transmitir datos.
Había realizado una balanza con arduino, y posteriormente con el ESP32, en los dos casos la representación se hacía en un OLED.
Se me vino a la cabeza la idea de transmitir el peso mediante bluetooth, para luego representar los datos en un móvil tipo android. Además me servía de practicas con el ESP32 y el bluetooth.
En cuanto a la programación en la parte del ESP32 fue bastante fácil, existen muchos ejemplos.
Para no complicar mucho la programación, no he colocado contraseña en la báscula.


Circuito montado.

//_____HX711______________
#include "HX711.h"
const int DOUT=16;
const int CLK=17;
HX711 balanza;

float peso;
#define AJUSTE 1977700
char L4_peso[25];

//_____Bluetooth____________
#include "BluetoothSerial.h"
BluetoothSerial SerialBT;


#define PIN_LED 2

char VARI[100];
char mibuffer[20];
char TITULO[]="PESO_BT_seta";
int timePeso=TPESO;
......
 SerialBT.begin(TITULO); //Bluetooth device name
......
Le damos el nombre de  "PESO_BT_seta"   como nombre de la red Buetooth


Las pruebas se hicieron con el programa Serial Bluetooth

Antes de conectarse con el programa debemos sincronizar el Dispositivo Bluetooth en ajustes de android.
Como podemos observar se retransmiten los datos del peso cada 0.5 segundos.

La explicación de la calibración del módulo de peso se encuentra en bmp180.html .
Viendo que todo funcionaba correctamente, la segunda parte era la programación en el android.
Esta parte me ha costado bastante, hacía 5 años que no programaba nada en android, y para colmo había formateado el Debian 9 donde lo había programado.
Me tocó dos cosas, instalar en una partición Debian 9, luego instalar adt-bundle-linux-x86-20140702.zip , y actualizarlo con el ADT-23.0.6.zip .
Y lo peor de todo, acordarme de como se programaba, aunque tenía mis ejemplos anteriores de hace 5 años.
Después de arduo trabajo me salió este pequeño programa.


En la aplicación balanza seleccionamos el adaptador.


El programa balanza funcionando.



Circuito y programa balanza funcionando
.

Espero que les guste este programa y que les sirva para los suyos.

Programa Arduino ESP32
Programa Android APK  y fuentes ( Eclipse - Linux Debian9 32bits)


Saludos.
Juan Galaz

Bibliografía:
https://www.industrialshields.com/es_ES/blog/blog-industrial-open-source-1/post/esp32-wifi-bluetooth-133
https://www.juanjobeunza.com/esp32-ble/
https://www.prometec.net/esp32-serial-bluetooth/
http://kio4.com/arduino/180_Wemos_Bluetooth_LED_Pulsadores.htm
http://kio4.com/arduino/150_Wemos_BluetoothClasico.htm
espgrs.html
android.html
androg.html
http://cursoandroidstudio.blogspot.com/2015/10/conexion-bluetooth-android-con-arduino.html
http://solderer.tv/data-transfer-between-android-and-arduino-via-bluetooth/


sábado, 4 de junio de 2016

ANDROID - Códigos postales de España - openRawResource(getResources().getIdentifier


Android

ANDROID
Códigos postales de España
getResources().openRawResource(getResources().getIdentifier(miProvincia, "raw", getPackageName()));

Encontré una base de datos de códigos postales de España y era una buena ocasión de hacer una aplicación que buscara los códigos por provincias y calles o pueblos.
En este caso había realizado esta aplicación en gambas(VB linux), luego la he realizado para android.
Estos datos de CP(códigos postales) se colocan en el directorio /res/raw ,y solo son de lectura. Estos datos están organizados por capitales y provincias, y en algún que otro caso en ciudades grandes como Reus, Fuenlabrada, etc.
El fichero indice se llama codciuz.txt donde figuran nombres de capitales y provincias, y el nombre de fichero que corresponde a dicha capital o provincia.

280:MADRID
28X:MADRID
150:A CORUÑA
030:ALACANT/ALICANTE

Para el ejemplo de Madrid capital el fichero se llamará a280codpos.txt . El fichero original se llamaba 280codpos.txt  , pero en los recursos internos los ficheros no deben empezar por numero, no distingue entre mayúsculas y minúsculas , además la extensión no se utiliza, por lo que tuve que renombrar los ficheros.
En el fichero  están los datos postales ordenados de la siguiente forma:

28021:A (EL SALOBRAL)
28032:ABAD JUAN CATALAN
28013:ABADA
28012:ABADES
28039:ABADESA
28043:ABALOS
28037:ABANICO

En este fichero se recorre buscando concordancias con el nombre de la calle que se quiere buscar.



Recomiendo ver el anterior androj.html programa para entender este.
Lo diferente de este programa frente al anterior es el nombre de fichero de la provincia. En este caso no sabemos su nombre hasta que no nos lo proporcione la búsqueda por provincia, y esto lo solucionamos con la siguiente orden:
ISentrada2 = getResources().openRawResource(getResources().getIdentifier(miProvincia, "raw", getPackageName()));
Donde miProvincia es el nombre del fichero de recursos internos.
Utilizamos un buffer para aumentar la velocidad de acceso al fichero.
BFentrada2 = new BufferedReader(new InputStreamReader(ISentrada2));
Leemos línea por línea buscando concordancias con el nombre de calle.
while ((Sentrada=BFentrada2.readLine()) != null)
            {
                String SentradaT[]= Sentrada.split(":");
                if(SentradaT[1].contains(Scalle))    
                    {
                        Ncalles++;  
                        Mcallel.append(Sentrada);
                        Mcallel.append("\n");
                    }
            }     
public void cuantosCX(String Lprovincia)
    {                 
        String miProvincia;
        Scalle=Mcalle.getText().toString();       
        Scalle=Scalle.toUpperCase();
        Mcalle.setText(Scalle); 
        miProvincia = Lprovincia.substring(0, Lprovincia.length()-4);
       
        try
        {
            if(ISentrada2 != null)    ISentrada2.close();       
            ISentrada2 = getResources().openRawResource(getResources().getIdentifier(miProvincia, "raw", getPackageName()));
            BFentrada2 = new BufferedReader(new InputStreamReader(ISentrada2));
           
            while ((Sentrada=BFentrada2.readLine()) != null)
            {
                String SentradaT[]= Sentrada.split(":");
                if(SentradaT[1].contains(Scalle))    
                    {
                        Ncalles++;  
                        Mcallel.append(Sentrada);
                        Mcallel.append("\n");
                    }
            }       
           
            ISentrada2.close();
        }
        catch (IOException e)
        {
            Log.e("Provincias->",e.getMessage(),e);
        }       
       
    }


PROGRAMA

Saludos
Juan Galaz


Bibliografía:

http://seta43.duckdns.org/android.html
http://android.okhelp.cz/java_android_code.php?s=openRawResource
http://www.programmershare.com/1333689/

ANDROID 4: DESARROLLO DE APLICACIONES (En papel)
ISBN 9788441531970
WEI MENG LEE , ANAYA MULTIMEDIA, 2012

EL GRAN LIBRO DE ANDROID (3ª ED.) (En papel)
ISBN 9788426719768
JESUS TOMAS GIRONES , S.A. MARCOMBO, 2013

jueves, 19 de mayo de 2016

ANDROID - Municipios de España - openRawResource


Android

ANDROID
Municipios de España
openRawResource

En esta aplicación para android realizo una especie de base de datos que busca los municipios de España.
No estoy muy orgulloso de esta aplicación pero hace su función de enseñar como se utiliza datos insertados en la propia aplicación.
Estos datos de municipios se colocan en el directorio /res/raw ,y solo son de lectura. El fichero con la base de datos de municipios se llama municipios0.txt , debemos tener en cuenta que a la hora de utilizar los recursos internos, la extensión no se utiliza.
La base de datos la he pasado a mayúsculas y quitado los acentos. Lo he hecho debido a que la búsqueda es secuencial y lenta, además de que normalmente en los dispositivos android es lento añadir acentos y cambiar de minúsculas a mayúsculas.

Vamos a intentar explicar  este pequeño trozo de código de la función Fbuscar.
Lo primero es coger el texto del municipio a buscar y cambiarlo a mayúsculas .
  miclave=Mclave.getText().toString();       
  miclave=miclave.toUpperCase();
  Mclave.setText(miclave);  
Utilizamos try para manejar los error de abrir ficheros.
Abrimos el fichero y utilizamos un buffer para aumentar la velocidad de acceso al fichero.
  ISentrada=getResources().openRawResource(R.raw.municipios0);
   BFentrada=new BufferedReader(new InputStreamReader(ISentrada));
Leemos una por una todas las líneas del fichero.
Troceamos cada línea separando por el carácter ":" .
Si la segunda cadena que ha salido del troceo contiene la cadena a buscar miclave , se para la busqueda y se muestra.
    while ((Sentrada=BFentrada.readLine()) != null)
      {
      String SentradaT[]= Sentrada.split(":");
      if(SentradaT[2].contains(miclave)) {Mostrar(); break;}
      }
public void Fbuscar(View view)
    {        
        miclave=Mclave.getText().toString();       
        miclave=miclave.toUpperCase();
        Mclave.setText(miclave);     
        Contar();    
       
        try
        {
            if(ISentrada != null)    ISentrada.close();
            ISentrada=getResources().openRawResource(R.raw.municipios0);
            BFentrada=new BufferedReader(new InputStreamReader(ISentrada));
           
            while ((Sentrada=BFentrada.readLine()) != null)
            {
            String SentradaT[]= Sentrada.split(":");
            if(SentradaT[2].contains(miclave))         {Mostrar(); break;}
            }
           
        }
        catch (IOException e)
        {
            Log.e("Municipios->",e.getMessage(),e);
        }       
    }


Me hubiera gustado no tener que abrir y cerrar el fichero para volver a la posición inicial, pero no he encontrado la función seek(0) para recursos internos, no se si existe o no. Esto hace al programa poco eficiente, pero funciona bien :( .


PROGRAMA

Saludos
Juan Galaz


Bibliografía:
http://android.okhelp.cz/java_android_code.php?s=openRawResource
http://www.programmershare.com/1333689/

ANDROID 4: DESARROLLO DE APLICACIONES (En papel)
ISBN 9788441531970
WEI MENG LEE , ANAYA MULTIMEDIA, 2012

EL GRAN LIBRO DE ANDROID (3ª ED.) (En papel)
ISBN 9788426719768
JESUS TOMAS GIRONES , S.A. MARCOMBO, 2013


viernes, 13 de mayo de 2016

ANDROID - Cálculo bobinas núcleo de aire


Android

ANDROID
Cálculo bobinas núcleo de aire

En esta aplicación para android voy ha realizar el cálculo en micro henrios para una bobina con núcleo de aire.
Para el cálculo he empleado la formula que viene en el libro.

Handbook of electronics calculations for engineers and technicians
Milton Kaufman, Arthur H. Seidman


He visto otras formulas que se parecen, pero hay veces que mezclan el radio con el diámetro, por lo que me he decidido por esta.
Las  dimensiones deben estar en cm.

Hace años había realizado un programa en basic que luego trasladé a C para el cálculo de bobinas.


Como se ve en el nuevo, todo es mas interactivo y bonito.

Para este programa he empleado 4 SeekBar para cambiar los valores. Para cada cambio de valor se ejecuta la función de calculo() .
MBarraL = (SeekBar)findViewById(R.id.ABarraL);
MTextoL = (TextView)findViewById(R.id.A_Tlongitud);



MBarraL.setOnSeekBarChangeListener(new OnSeekBarChangeListener()
        {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)
            {
                longitud=progress+1;
                MTextoL.setText(longitud +" mm  Longitud");
                calculo();
            }
           

            @Override
            public void onStartTrackingTouch(SeekBar seekBar)                      {            }
            @Override
            public void onStopTrackingTouch(SeekBar seekBar)                      {            }           
        });


PROGRAMA

Saludos
Juan Galaz


Bibliografía:
https://danielme.com/tip-android-13-el-widget-seekbar/
http://www.jtech.ua.es/dadm/2011-2012/restringido/android/sesion03-apuntes.html

miércoles, 11 de mayo de 2016

ANDROID- WebView, Visión de páginas desde android


Android

ANDROID
WebView
Visión de páginas desde android

El poder ver páginas web, ya sean de tipo local o de internet, desde una aplicación de android permite dar mucho juego.
Mediante la utilización de WebView es muy fácil, pero muy vistoso.
activity_setaw_main.xml
<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"
    tools:context="${relativePackage}.${activityClass}" >

    <WebView
        android:id="@+id/Aweb"
        android:layout_width="317dp"
        android:layout_height="322dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true" />

</RelativeLayout>

SetawMainActivity.java
Vemos la dirección que se ve al abrir la aplicación.
package com.example.appweb;

import android.app.Activity;
import android.os.Bundle;
import android.webkit.WebView;

public class SetawMainActivity extends Activity {

    private WebView MWeb;
   
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_setaw_main);
       
        MWeb=(WebView)findViewById(R.id.Aweb);
        MWeb.loadUrl("http://seta43.duckdns.org/androhx.html");    
    }      
}

AndroidManifest.xml
Debemos cambiar los permisos para acceder a internet.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.appweb"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-permission android:name="android.permission.INTERNET" />

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="15" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".SetawMainActivity"
            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>

Visión del programa en un dispositivo físico.


Saludos
Juan Galaz


Bibliografía:
https://amatellanes.wordpress.com/2013/06/01/android-ejemplo-de-webview-en-android-parte-1/

jueves, 5 de mayo de 2016

ANDROID - ARDUINO - Programación JAVA - MAX7219 - Bluetooth - HC05 Conexión serie.


Android

ANDROID - ARDUINO
Anunciador con matriz de led controlado por android
Programación JAVA
MAX7219
Bluetooth  HC05
Conexión serie

En un montaje de electrónica, había realizado un marcador con el chip MAX7219. En este montaje el control lo había hecho utilizado un interprete de basic  en su modo trial  BASIC4Android. Me quedó las ganas de realizarlo en java, pero no había programado nunca en java. Ahora que tengo un poco de idea lo he realizado, quitándome la espina.
He de decir que ha sido difícil la programación, buscando por aquí y por allí encontré algún que otro ejemplo que me ayudo bastante. He de decir que al estar muy extendido android, existen infinidad de páginas y tutoriales que te ayuda a la programación.
El programa hace uso del bluetooth para manda los textos que se representan en la matriz de led. Utiliza la comunicación serie para transmitir la información, en el otro lado se encuentra el módulo HC05 que es un convertidor de bluetooth a serie.
En el terminal android debemos tener activado el bluetooth y emparejados los dispositivos.
Escribimos lo que queramos y lo mandamos a la matriz de caracteres.

Mediante eclipse diseñamos el interface gráfico.


activity_main.xml
<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"
    tools:context="${relativePackage}.${activityClass}" >

    <EditText
        android:id="@+id/Aentrada"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/textView1"
        android:layout_marginLeft="30dp"
        android:layout_marginTop="22dp"
        android:ems="10"
        android:focusable="false"
        android:focusableInTouchMode="false"
        android:inputType="text"
        android:text="@string/entrada"
        android:textSize="@dimen/abc_action_bar_subtitle_text_size" />

    <EditText
        android:id="@+id/Asalida"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/Aentrada"
        android:layout_below="@+id/Aentrada"
        android:layout_marginTop="26dp"
        android:ems="10"
        android:inputType="text"
        android:text="@string/salida"
        android:textSize="@dimen/abc_action_bar_title_text_size" >

    </EditText>

    <LinearLayout
        android:id="@+id/linearLayout1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/Asalida"
        android:layout_marginTop="60dp"
        android:gravity="center" >

        <Button
            android:id="@+id/Aboton1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="FunSend1"
            android:text="@string/boton1" />

        <Button
            android:id="@+id/Aboton2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="FunSend2"
            android:text="@string/boton2" />

        <Button
            android:id="@+id/Aboton3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="FunSend3"
            android:text="@string/boton3" />
    </LinearLayout>

    <Button
         android:id="@+id/Asalir"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/linearLayout1"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="34dp"
        android:onClick="FunSalir"
        android:text="@string/salir" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/Aentrada"
        android:layout_alignParentTop="true"
        android:text="@string/hello_world" />

</RelativeLayout>

También hay que modificar el ficheros AndroidManifest.xml para poder utilizar el bluetooth.
Además impedimos que rote la pantalla.
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.seta43blue"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />


    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="15" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:screenOrientation="portrait" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>



La totalidad de los fichero los he comprimido y los he colocado en el enlace que se ve al final de página.
El programa en java es largo y solo explicare algún trozo.
El programa empieza con la función onCreate donde se mira si el dispositivo android tiene bluetooth, y si lo tiene activado.
Después lanzamos una función FunConectar2 donde se realiza la conexión al dispositivo.
 protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
       
        Wentrada=(EditText)findViewById(R.id.Aentrada);
        Wsalida=(EditText)findViewById(R.id.Asalida);  
        Miblue = BluetoothAdapter.getDefaultAdapter();
                 
        if (Miblue == null)
        {
              AlertDialog.Builder dialog = new AlertDialog.Builder(this);
              dialog.setMessage("Sin soporte bluetooth");
              dialog.setCancelable(false);
              dialog.setPositiveButton("OK", new DialogInterface.OnClickListener()
                  {
                  public void onClick(DialogInterface dialog, int which)   { finish(); }                                            
                });
                dialog.show();
        }
       
        if (!Miblue.isEnabled())
        {
              AlertDialog.Builder dialog = new AlertDialog.Builder(this);
              dialog.setMessage("Activar bluetooth");
              dialog.setCancelable(false);
              dialog.setPositiveButton("OK", new DialogInterface.OnClickListener()
                  {
                  public void onClick(DialogInterface dialog, int which)   { finish(); }                                            
                });
                dialog.show();
        }
       
        AlertDialog.Builder dialog0 = new AlertDialog.Builder(this);
        dialog0.setMessage("Programa para conectar android y arduino.\nManda frases a la matriz de led.\nSETA43");
        dialog0.setCancelable(false);
        dialog0.setPositiveButton("OK", new DialogInterface.OnClickListener()
              {
              public void onClick(DialogInterface dialog, int which)   { FunConectar2(); }                                            
            });
        dialog0.show();
              
    }
La función FunConectar2 es la que realiza la conexión al dispositivo ya emparejado.
Crea un lista de dispositivos emparejados.
ArrayList <String> list = new ArrayList<String>();

Prueba a crear un createBluetoothSocket al dispositivo emparejado. Esto me creó una confusión debido a que no daba error aunque no existiese ese dispositivo, pero lo que creo que comprueba si dispone de conexión serie.
btSocket = createBluetoothSocket(device);

Prueba a crear un  btSocket.connect();  ,y si se se puede indica en pantalla ok->dirección desl dispositivo.
btSocket.connect();
Log.d(TAG, "....Conexion ok...");
Wentrada.setText("ok->" + address);

Para terminar creamos una clase donde se realiza la escritura y la lectura desde el bluetooth. ConnectedThread.
mConnectedThread = new ConnectedThread(btSocket);
mConnectedThread.start();                          

La clase ConnectedThread tiene varias funciones: la própia de creación ConnectedThread  que se inicia con start, la run que no la usamos para nuestro ejemplo, y la write utilizada para mandar la cadena.
 private class ConnectedThread extends Thread
     {
        private final InputStream mmInStream;
        private final OutputStream mmOutStream;
 
        public ConnectedThread(BluetoothSocket socket)
         {
            InputStream tmpIn = null;
            OutputStream tmpOut = null;
            try
                {
                tmpIn = socket.getInputStream();
                tmpOut = socket.getOutputStream();
                }
            catch (IOException e) { }
            mmInStream = tmpIn;
            mmOutStream = tmpOut;
         }
 
        public void run() {
           byte[] buffer = new byte[256]; 
           int bytes; 
            // Keep listening to the InputStream until an exception occurs
            while (true)
             {
                try {
                         bytes = mmInStream.read(buffer);
                         bytes=bytes+1; //No sirve para nada es para quitar aviso
                    //h.obtainMessage(RECIEVE_MESSAGE, bytes, -1, buffer).sendToTarget();     // Send to message queue 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, "...Data to send: " + message + "...");
            byte[] msgBuffer = message.getBytes();
            try
                {  mmOutStream.write(msgBuffer);  }
            catch (IOException e)
                {  Log.d(TAG, "...Error data send: " + e.getMessage() + "...");  }
        }

    }

Para termina creamos las funciones que mandan la cadena mediante la pulsación de los botones.
public void FunSend1(View view)
    {
        mConnectedThread.write(Wsalida.getText()+ "        " + "\n");
    }
public void FunSend2(View view)
    {
        mConnectedThread.write("/" + Wsalida.getText() + "\n");
    }  
public void FunSend3(View view)
    { 
        mConnectedThread.write("&"+ Wsalida.getText() + "\n");       
    }  

Perdonar si no explico muy bien los programa, estoy aprendiendo java y android.

Captura de pantalla del dispositivo físico.


PROGRAMA


Notas
Para depurar los programas  utilizamos la consola de eclipse.
  private static final String TAG = "bluetooth2";
 
Log.d(TAG, "...Conectando...");

Con el comando Log.d(TAG, "...Conectando..."); mandamos la cadena bluetooth2  ...Conectando...   a la consola android.
Para poder filtra todos los mensaje, que son muchos, configuramos de la siguiente forma:

Observamos  en la pantalla LogCat todos los mensajes que lleven la cadena bluetooth2.

Saludos
Juan Galaz


Bibliografía:
http://code.tutsplus.com/es/tutorials/create-a-bluetooth-scanner-with-androids-bluetooth-api--cms-24084
http://developer.android.com/intl/es/guide/topics/connectivity/bluetooth.html
http://www.tutorialspoint.com/android/android_bluetooth.htm
http://solderer.tv/data-transfer-between-android-and-arduino-via-bluetooth/
http://www.intorobotics.com/how-to-develop-simple-bluetooth-android-application-to-control-a-robot-remote/
http://www.instructables.com/id/Android-Bluetooth-Control-LED-Part-2/
https://examples.javacodegeeks.com/category/android/core/bluetooth/

domingo, 1 de mayo de 2016

ANDROID - Prácticas de diálogos


Android

ANDROID

Prácticas de diálogos

En esta practicas realizamos  un programa donde es muestre varios diálogos.
Creamos la pantalla principal donde se encuentran 6 botones que activarán los diferentes diálogos.



El clásico diálogo donde aparece una información(setPositiveButton).
public void FunBoton1(View view)
    {
        AlertDialog.Builder dialog = new AlertDialog.Builder(this);
          dialog.setMessage("Pueba de diálogo");
          dialog.setCancelable(false);
          dialog.setPositiveButton("OK", new DialogInterface.OnClickListener()
              {
              public void onClick(DialogInterface dialog, int which) 
                  {                 
                  dialog.dismiss();
                 }                       
            });
            dialog.show();
    }

El clásico ListView (setItems)
 public void FunBoton2(View view)
    {
        final CharSequence[] items = {"Red1", "Red2", "Red3"};
        AlertDialog.Builder builder = new AlertDialog.Builder(this); 
        builder.setTitle("Selecciona adaptador"); 
        builder.setItems(items, new DialogInterface.OnClickListener()
            {     
            public void onClick(DialogInterface dialog, int item)
                {         
                    Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show();     
                } 
        }); 
        AlertDialog alert = builder.create(); 
        alert.show();
    }


Parecido aListView (setSingleChoiceItems)
 public void FunBoton3(View view)
    {
        final CharSequence[] items = {"Red", "Green", "Blue"};         
        AlertDialog.Builder builder = new AlertDialog.Builder(this); 
        builder.setTitle("Pick a color"); 
        builder.setSingleChoiceItems(items, -1,new DialogInterface.OnClickListener()
            {     
            public void onClick(DialogInterface dialog, int item)
                {         
                    Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show();
                    alert.dismiss();
                } 
        }); 
        alert = builder.create();
        alert.show();
    }



Un cuadro de diálogo que se emplea para informar que se debe esperar mientras se está ejecutando algo. (ProgressDialog)
En este caso hago una espera de 2 segundos.
public void FunBoton4(View view)
     {
        final ProgressDialog MIdialog = ProgressDialog.show(MainActivity.this, "Dialogo","Espera 2 segundos...", true);
        new Thread()
            {
              public void run()
              {
                try { sleep(2000);  }
                catch (Exception e)    {  }
                MIdialog.dismiss();
              }
            }.start();       
     }


Un cuadro de diálogo donde indica el progreso en una barra.(ProgressDialog).
public void FunBoton5(View view)
    {       
        MiDialogo = new ProgressDialog(MainActivity.this); 
        MiDialogo.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
        MiDialogo.setMessage("Loading..."); 
        //MiDialogo.setCancelable(false);
        MiDialogo.setCancelable(true);
        MiDialogo.show();                  
        MiDialogo.setProgress(25);            
    }



Esto no es un diálogo, pero necesitaba representar ProgressBar y he creado un contador de cuenta atrás mediante la clase MyCountDownTimer.
He añadido un sonido cuando termina la cuenta atrás.
public void FunBoton6(View view)
    {
        if (!timerHasStarted) {
                countDownTimer.start();
                timerHasStarted = true;
                miText.setText("STOP");
            } else {
                countDownTimer.cancel();
                timerHasStarted = false;
                miText.setText("RESTART");
            }
    }
      
    //Cuenta atras
    public class MyCountDownTimer extends CountDownTimer
   {
        public MyCountDownTimer(long startTime, long interval)
                {
                       super(startTime, interval);
                }         
              @Override
        public void onFinish() {
                  miText.setText("Cuenta terminada!");
                  toneG.startTone(ToneGenerator.TONE_DTMF_S, 2000);
              }
              @Override
        public void onTick(long millisUntilFinished)
              {
                 int i;
                  miText.setText( " " + millisUntilFinished/100 );
                  i=(int)millisUntilFinished ;
                  i/=100;
                  miBarra.setProgress(i);
              }
     }


Como vemos en todos los diálogos que he creado el nombre de las distintas opciones las he creado en el propio programa java.
Para una mejor internacionalización deberíamos crear todas las cadenas en el fichero "strings.xml" , pero para este caso sirve.
Ejemplo de como se debería hacerse en el modo de strings.xml.
 res/values/strings.xml: En la aplicación (java)
<?xml version="1.0" encoding="utf-8"?>
<resources>
   
<string-array name="planets_array">
       
<item>Mercury</item>
       
<item>Venus</item>
       
<item>Earth</item>
       
<item>Mars</item>
   
</string-array>
</resources>
Resources res = getResources();
String[] planets = res.getStringArray(R.array.planets_array);

PROGRAMA

Saludos
Juan Galaz


Bibliografía:
http://www.edu4java.com/es/androidlibro/mostrar-dialogo-android.html
http://devtroce.com/2012/01/19/mensajes-de-dialogo-popup-alertdialog/
http://www.tutorialandroid.com/medio/como-programar-una-rueda-de-espera-progressdialog/
http://developer.android.com/intl/es/guide/topics/resources/string-resource.html
http://developer.android.com/intl/es/samples/MediaRouter/res/values/arrays.html