Comunicación entre módulo bluetooth y un microcontrolador PIC

pues digamos que tenemos un ARRAY o STRING

char *cadena="pajaro";

la cadena mide la longitud mas el caracter nulo

yo diria que si haces una funcion de enviar un caracter digo CCS envia un caracter con putc();

lo que debes hacer es meterlo dentro de un while cuando encuentre nulo

while(cadena!='\0')
{
//funcion para enviar 1 byte
//podria ser putc(); o enviar directamente con el registro UART
i++;
}


Discúlpas TRILO-BYTE, creo que por cansancio mental (48 hrs, despierto), no analice bien tu código. Lo probaré porque parece seguir mí lógica, o más bien la idea. Gracias a los demás igualmente, probare.

/***Actualización***/

Probé lo siguiente, siguiendo claro la recomendación de TRILO-BYTE,

Código:
char *mensaje="HOLA", i=0;
/*********************************************/
[B]while[/B](1) {
[B]if[/B](TRMT==1 && segundo>=1) { //Si el registro de envió esta vació, entonces cada segundo
[COLOR="Blue"]i=0;[/COLOR]
[B]while[/B](mensaje[i]!='\x00') { //Envía la palabra HOLA,
TXREG=mensaje[i];
[COLOR="blue"]i++;[/COLOR]
} [B]while[/B](!TRMT); //Espera que se vacié el registro de envió y,
second=0; //resetea el delay mediante TMR0.
}
}

Pero solo envía la primera y ultima letra ("HA") cada segundo. Tendré error de sintaxis? Solo coloque el código de TRILO-BYTE por la librería UART_Write();
Seguiré probando pero si alguien tiene un consejo, es bienvenido :)

/***Actualización***/

Observe que si iniciaba la variable i=1; el mensaje ahora es "OA", osea, el contador ascendente se salta dos estados.
 
Última edición:
D@rkbytes, mejor des instalé todo, mmmm:unsure::unsure: hrabría forma de que alguien lo tuviera y me lo facilitara? :) :) :)
 
bueno vamos a ver dijo un ciego:

Código:
char *mensaje="HOLA"; //recuerda que acaba en caracter nulo en realidad son 5 letras
char i=0;


/*********************************************/
while(1) {


i=0;

while(mensaje[i]!=[B][COLOR="Red"]'\0'[/COLOR][/B]) //mientras no sea caracter nulo hara lo que tenga que hacer

{ //Envía la palabra HOLA,

if(TRMT==1 && segundo>=1) 
{ //Si el registro de envió esta vació, entonces cada segundo

TXREG=mensaje[i];
//[B]esto va dentro del ciclo while por que si no lo metes solo eviara la primer o ultimo byte[/B]

}while(!TRMT); //Espera que se vacié el registro de envió y,
second=0; //resetea el delay mediante TMR0.

i++;
} 

}


bueno en CCS seria casi lo mismo se veria mas o menos asi:

char *mensaje="HOLA"; //recuerda que acaba en caracter nulo en realidad son 5 letras
char i=0;


/*********************************************/
while(1) {

i=0;

while(mensaje!='\0') //mientras no sea caracter nulo hara lo que tenga que hacer

{ //Envía la palabra HOLA,


putc(mensaje);


i++;
}

}

asi mismo y mero se veria el codigo
 
Última edición:
Hola que tal, estoy programando un pic 16f684 con comunicación serial utilizando RS-232, pero tengo algunos problemas en la parte física ya que en proteos y un puerto serial funciona, he visto algunos consejos y códigos para este tipo de conexiones pero no funciona, he cambio mi código varias veces y este es el último que me quedo, espero me puedan apoyar.
 

Adjuntos

  • PTOGRAMA.txt
    846 bytes · Visitas: 6
