# Aplicación en AppInventor para sustituir un teclado y un display



## Scooter (Nov 29, 2014)

_No tengo muy claro si esto debe de ir como aporte o en otro sitio, si no es este su sitio, algún amable moderador que lo cambie._

Adjunto una aplicación en AppInventor para Android que emula un display y un teclado hexadecimal conectandose a un microcontrolador con el típico modulito bluetooth.

*Instrucciones:*
Previamente hay que emparejar el módulito bluetooth con el teléfono/tablet.

Al abrir el programa lo primero que pregunta es con que dispositivo de la lista que dispone el teléfono como emparejados queremos comunicar, lo seleccionamos y ya está, aparece una pantalla con un teclado y un display.
Para cortar la conexión bluetooth basta con cerrar la aplicación.

La cadena que pasemos de una vez por la uart+bluetooth aparecerá en el "display", si se vuelve a enviar se "pisa" el contenido anterior.
Cada tecla que pulsemos envía por la uart su  caracter ascii.
En el lado del microcontrolador hay que determinar que se hace con todo eso. Esto es un "terminal tonto" pero que muy tonto.

Está disponible la aplicación .apk y el archivo "fuente" .aia para que lo edite quien quiera, eso si, pediría al que haga algo interesante sobre esta base que lo comparta también en este foro.

Mas cosas; el programa me ha dado una guerra increíble porque según en que dispositivo android el tema del bluetooth se comporta diferente, en unos me da problemas cuando transmito que no vacía el buffer y en otros cuando recibo, así que puede que no le funcione a todo el mundo.


----------



## proteus7 (Nov 30, 2014)

checando tu apk estoy viendo que, una vez que activas el timer y el cual genera la interrupcion  no lo desactivas y tal vez por eso te de problemas,  entonces intenta desactivarlo cuando atiendas la interrupcion, y una vez que termines vuelves a reactivar el timer, porque si no lo desactivas va a estar desbordando continuamente.  (no se si con eso se solucione tu problema)


----------



## Scooter (Nov 30, 2014)

Si lo desactivas dejas de recibir datos.
No desborda porque 10ms es una eternidad, antes estaba a 100 que es mas tiempo y va igual de mal.

En algunos android lo que falla es el envío de cadenas; es como si se quedase esperando un ACK o algo así que nunca llega. Por ejemplo envías "1" y la aplicación se queda parada hasta que da error, aceptas y a continuación envías "2" pero lo que envía en realidad envías "12" porque se cree que el 1 no fue recibido. La aplicación va igual de mal si se elimina por completo la interrupción y todo el código de recepción.

Respecto a la recepción, en unos casos llega la cadena toda junta y en otros teléfonos llega a trozos, por eso la junto toda en una variable antes de ponerla en la etiqueta que hace de pantalla. Eso ahora va bien en todos.

Ahora mismo iba a probar a cambiar el control bluetoothClient por BluetoothServer, a ve si es que el modulito es client y dos clients no se hablan bien según que tipo de stack bluetooth tenga el teléfono. Edito, pues no, parece que bluetooth server es para responder si se conectan desde el otro lado y no es el caso.


----------



## Scooter (Dic 5, 2014)

He seguido probando la aplicación en mas dispositivos y en algunos va y en otros no. Debe de ser el driver o stack bluetooth de cada uno según como esté implementado. 
Será cuestión de que lo pruebe cada uno a ver si va o no va.


----------



## washington14 (Ene 17, 2015)

alguien que me pueda ayudar: como hago para enviar una cadena de caracteres con su respectivo RETORNO DE CARRO (ENTER) en app inventor..


----------



## proteus7 (Ene 17, 2015)

washington14 dijo:


> alguien que me pueda ayudar: como hago para enviar una cadena de caracteres con su respectivo RETORNO DE CARRO (ENTER) en app inventor..


  y la imagen que subiste que tiene o que  falla?  pues como la veo envias lo q hay en texbox y despues el enter


----------



## Scooter (Ene 17, 2015)

En la cadena enlaza lo que quieras y después el caracter ascii 13


----------



## washington14 (Ene 17, 2015)

gracias por contestar. me pregunto si alguien tiene otra forma de  concatenar la cadena de caracteres con un acci13 al final.

en la imagen que les mostre anteriormente no funciona solo llega el caracter acci13 y nada de cadenas.


----------



## Scooter (Ene 18, 2015)

En las funciones de cadenas hay un bloque para unir cadenas. Pones la cadena en si en uno de los enganches y un bloque de convertir a ASCII en el otro


----------



## washington14 (Ene 18, 2015)

muy bueno tu planteamiento pero no encuentro la forma de comvertir el numero 13 en ascii
para luego concatenarlos. o tal vez haya una función que comviarta los numero en ascii que no lo encuentro por ningun lado ,,,


