Autor Tema: Duda con modulo bluetooth HC 06  (Leído 2088 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado ElComandanteFort

  • PIC10
  • *
  • Mensajes: 13
Duda con modulo bluetooth HC 06
« en: 17 de Noviembre de 2016, 22:18:20 »
Quiero hacer lo siguiente mediante  la app Lutooth terminal quiero dar el porcentaje de potencia = 0-100 que seria el VALOR que yo doy
Este es mi programa que por PWM(T=20ms) regula la potencia todo depende de la variable VALOR pero lo que he visto que solo trabajan con el blueterm con caracterer : a, b,c
saben si puedo dar numero ejemplo en mi caso seria porcentajes de 0al 100   :  50 ,60 ,70 , 100, 5 %
como debo definir la variable VALOR ? para que el numero que yo le entre en la app sea el mismo que se guarde ene el programa
void main ()
{
int th,tl,porcentaje;
lcd_init();                                    // Inicia LCD
lcd_putc(" Control de vel.\n");          // Saca texto
lcd_putc(" de un motor DC");               // Saca texto
delay_ms(2000);
lcd_putc("\f");                             // Limpia pantalla
lcd_putc("Potencia\n");          // Saca texto
lcd_putc("  Duty= ");                      // Saca texto

lcd_gotoxy(14,2);                       // Acomoda cursor LCD
lcd_putc("%");
while(1)
    {

    //********************************************************//
   
             valor = getc();         
       
   
    th=valor*200;   
     
    tl=20000-th;
     porcentaje=valor;
   
   
    output_high(pin_b0);
   
    delay_us (th);
    output_low(pin_b0);
    delay_us (tl) ;
   
    //**********************************************************//
    printf(lcd_putc,porcentaje);   
   
    }
}
 
Basta chicos

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Duda con modulo bluetooth HC 06
« Respuesta #1 en: 18 de Noviembre de 2016, 01:56:54 »
Depende como te lo envia el receptor de bluetooth, si lo hace por UART, lo mas seguro que te lo envie en ASCII, Si te lo envia en ASCII y tenes el numero 56, te llegaria el '5' y luego el '6', pero el '5' ese es en realidad 53 en decimal. y el '6' es 54

Vos tendrias que tomar los 2 valores y pasarlos a decimal. Esto si te lo envia como ASCII.

Deberias probar como te estan llegando los datos al PIC primero.

Desconectado ElComandanteFort

  • PIC10
  • *
  • Mensajes: 13
Re:Duda con modulo bluetooth HC 06
« Respuesta #2 en: 18 de Noviembre de 2016, 12:14:17 »
Uff man porfa ayudame no entiendo eso del ascii
Basta chicos

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Duda con modulo bluetooth HC 06
« Respuesta #3 en: 18 de Noviembre de 2016, 14:35:49 »
Te explico. La UART es un modulo de transmision serial. Vas a ir recibiendo bit a bit los datos. Cuando llegaron 8, ya podes leer lo que llego.

A vos lo que te llegan son caracteres, pensalo como si fueran letras. Esas letras tiene un valor decimal.
Si recibis:

"Hola"

Entonces recibis 4 datos ( de 8 bits cada uno ), el primero es una 'H', luego una 'o', luego una 'l', luego una 'a'. ¿ Como haces para poner una letra dentro de un registro de 8 bits ?, Si lo unico que podria representar 8bits son numeros de 0 a 255?.

Es ahi donde uno usa una tabla de codificacion ASCII (busca Tabla ASCII en google), esta tabla dice que si vos recibis un numero 72 decimal o 0x48 en hexadecimal, en realidad te enviaron una 'H'.

Entonces a tu UART estarian llegando los valores ( en hexadecimal):

0x48, 0x6f, 0x6c, 0x61

Lo mismo ocurre con tu numero, si el modulo te envia "72" vos recibis 2 datos, el '7' y el '2', es decir primero llega

0x37 y luego 0x32.


El getc, va a tomar solo el 1ro de esos datos. Y lo va a poner en "valor", siguiendo el ejemplo en el que llega un "72".
Llega el '7' en valor se guardaria el numero 0x37 (55 en decimal),
calculas th con el valor 55,

55 * 200 = a mucho

Encima th es un numero de 8bits ( int ), por lo cual no va a poder almacenar ese resultado, ya que su rango es de 0 a 255.
tl ya te da mal. Otro donde si restas 0, es imposible que guardes 20000, donde solo puede entra como maximo 255
Imprime cualquier cosa en el LCD Y pregunta si recibio otro dato. Lo cual si, recibio el 0x32 del '2', o en decimal el 50.
Termina ocurriendo todo lo demas.


Lo que vos tendrias que buscar hacer es tomar los datos de la UART, restarles 0x30 ( ya que 0x30 es '0' ). Una ves restado verificar que sea un numero, es decir que no supere los 9. Ya con esto hay que ubicar cual es la decena y las unidades.
Si siempre se envian 2 datos. Sabemos que el primero son las decenas, asi que multiplicamos ese numero por 10 y guardamos en una variable ( valor ).
Antes de proceder a hacer otros calculos, espermos las unidades,, restamos 0x30, comprobamos que NO sea mayor a 9, y sumamos eso a la variable (valor ).

Ahi lo que hicimos fue con el primer dato convertirlo a 70, y el segundo dato en 2, asi que la suma quedaria en un numero decimal que es 72.

Ya ahi podes operar con ese dato, obviamente usando al menos int16, en ves de int.

Desconectado ElComandanteFort

  • PIC10
  • *
  • Mensajes: 13
Re:Duda con modulo bluetooth HC 06
« Respuesta #4 en: 18 de Noviembre de 2016, 19:01:07 »
Te explico. La UART es un modulo de transmision serial. Vas a ir recibiendo bit a bit los datos. Cuando llegaron 8, ya podes leer lo que llego.

A vos lo que te llegan son caracteres, pensalo como si fueran letras. Esas letras tiene un valor decimal.
Si recibis:

"Hola"

Entonces recibis 4 datos ( de 8 bits cada uno ), el primero es una 'H', luego una 'o', luego una 'l', luego una 'a'. ¿ Como haces para poner una letra dentro de un registro de 8 bits ?, Si lo unico que podria representar 8bits son numeros de 0 a 255?.

Es ahi donde uno usa una tabla de codificacion ASCII (busca Tabla ASCII en google), esta tabla dice que si vos recibis un numero 72 decimal o 0x48 en hexadecimal, en realidad te enviaron una 'H'.

Entonces a tu UART estarian llegando los valores ( en hexadecimal):

0x48, 0x6f, 0x6c, 0x61

Lo mismo ocurre con tu numero, si el modulo te envia "72" vos recibis 2 datos, el '7' y el '2', es decir primero llega

0x37 y luego 0x32.


El getc, va a tomar solo el 1ro de esos datos. Y lo va a poner en "valor", siguiendo el ejemplo en el que llega un "72".
Llega el '7' en valor se guardaria el numero 0x37 (55 en decimal),
calculas th con el valor 55,

55 * 200 = a mucho

Encima th es un numero de 8bits ( int ), por lo cual no va a poder almacenar ese resultado, ya que su rango es de 0 a 255.
tl ya te da mal. Otro donde si restas 0, es imposible que guardes 20000, donde solo puede entra como maximo 255
Imprime cualquier cosa en el LCD Y pregunta si recibio otro dato. Lo cual si, recibio el 0x32 del '2', o en decimal el 50.
Termina ocurriendo todo lo demas.


Lo que vos tendrias que buscar hacer es tomar los datos de la UART, restarles 0x30 ( ya que 0x30 es '0' ). Una ves restado verificar que sea un numero, es decir que no supere los 9. Ya con esto hay que ubicar cual es la decena y las unidades.
Si siempre se envian 2 datos. Sabemos que el primero son las decenas, asi que multiplicamos ese numero por 10 y guardamos en una variable ( valor ).
Antes de proceder a hacer otros calculos, espermos las unidades,, restamos 0x30, comprobamos que NO sea mayor a 9, y sumamos eso a la variable (valor ).

Ahi lo que hicimos fue con el primer dato convertirlo a 70, y el segundo dato en 2, asi que la suma quedaria en un numero decimal que es 72.

Ya ahi podes operar con ese dato, obviamente usando al menos int16, en ves de int.
Gracias mas osea debo enviar el numero que quiero de 1 en 1 osea si quiero meter un 92% de potencia debo meter primero un 9 luego un 2 o si quiero un 8% debo primero meter un 0 luego un 8 pero lo del th y tl no creo que haya problema ya que el rango del int es hasta 65000 aprox
Basta chicos

Desconectado ElComandanteFort

  • PIC10
  • *
  • Mensajes: 13
Re:Duda con modulo bluetooth HC 06
« Respuesta #5 en: 18 de Noviembre de 2016, 19:06:40 »
Depende como te lo envia el receptor de bluetooth, si lo hace por UART, lo mas seguro que te lo envie en ASCII, Si te lo envia en ASCII y tenes el numero 56, te llegaria el '5' y luego el '6', pero el '5' ese es en realidad 53 en decimal. y el '6' es 54

Vos tendrias que tomar los 2 valores y pasarlos a decimal. Esto si te lo envia como ASCII.

Deberias probar como te estan llegando los datos al PIC primero.
Que clase de variable debo debe ser ? float , char ,int ?
Basta chicos

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Duda con modulo bluetooth HC 06
« Respuesta #6 en: 18 de Noviembre de 2016, 19:41:10 »
Citar
Gracias mas osea debo enviar el numero que quiero de 1 en 1 osea si quiero meter un 92% de potencia debo meter primero un 9 luego un 2 o si quiero un 8% debo primero meter un 0 luego un 8 pero lo del th y tl no creo que haya problema ya que el rango del int es hasta 65000 aprox

Si envias el "92", como es serial va a llegar primero el '9', y luego el '2', es decir van a llegar a tu PIC SIEMPRE de 1 en 1. Vos tendrias que esperar 2 datos, y luego recien alli operar sobre estos.

El int en el compilador CCS es de 8bits. O es igual que poner int8, si quisieras 16 bits usarias long o int16

--------------------------------

Respecto a como solucionarlo tenes varias opciones, la primera:

Tal ves lo que buscas vos es usar gets()
El gets() recibe y guarda hasta que llega un 0x0D o retorno de carro

De esa forma envias "92\r" el \r es retorno de carro en C. Y en el array te guardaria esos valores, deberias tener un array del tipo char como minimo de 4 lugares.

Luego trabajas con eso o podes usar la funcion atoi para pasarlo a un numero entero.

-------------------------------

La otra es si queres, tratar de enviar 1 solo dato que seria lo que queres hacer, en el que se envie el valor en un solo byte, y no como un string o letras. Y tu codigo serviria asi como esta.
Que es lo que te recomienda Pinolillo aca:

http://www.todopic.com.ar/foros/index.php?topic=47029.msg392283#msg392283
« Última modificación: 18 de Noviembre de 2016, 19:43:59 por KILLERJC »


 

anything