if(kbhit()) debe ir dentro del bucle principal y a continuación obtener los datos con getc.
kbhit() en CCSC Help dijo:
If the RS232 is under software control this function returns TRUE if the start bit of a character is being sent on the RS232 RCV pin.
If the RS232 is hardware this function returns TRUE if a character has been received and is waiting in the hardware buffer for getc() to read.
This function may be used to poll for data without stopping and waiting for the data to appear.
Note that in the case of software RS232 this function should be called at least 10 times the bit rate to ensure incoming data is not lost.
 
Buen día estimada comunidad, esperando que se encuentren bien :).

Tengo un problema al encender un LED vía Bluetooth, comandado con un PIC 16F628a Maestro.

Para la realizar los ajustes de los comandos AT se utilizó el dispositivo CP210x (USB to UART) o (USB - TTL)

Para la configuración del Bluetooth lo primero es establecer el dispositivo Esclavo: // antes de conectar el dispositivo USB a la computadora presiona el botón o key del Bluetooth.
  1. Conectar el cableado con CP210x al Bluetooth // Imagen con los detalles más abajo.
  2. Conectar a la computadora y buscar el puerto COM en administrador de dispositivos. // La configuración la realice en Windows XP. Windows 10 me dio problemas.
  3. Se abre el Arduino y buscamos la pestaña "herramientas" y verificamos que el puerto COM sea el mismo que el administrador de dispositivos.
  4. Una vez configurado el puerto con Arduino, entramos nuevamente a la pestaña herramientas y seleccionamos la ventana "Monitor Serie".
  5. Recuerda configurar los baudio a 38400 // Imagen con los detalles más abajo.
  6. En la pantalla colocamos AT y enter.
  7. Si te sale OK es por que está listo para configurar el AT.
Configuración del Esclavo:
  1. Mantener presionado el botón o key antes de conectar // Esto se realiza para entrar a los comandos AT (Pulso lento indica que está en modo AT)
  2. AT // Enter
    OK
  3. AT+ROLE? // ROLE:0 (Esclavo) - ROLE:1 (Maestro)
    +ROLE: 0 o 1 //Puede variar según el fabricante, lo dejamos en 0 para que sea Esclavo
  4. AT+ADDR? // Código de la dirección (No todos son iguales)
    9Bd3:32:208b85 // Guardar esta dirección para configurar el Maestro.
Configuración del Maestro:
  1. Mantener presionado el botón o key antes de conectar // Esto se realiza para entrar a los comandos AT (Pulso lento indica que está en modo AT)
  2. AT // Enter
    OK
  3. AT+ROLE? // preguntamos si es Esclavo o Maestro
  4. AT+ROLE=1 // Lo configuramos en 1 como Maestro.
  5. AT+CMODE? // CMODE:0 Solo se conecta con un dispositivo (que programemos) - CMODE:1 Se conecta cualquiera (Celulares, computadoras, etc.)
    AT+CMODE=0 // Lo dejamos en 0, ya que solo será una comunicación entre Master y Esclavo.
  6. AT+BIND=(Dirección o código del Esclavo) // Aquí colocamos el código del Esclavo.
    AT+BIND=9Bd3:32:208b85
Para saber si efectivamente tenemos bien programado los comando AT volver a escribirlo, pero con signo de pregunta.

P210x.jpgBluetooth.jpg

puerto-com-jpg.193073

Puerto COM_2.jpgAT.jpg

El funcionamiento del programa es el siguiente:
  1. Enciende un led pulsante 5 segundos en ambos PIC // indican que el programa está iniciado.
  2. Mientras pasan los 5 segundos el Bluetooth MAESTRO o ESCLAVO se buscan hasta sincronizar.​
  3. Una vez sincronizados ambos dispositivos, el PIC del esclavo queda en espera de un pulso para encender un LED.​
  4. Se pulsa el botón del PIC Maestro y el Esclavo enciende el LED.​
Los códigos a continuación no fueron realizados por mi, si no que he utilizado información relevante, tanto de esta comunidad como de libros y otras páginas Web.