----------



## Scooter (Ene 21, 2015)

Esta mañana lo he probado con otro módulo bluetooth y si que funciona en todos los dispositivos, uno dice que es BTBoard 1.05 el que va a según el teléfono y el 1.06 si que va





washington14 dijo:


> muy bueno tu planteamiento pero no encuentro la forma de comvertir el numero 13 en ascii
> para luego concatenarlos. o tal vez haya una función que comviarta los numero en ascii que no lo encuentro por ningun lado ,,,


Me parece que tienes que poner _"La cadena que quieras \n"_ o \r directamente sin unir nada.


----------



## washington14 (Ene 21, 2015)

gracias por responderr. asunto solucionado lo he enviado el numero 13 como byte y si llegan las cadenas.
he utilizado la función SendByteNumer de app inventor.


----------



## Scooter (Ene 22, 2015)

Prueba con \n, quedará mas limpio


----------



## unifim (Sep 23, 2015)

washington14 dijo:


> gracias por responderr. asunto solucionado lo he enviado el numero 13 como byte y si llegan las cadenas.
> he utilizado la función SendByteNumer de app inventor.



amigo puedes mostrar los bloques que usaste para enviar la cadena, necesito enviar el valor de un slider a un pic y recibirlo con la funcion gets, pero aun no logro como enviar con la tecla enter  muestro la imagen del bloque slider que estoy tratando de enviar


----------



## proteus7 (Sep 24, 2015)

unifim dijo:


> amigo puedes mostrar los bloques que usaste para enviar la cadena, necesito enviar el valor de un slider a un pic y recibirlo con la funcion gets, pero aun no logro como enviar con la tecla enter  muestro la imagen del bloque slider que estoy tratando de enviar



checa estos nloques


----------



## ilcapo (Dic 12, 2015)

Hola como estan !  
tengo varias dudas con el App inventor, les comento de a una para no ser tan pesado XD! 

la primera es: si enviamos desde la App un numero ( NO una letra ) al pic ,  se puede recibir con la funcion  getc()  ???  o es solo para recibir char ?


----------



## Scooter (Dic 13, 2015)

Entonces tu duda no es de appinventor, es del compilador de c del pic


----------



## ilcapo (Dic 13, 2015)

pero el App Inventor envia el numero como char o como int ?


----------



## Scooter (Dic 13, 2015)

Creo que eso es intrascendente. Appinventor o cualquier otro, envía lo que tu le digas que envíe. Siempre son bytes en binario puro. Lo que luego hagas tu con esos bytes es asunto tuyo.
Ya no me acuerdo de como lo hice, me parece que es el valor asccii de la tecla lo que envía, un sólo byte.


----------



## ilcapo (Dic 13, 2015)

bueno si, será cuestion de probarlo yo tambien supongo que envia el valor ascii pero no estoy seguro por eso les consultaba a ustedes que tienen mas experiencia. 

Y suponiendo que nosotros enviemos un 123(ciento veintitres) y entonces el App Inventor envie el valor ascii que seria: 49-50-51   

lo recibimos en el pic con la funcion getc()   

y lo guardamos en un INT o en un CHAR ? 

char=getc()

int=getc() 

Como que veo que hay algo raro pero tampoco puedo explicarlo bien, espero que se entienda un poco mi duda gracias !


----------



## D@rkbytes (Dic 13, 2015)

No es lo mismo que envíes el número 123 como entero, que como una cadena.
Cada carácter tiene el tamaño de un byte.

Entonces tienes que formatear lo que quieras enviar y recibirlo de igual forma.
Si envías el 123 como byte, enviarías un "{" de la tabla ASCII.

En decimal, el carácter "1" de la tabla ASCII equivale al 49, al recibir le das formato y lo interpretas como quieras.


----------



## ilcapo (Dic 13, 2015)

Ah gracias darkbites creo que ya voy entendiendo 

me fijé en el App inventor que hay una funcion para enviar mas de un byte al mismo tiempo 

pero el pic los va a recibir ? o solo podré guardar uno ? y el resto se van a perder ? 

o como podria hacer para guardarlos por ejemlo a 3 bytes  (123) 

creo que por aca esta el problema de Scooter que comentaba que a veces no recibia los datos


----------



## D@rkbytes (Dic 13, 2015)

Con *gets(string);* puedes recibir toda la cadena hasta que termine con "*\r*" (13 = Carrriage Return)
Si vas a recibir 10 bytes, creas un arreglo con 11: *char cadena[11];
*Después la puedes concatenar, convertir, comparar, o usar cada byte por separado*.
*


----------



## Scooter (Dic 13, 2015)