PIC16F628A
Bluetooth HC-05 (MAESTRO)


CSS:
#include <16F628a.h>

#FUSES NOWDT
#FUSES NOMCLR
#FUSES NOBROWNOUT
#FUSES NOLVP
#FUSES NOPROTECT

#use delay(internal=4MHz)
#use RS232 (baud = 9600, bits = 8, parity = N, xmit = pin_b2, rcv = pin_b1)

void main()
{
char dato;

output_high(pin_a1); // Indica que el programa esta corriendo
delay_ms(1000);
output_low(pin_a1);
delay_ms(1000);
output_high(pin_a1);
delay_ms(1000);
output_low(pin_a1);
delay_ms(1000);
output_high(pin_a1);
delay_ms(1000);



while(TRUE)
{


if (kbhit())

dato=getc ();

if ( dato=='a')
output_high(pin_b5);

if ( dato=='b')
output_low(pin_b5);
}

}

PIC16F628A
Bluetooth HC-05 (ESCLAVO)


CSS:
#include <16f628a.h>
#use delay(internal=4MHz)
#use RS232 (baud = 9600, bits = 8, parity = N, xmit = pin_b2, rcv = pin_b1)

#FUSES NOWDT
#FUSES NOMCLR
#FUSES NOBROWNOUT
#FUSES NOLVP
#FUSES NOPROTECT

char dato;

void main()
{

output_high(pin_a1); // Indica que el programa esta corriendo
delay_ms(1000);
output_low(pin_a1);
delay_ms(1000);
output_high(pin_a1);
delay_ms(1000);
output_low(pin_a1);
delay_ms(1000);
output_high(pin_a1);
delay_ms(1000);
          
      while(true)
inicio:
      {
      
       dato = getc();
  
       if(dato == 'a')  // Compara
          output_high(PIN_B5);
          delay_ms(500);
          
       if(dato == 'b')  // Compara
          output_low(PIN_B5);
           delay_ms(500);
          
          goto inicio;
       }
}
 

Adjuntos

  • P210x.jpg
    P210x.jpg
    98.9 KB · Visitas: 1
  • Puerto COM.jpg
    Puerto COM.jpg
    162.5 KB · Visitas: 48
  • Blue TX y RX.rar
    958 bytes · Visitas: 5
  1. Enciende un led pulsante 5 segundos en ambos PIC // indican que el programa está iniciado.
  2. Mientras pasan los 5 segundos el Bluetooth MAESTRO o ESCLAVO se buscan hasta sincronizar.​
Esos 5 segundos son totalmente innecesarios y tiempo perdido porque no se sincroniza con nada durante ese tiempo.
De hecho, en ninguno de los programas existe algún tipo de sincronización.
Una vez sincronizados ambos dispositivos, el PIC del esclavo queda en espera de un pulso para encender un LED.
Si usas RS-232 por software el microcontrolador nunca queda a la espera pues se usa polling, por lo tanto está dentro de un bucle.
Durante ese retardo de 500 mS cada vez que enciendes un LED, se puede perder un dato.
¿Qué caso tiene si de cualquier forma quedará encendido hasta que se requiera lo contrario?
Tengo un problema al encender un LED vía Bluetooth, comandado con un PIC 16F628a Maestro.
¿Cuál es el problema? Porque jamás lo mencionaste.

Te recomiendo que uses RS-232 por hardware y que elimines los retardos porque afectan la recepción.
Al usar el módulo USART se tiene la posibilidad de usar la interrupción por recepción, con lo cual es menos probable que se pierdan datos.
 
He visto la luz.


El otro día dediqué algo de tiempo a hacer cosillas con un ESP32.

DEP Arduino.


Aclaración. Esto parece offtopic pero no lo és. Cuando probé los ejemplos del bluetooth y cacharee un poco vi lo tedioso y caro que era el método μC+ BT todo esto te lo ahorras rápido rápido.
 
Atrás
Arriba