En este caso lo que se recibe es lo mismo que si se pulsa en un teclado, es decir: un '1', "media hora después" un '2' y así sucesivamente.
Yo lo guardaba en un buffer de tan sólo tres bytes y cuando se recibía la tecla "intro" se leía el buffer. Eso con un teclado de verdad en CM.
Con este sistema hay dos posibilidades:
Uno ese mismo, que es el que usa este programa de appinventor ya que conforme pulsas teclas 'escupe' los datos.
Otro generar la cadena en el tablet y enviarla entera y editada con una tecla "send" o algo así. Eso es lo que hace el terminal de arduino


----------



## ilcapo (Dic 13, 2015)

en CCS solo veo que estan disponibles las funciones: 

getc(), getch() y getchar()

alguna es equivalente a  gets() ?  

Sinó como se puede hacer para recibir la cadena ? aca estamos perdiendo datos!



HOla Scooter si yo me referia siempre a enviar "de una" varios numeros desde el App Inventor por ejemplo el numero 123


----------



## D@rkbytes (Dic 13, 2015)

ilcapo dijo:


> En CCS sólo veo que están disponibles las funciones:
> 
> getc(), getch() y getchar()
> 
> ¿Alguna es equivalente a  gets()?


*
gets(string); *es una instrucción nativa de PIC C Compiler de CCS.



			
				La ayuda de PIC C Compiler dijo:
			
		

> *gets()*, *fgets()*


​


----------



## ilcapo (Dic 13, 2015)

Por eso digo que hay que ir a la ayuda del CCS y no a lo que encontras por internet !  <-- kiko !

bueno con toda esta info ya se puede arrancar a verificar la transmicion de datos del App inventor.  Si Scooter tiene ganas y tiempo de hacer una App que envie numeros y un programa en ccs que los reciba,bien simple, seria mucho mas rapido (asi lo "debuggeamos" paso a paso para ver que esta mandando el App inventor) , sinó esperenme unos dias a que aprenda a usar el App inventor y hago un programita y lo subo 

creo que en la transmicion y/o recepcion de los datos esta el problema de Scooter y no en Android ( esas cosas las hacen personas inteligentes, yo digo siempre que cuando algo no esta funcionando bien o falla es por culpa mia XD, y en el 100% de los casos tenia razon ! )


----------



## Scooter (Dic 13, 2015)

Si, vale. Me apunto.

Ya no tengo problemas: el bluetooth versión 1.05 fallaba en algunos dispositivos. El 1.06 va fenómeno en todos los que he probado.

¿Que quieres? ¿Un terminal bluetooth? Ya hay media docena en al market, pero podemos hacer uno más.

Se puede poner una etiqueta o cuadro de texto con el texto que va entrando y un cuadro de texto con un botón "enviar" para lo que va saliendo


----------



## Scooter (Dic 13, 2015)

Bueno, he hecho una modificación a la aplicación.
Ahora tiene una "pantalla" que es un cuadro de texto en la que aparece lo que se recibe como hacía antes. Hay que enviar todo de golpe ya que si se envía en dos se borra y vuelve a empezar.
Cuatro teclas F1, F2, F3 y Enviar
Un cuadro de texto en el que escribir lo que se quiere enviar.

Al pulsar enviar se envía el contenido del cuadro de texto.

F1, 2 y 3 son configurables con lo que queramos. Ponemos el texto que se quiera en el cuadro de texto y se mantiene pulsada la tecla que se desee, entonces esa Fn enviará cada vez ese texto.

Probadlo y me contáis.


En principio todo esto es para mandar cadenas ascii, si queremos mandar números en float o lo que sea habría que pensar como va la cosa. Ahora mismo se envían los números como cadenas.


----------



## ilcapo (Dic 13, 2015)

Ok muchas gracias scooter apenas tenga unos ensayos subo las imagenes !


----------



## Scooter (Dic 14, 2015)

Bueno, a las Fn se les puede configurar la cadena que envían, pero su etiqueta sigue siendo Fn, si queréis cambiarlo, lo vemos.


----------



## ilcapo (Dic 14, 2015)

D@rkbytes dijo:


> Con *gets(string);* puedes recibir toda la cadena hasta que termine con "*\r*" (13 = Carrriage Return)
> Si vas a recibir 10 bytes, creas un arreglo con 11: *char cadena[11];
> *Después la puedes concatenar, convertir, comparar, o usar cada byte por separado*.
> *



hola Darkbites, puede ser que nunca me llegue el retorno de carro ? 
estoy debugeando y recibo bien los datos, pero el programa nunca sale de la función gets(string) 

no tendria que salir sola ? o le tengo que enviar un retorno de carro desde la aplicacion ?


----------



## D@rkbytes (Dic 14, 2015)

Siempre es necesario enviar el retorno de carro al final de la cadena, de otra manera la función no retorna.
Eso es lo que espera gets() para que retorne la cadena completa dentro del arreglo. (Sin el char 13)


----------



## Scooter (Dic 14, 2015)

Yo no estoy mandando retorno de carro. Luego lo modifico o le pongo un check para incorporar el retorno de carro.
¿Solo el 13?
¿O 10+13 como en güindos?


----------



## D@rkbytes (Dic 14, 2015)

Únicamente el Retorno de Carro (Char 13) sin el Line Feed (Char 10)


----------



## ilcapo (Dic 14, 2015)

el \n  funciona pero el \r no  ( lo toma por separado y guarda la barra y el r ) 

alguna otra secuencia de escape que reemplace el \r ?



estoy probando las secuencias de escape \...   mandarlas desde la App para que las reconozca el gets(string) . Por ahora solo me reconoce \n  

que raro !    a lo mejor el App inventor tiene algun tipo de programacion diferente para enviarle las secuencias de escape ?  PHP ? o no se ya no se que pensar ja


----------



## Scooter (Dic 14, 2015)

Actualizado.
Ahora además hay dos checkbox para añadir un CR \r y/o un LF \n a voluntad a cualquier envío por el puerto blutúz.

Bueno, entre otras averiguaciones podemos ver que hace cada cosa que si \n o \r...


----------



## ilcapo (Dic 14, 2015)

Hola Scooter como lograste hacer funcionar el \r ?  estoy luchando con eso desde hace varias horas !

Yo envio un string desde el App Inventor , lo tomo con el gets(string), pero nunca logro que salga del gets()    

pudiste enviar un string con retorno de carro para salir de un gets ()  ???  


saludos!


----------



## D@rkbytes (Dic 14, 2015)

Espero que no estés mandando el CR así "\r". Eso es para lenguaje C.
Lo que tienes que enviar es carácter 13 cómo ASCII.

Por ejemplo, en Visual Basic se manda así:
cadena = "esta es una cadena" & vbCr
O de ésta otra forma:
cadena = "esta es una cadena" & Chr(13)

En AppInventor no sé cómo se conviertan los números a ASCII, porque uso B4A (Basic For Android)


----------



## Scooter (Dic 15, 2015)

He puesto añadir \r o \n según el check que marques. Se supone que appinventor reconoce esa secuencia. Eso dice la documentación.
De cualquier modo he puesto el código fuente, así que lo podéis editar a vuestro gusto.


----------



## Scooter (Dic 15, 2015)

ilcapo ¿Te refieres en el lado del microcontrolador o en el del appinventor?
En el microcontrolador simplemente miraba si era 13 y si no lo era lo "tiraba" dentro del buffer fifo


----------



## ilcapo (Dic 15, 2015)

D@rkbytes dijo:


> Espero que no estés mandando el CR así "\r". Eso es para lenguaje C.
> Lo que tienes que enviar es carácter 13 cómo ASCII.
> 
> Por ejemplo, en Visual Basic se manda así:
> ...




Hola Darkbites, si lo estaba mandando  asi: \r   , donde podré buscar como enviar CR desde el App inventor ?



Scooter dijo:


> ilcapo ¿Te refieres en el lado del microcontrolador o en el del appinventor?
> En el microcontrolador simplemente miraba si era 13 y si no lo era lo "tiraba" dentro del buffer fifo




Hola Scooter puedes colocar el programa en C para chequear el 13 ? 
a mi nunca me llega ese numero  

gracias


----------



## Scooter (Dic 15, 2015)

No; nunca he programado un pic en c.


----------



## ilcapo (Dic 16, 2015)

y en que lo haces ?


----------



## Scooter (Dic 16, 2015)

No uso pics. O 8052 en ensamblador o arduinos en wiring


----------



## ilcapo (Dic 16, 2015)

y como verificaste en assembler o wiring  que llegue el \r ?


----------



## Scooter (Dic 16, 2015)

Para 8052 se activa la interrupción por puerto serie y cada vez que se activa se hace más o menos:

Mov a,sbuf
Cjne a,#13. ; salto a seguir
...aquí se hace lo que sea

Seguir: mov num1,num2
Mov num2,num3
Mov num3,a
Reti
; esto hace de minipila fifo de tres caracteres. Para más mejor usar punteros y ponerlo en la memoria externa.

Si te interesa mucho busco el código de verdad


En wiring no me acuerdo, me suena que ll hace el solito con alguna función. Como básicamente me dedico a hacer corta-pegas de los códigos de otros la mitad de las veces ni se que hago, sólo se que funciona.


----------



## ilcapo (Dic 17, 2015)

Voy a seguir probando en C, es raro que no funcione, a lo mejor el bluetooth esta tirando datos basura y generan problemas, gracias de todos modos


----------

