Repositorios para el proyecto de hidroponia

Revision:
0:19f9867f1730
Child:
1:7b3ea5d5e074
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Bluetooth.cpp	Fri Jun 10 04:17:20 2022 +0000
@@ -0,0 +1,840 @@
+/* #############################################################################
+**    Archivo        : main.c
+**    Proyecto       : STM32F103C8_Bluetooth_Terminal
+**    Procesador     : STM32F103C8T6
+**    Plataforma     : Blue Pill
+**    Herramienta    : Mbed
+**    Compilador     : Mbed Online C Compiler
+**    Version        : Mbed-OS 5.15.0
+**    Fecha/Hora     : 18-12-2019, 11:48, # CodeGen: 0
+**    Descripción    :
+**         Este proyecto utiliza la Terminal Serial para interactuar con la 
+**         Conexión Serial del Bluetooth como Terminal Serial
+**         This module contains user's application code.
+**   Componentes     : GPIO, Timer, etc .
+**   Configuraciones : Includes, Stacks y Drivers externos
+**   Autores         :
+**         ATEAM Development Group:
+**          - Antulio Morgado Valle
+**
+**   Versión        : Beta
+**   Revisión       : A
+**   Release        : 0
+**   Bugs & Fixes   :
+**   Date           : 20/10/2019
+**         First Release
+**
+**                    
+**
+** ###########################################################################*/
+/*
+::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+:                       I N C L U D E S
+::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+*/
+#include "stm32f103c8t6.h"
+#include "mbed.h"
+#include "Serial.h"
+//#include "AnalogIn.h"
+//#include "Led_RGB.h"
+//#include <stdio.h>
+
+/*
+:...............................................................................
+:                       D E F I N I C I O N E S
+:...............................................................................
+*/
+#define LED_ON          0           // Estado para el Led Encendido
+#define LED_OFF         1           // Estado para el Led Apagado
+#define BUZZ_ON         1           // Estado para Buzzer Encendido
+#define BUZZ_OFF        0           // Estado para Buzzer Apagado
+#define FALSE           0           // Estado FALSO
+#define TRUE            1           // Estado VERDADERO
+#define LOW             0           // Estado para Nivel "Bajo"
+#define HIGH            1           // Estado para Nivel "Alto"
+#define ON              0           // Estado para boton presionado
+#define OFF             1           // Estado para boton sin presionar
+#define HOLD            2           // Estado para boton mantenido
+#define RELEASE         3           // Estado para boton liberado
+#define TICKER_RATE     1000        // Periodo de Interrupción (us)
+#define BAUD_RATE       115200      // Velocidad de Transmisión (Bauds))
+                                    // Velocidades Permitidas:
+                                    // 300, 600, 1200, 2400, 4800, 9600,
+                                    // 14400, 19600, 28800, 38400, 57600
+                                    // 115200, 230400
+#define BT_App_Type     0           // App en el Celular: 0=Estandar 1=Emulador                                 
+#if BT_App_Type == 0                                                      
+#define BT_BAUD_RATE    38400       // Velocidad Estandar Bluetoothclado (default)
+#endif
+#if BT_App_Type == 1         
+#define BT_BAUD_RATE    9600        // Velocidad de Emulación Terminal Serial
+#endif
+
+/*
+*===============================================================================
+*
+*           C O N F I G U R A C I O N    D E    P U E R T O S
+*
+*===============================================================================
+*/
+Ticker      TimerInt;               // Inicializa la Interrupción por Timer
+DigitalOut  led_monitor(LED1);      // Inicializa el LED Monitor (Interno)
+DigitalOut  led_testigo(PB_12);     // Inicializa el LED Testigo (Externo)
+DigitalOut  Led_Verde(PB_13);       // Inicializa el PWM2 (PA6_TIM1_CH1N)  Led VERDE
+DigitalOut  Led_Rojo(PB_14);        // Inicializa el PWM3 (PA7_TIM1_CH2N)  Led ROJO
+DigitalOut  Led_Azul(PB_15);        // Inicializa el PWM1 (PB0_TIM1_CH3N)  Led AZUL
+DigitalOut  key_pin(PB_5,HIGH);     // Inicializa el KEY pin o STATE pin (AT Commnands)
+PwmOut      pwm1(PA_7);             // Inicializa el PWM para el LED Externo
+PwmOut      buzzer(PB_0);           // Inicializa el PWM para el Buzzer Externo
+AnalogIn    Sensor1(PA_0);          // Inicializa Canal Analógico para Potenciometro 1
+Serial      terminal(PA_2, PA_3);   // Inicializa la Comunicación Serial UART_2 a la PC (Tx, Rx)
+Serial      bluetooth(PB_10, PB_11);// Inicializa la Comunicación Serial UART_3 sobre Bluetooth (Tx, Rx)
+//Serial      bluetooth(PA_9, PA_10); // Inicializa la Comunicación Serial UART1 sobre Bluetooth (Tx, Rx)
+//Serial      bluetooth(PB_6, PB_7);  // Inicializa la Comunicación Serial UART1 sobre Bluetooth (Tx, Rx)
+/*
+#===============================================================================
+|
+|                           A R E A   D E   D A T O S
+|
+#===============================================================================
+*/
+/*
++-------------------------------------------------------------------------------
+|  Variables Globales de Usuario 
++-------------------------------------------------------------------------------
+*/
+uint16_t Rate=TICKER_RATE/2;        // Velocidad de barrido (500us = 0.5ms)
+uint16_t counter=250;               // Cuenta inicial de 250us
+uint8_t  estado=0;
+uint8_t  caracter;
+const char *buffer;
+/* END variables */
+
+/*
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+|  Definición de Funciones Prototipo y Rutinas de los Vectores de Interrupción
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+*/
+        // Las Definiciones de Funciones Prototipo 
+        // y Apuntadores a Vectores de Interrupciones van aquí !
+void TimerInt_OnInterrupt(void);    // Vector de Interrupción del Ticker
+void Setup(void);                   // Función de Inicialización del Sistema
+void Config_BT(void);               // Función de Configuración del Bluetooth
+void Caratula(void);                // Función que despliega la Caratula en la Terminal
+void Eco(void);                     // Función que Transmite y Recibe entre Terminales
+void Clear_Screen(void);            // Función que limpia la Pantalla de la Terminal
+void Buzzer_Beep(void);             // Función que prueba del Buzzer
+/* END prototypes */
+
+/* END definitions */  
+/*
+#===============================================================================
+|
+|               P R O G R A M A     P R I N C I P A L
+|
+#=============================================================================== 
+*/
+int main()          
+{
+//+++++++++++++++++++ Secuencia  Principal +++++++++++++++++++++++++++++++++++++                              
+//       Inicialización de variables, puertos, interrupciones y carátula                    
+  key_pin = HIGH;       // Bluetooth en modo de Comandos AT
+  Setup();              // Inicializa el Sistema
+  Config_BT();          // Configura el Módulo Bluetooth
+  Caratula();           // Imprime la Caratula de Inicio
+//+++++++++++++++++++ Lazo Principal +++++++++++++++++++++++++++++++++++++++++++
+//            El Lazo del Programa principal está aquí !!!  
+  while (true)
+  {
+    Eco();   // Hace ECO la terminal Serial con la terminal Bluetooth y viceversa.
+  }
+}
+/* END main */
+
+/*
+::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+::
+::              V E C T O R E S    D E    I N T E R R U P C I Ó N
+::                      (Rutinas de Atención)
+::
+::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+*/
+                // Las Rutinas de Atención a Interrupciones van aquí !
+/*
+** ===================================================================
+**     Vector      :  TimerInt_OnInterrupt()
+*/
+/*!
+**     @brief
+**         Called after Ticker is done, [Interrupt service/event]
+**         and it is enabled: 
+**         TimerInt.attach_us(&TimerInt_OnInterrupt, TICKER_RATE);
+**         the event is enabled and will be executed every  [TICKER_RATE]
+**     @param
+**         UserDataPtr     - Pointer to the user or
+**                           RTOS specific data. The pointer is passed
+**                           as the parameter of Init method.
+*/
+/* ===================================================================*/
+void TimerInt_OnInterrupt()          // Rutina de Atención al Ticker
+{
+    counter--;                      // Aquí va la Rutina de Servicio !
+    if (!counter)
+    {
+ //       terminal.printf("Counter Finish! \r\n");
+        led_monitor = !led_monitor; // Parapadeo del LED por Interrupción (LED Toggled)
+        counter = Rate;             // Restablece el contador, Le asigna el periodo de 0.5ms (Rate=500)
+    } 
+}
+/* END Events */   
+/*
+ ______________________________________________________________________________
+/______________________________________________________________________________\
+|                                                                              |
+|                   F U N C I O N E S     P R O T O T I P O                    |
+|______________________________________________________________________________|
+ \_____________________________________________________________________________/
+*/
+                // Las Funciones Prototipo van aquí !
+/*
+|--------------------------------------------------
+|    Función Setup()
+|--------------------------------------------------
+*/
+void Setup()
+{
+  confSysClock();             // Inicialización del Sistema, Configure system clock (72MHz HSE clock, 48MHz USB clock)
+  terminal.baud(BAUD_RATE);   // Se configura la velocidad de transmisión e inicia la comunicación serial.    
+  Clear_Screen();             // Limpia la pantalla de la Terminal
+  Buzzer_Beep();              // Prueba el Buzzer
+  terminal.printf("The System is Wake Up!.\n\r");
+  wait (2);                   // Espera 2 segundos
+  TimerInt.attach_us(&TimerInt_OnInterrupt, TICKER_RATE);   // Le asigna el periodo de interrupción de 1ms (TICKER_RATE=1000)
+  Clear_Screen();             // Limpia la pantalla de la Terminal
+}
+/*
+|--------------------------------------------------
+|    Función Config_BT()
+|--------------------------------------------------
+*/
+void Config_BT()             // Software Bluetooth Initialization 
+{
+/*    
+    key_pin = HIGH;         // Entramos al modo de Comandos AT
+    bluetooth.baud(38400);  // Velocidad del Módulo Bluetooth para comandos AT.
+    wait_ms(25);            // Espermos a que se estabilize el reloj
+    bluetooth.printf("AT\r\n");         // Configura el nombre de la terminal Bluetooth.        
+    bluetooth.printf("AT+ROLE=0\r\n");  // Configura el módulo Bluetooth como "Esclavo". 
+    bluetooth.printf("AT+NAME=BluePill\r\n");   // Configura el nombre de la terminal Bluetooth.
+//    bluetooth.printf("AT+PSWD=4321\r\n");      // Configura el password de la terminal Bluetooth.      
+    bluetooth.printf("AT+VERSION?\r\n");// Muestra la Versión del Módulo Bluetooth.    
+    bluetooth.printf("AT+ADDR?\r\n");   // Muestra la Dirección de la terminal Bluetooth.    
+    bluetooth.printf("AT+UART?\r\n");   // Muestra la Velocidad de Transmisión de la terminal Bluetooth.       
+    key_pin=HIGH;                    // Inhibe al HC-05 para recibir commandos AT
+    bluetooth.baud(9600); // Velocidad del Módulo Bluetooth para datos AT.
+//    terminal.baud(BT_BAUD_RATE);   // Configura la velocidad del Módulo Bluetooth.  
+    bluetooth.printf("The Bluetooth is configuring Sucesfully!.\n\r"); 
+    wait_ms(25);        
+*/
+    key_pin = HIGH;         // Entramos al modo de Comandos AT
+//    bluetooth.baud(9600); // Velocidad del Módulo Bluetooth para datos AT.
+    if (bluetooth.writable())           // Espermos para poder escribir en el Bluetooth.
+    bluetooth.baud(38400);  // Velocidad del Módulo Bluetooth para comandos AT.
+    wait_ms(25);            // Espermos a que se estabilize el reloj
+    if (bluetooth.writable())           // Espermos para poder escribir en el Bluetooth.
+    bluetooth.printf("AT\r\n");         // Configura el nombre de la terminal Bluetooth.
+    wait_ms(5);                         // Espermos a que responda la terminal Bluetooth.
+    if (bluetooth.writable())           // Espermos para poder escribir en el Bluetooth.        
+    bluetooth.printf("AT+ROLE=1\r\n");  // Configura el módulo Bluetooth: 0="Esclavo", 1="Maestro". 
+    wait_ms(5);                         // Espermos a que responda la terminal Bluetooth.
+//    if (bluetooth.writable())           // Espermos para poder escribir en el Bluetooth.
+//    bluetooth.printf("AT+CMODE=1\r\n");   // Selecciona/Verifica el modo de conección: 0 - A dirección fija 1 - A cualquier dirección, 2 - Lazo de Esclavo
+//    wait_ms(5);                         // Espermos a que responda la terminal Bluetooth.
+    if (bluetooth.writable())           // Espermos para poder escribir en el Bluetooth.
+    bluetooth.printf("AT+NAME=BluePill\r\n");   // Configura el nombre de la terminal Bluetooth.
+    wait_ms(5);                         // Espermos a que responda la terminal Bluetooth.
+//    if (bluetooth.writable())           // Espermos para poder escribir en el Bluetooth.
+//    bluetooth.printf("AT+PSWD=4321\r\n");      // Configura el password de la terminal Bluetooth.
+//    wait_ms(5);                         // Espermos a que responda la terminal Bluetooth.
+    if (bluetooth.writable())           // Espermos para poder escribir en el Bluetooth.      
+    bluetooth.printf("AT+VERSION?\r\n");// Muestra la Versión del Módulo Bluetooth.    
+    if (bluetooth.writable())           // Espermos para poder escribir en el Bluetooth.
+    bluetooth.printf("AT+ADDR?\r\n");   // Muestra la Dirección de la terminal Bluetooth.    
+    if (bluetooth.writable())           // Espermos para poder escribir en el Bluetooth.
+    bluetooth.printf("AT+UART?\r\n");   // Muestra la Velocidad de Transmisión de la terminal Bluetooth.       
+    key_pin=LOW;                        // Inhibe al HC-05 para recibir commandos AT
+//    bluetooth.baud(BT_BAUD_RATE);   // Configura la velocidad del Módulo Bluetooth.  
+    bluetooth.baud(9600);   // Velocidad del Módulo Bluetooth para datos AT.
+    wait_ms(25);
+    terminal.printf("The \e[1;34;40mBluetooth\e[m was configurated Sucesfully!.\n\r"); 
+    wait_ms(25);
+    if (bluetooth.writable())           // Espermos para poder escribir en el Bluetooth.
+    bluetooth.printf("The \e[1;34;40mBluetooth\e[m is ready to Paring!.\n\r");
+}
+/*
+|--------------------------------------------------
+|    Función Caratula()
+|--------------------------------------------------
+*/
+void Caratula()
+{
+  terminal.printf ("\t\e[1;37;41mInstituto Politecnico Nacional\e[0m\n\r");
+  terminal.printf ("\e[1;37;42mESCUELA SUPERIOR DE INGENIERIA MECANICA Y ELECTRICA\e[0m\n\r\v");
+  terminal.printf ("\t\e[1;31;40mPrueba \e[1;35;40mde \e[1;33;40mla \e[1;32;40mTerminal \e[1;34;40mBluetooth \e[0m\n\r\v\v\e[0m");
+//  terminal.printf ("\t\e[1;32;40mTerminal Serial Lista!\n\r");
+//  bluetooth.printf ("\t\e[1;34;40mTerminal Bluetooth Lista!\n\r");
+}
+/*
+|--------------------------------------------------
+|    Función Eco()
+|--------------------------------------------------
+*/
+void Eco()                          // Eco a la Terminal
+{
+   if (bluetooth.readable())
+   {
+      caracter=bluetooth.getc();    // Si llega un dato por el puerto BT
+//      wait_ms(5);                   // Espera a que se desocupe la terminal
+//      if (terminal.writable())      // Si se peude escribir a la Terminal
+      terminal.printf("\e[1;34;40m%c",caracter);     // se envía al monitor serial
+      if (bluetooth.writable())
+      bluetooth.putc(caracter);     // y hace ECO con la terminal BT
+   }
+ 
+   if (terminal.readable())
+   {
+      caracter=terminal.getc();     // Si llega un dato por el monitor serial
+//      if (bluetooth.writable())
+      bluetooth.putc(caracter);     // se envía al puerto BT
+      terminal.printf("\e[1;32;40m%c",caracter);    // y hace ECO con el monitor serial
+   }
+}    
+/*
+|--------------------------------------------------
+|    Función Clear_Screen()
+|--------------------------------------------------
+*/
+void Clear_Screen() 
+{
+    // ANSI Terminal Commands
+    terminal.printf("\x1B[2J");     // secuencia de Escape  \e1B[2J
+    terminal.printf("\x1B[H");      // secuencia de Escape  \e1B[H
+}
+/*
+|--------------------------------------------------
+|    Función Buzzer_Beep()
+|--------------------------------------------------
+*/
+void Buzzer_Beep()                      // Software routine for Buzzer Beep
+{ 
+  terminal.printf("Testing Buzzer... \n\r");
+  buzzer = BUZZ_ON;
+  wait_ms(750);
+  buzzer = BUZZ_OFF;
+  wait_ms(125);
+  buzzer = BUZZ_ON;
+  wait_ms(250);
+  buzzer = BUZZ_OFF;
+  wait_ms(125);
+  buzzer = BUZZ_ON;
+  wait_ms(500);
+  buzzer = BUZZ_OFF;
+  terminal.printf("Buzzer OK ! \n\r");
+}
+/* END functions */    
+                
+/* END program */
+
+/*
+*+******************************************************************************
+*+                  D O C U M E N T A C I Ó N
+*+******************************************************************************
+*+                  La documentación va aquí!:
+*+
+*+------------------------------------------------------------------------------      
+*+                  MODULO BLUETOOTH HC-05
+*+------------------------------------------------------------------------------ 
+*+ 
+*+                  PIN CONFIGURATION
+*+
+*+
+*+ Pin Number   Pin Name        Description
+*+    1         Enable/Key      This pin is used to toggle between 
+*+                              Data Mode (set LOW) and AT command mode (set HiGH). 
+*+                              By default it is in Data mode
+*+    2         Vcc             Powers the module. Connect to +5V Supply voltage
+*+    3         Ground          Ground pin of module, connect to system ground.
+*+    4         TX–Transmitter  Transmits Serial Data. Everything received via 
+**                              Bluetooth will be given out by this pin as serial data.
+*+    5         RX–Receiver     Receive Serial Data. Every serial data given to    
+*+                              this pin will be broadcasted via Bluetooth
+*+    6         State           The state pin is connected to on board LED, it 
+*+                              can be used as a feedback to check if Bluetooth 
+*+                              is working properly.
+*+    7         LED             Indicates the status of Module:
+*+                            * Blink once in 2 sec: Module has entered Command Mode
+*+                            * Repeated Blinking: Waiting for connection in Data Mode
+*+                            * Blink twice in 1 sec: Connection successful in Data Mode
+*+    8         Button          Used to control the Key/Enable pin to toggle between 
+*+                              Data and command Mode
+*+
+*+  HC-05 Default Settings
+*+
+*+  Default Bluetooth Name:     “HC-05”
+*+  Default Password:           1234 or 0000
+*+  Default Communication:      Slave
+*+  Default Mode:               Data Mode
+*+  Data Mode Baud Rate:        9600, 8, N, 1
+*+  Command Mode Baud Rate:     38400, 8, N, 1
+*+  Default firmware:           LINVOR
+*+ 
+*+  HC-05 Technical Specifications
+*+
+*+  Serial Bluetooth module for Arduino and other microcontrollers
+*+  Operating Voltage:          4V to 6V (Typically +5V)
+*+  Operating Current:          30mA
+*+  Range:                      <100m
+*+  Supported baud rate:        9600,19200,38400,57600,115200,230400,460800.
+*+  Works with Serial communication (USART) and TTL compatible
+*+  Follows IEEE 802.15.1 standardized protocol
+*+  Uses Frequency-Hopping Spread spectrum (FHSS)
+*+  Can operate in Master, Slave or Master/Slave mode
+*+  Can be easily interfaced with Laptop or Mobile phones with Bluetooth
+*+
+*+
+*+  Cómo utilizar el módulo Bluetooth HC-05
+*+
+*+  El HC-05 tiene dos modos de funcionamiento, uno es el modo de datos en el 
+*+  que puede enviar y recibir datos de otros dispositivos Bluetooth y el otro 
+*+  es el modo de comando AT donde se puede cambiar la configuración predeterminada 
+*+  del dispositivo. Podemos operar el dispositivo en cualquiera de estos dos 
+*+  modos usando el pin clave como se explica en la descripción del pin.
+*+
+*+  Es muy fácil emparejar el módulo HC-05 con microcontroladores porque opera 
+*+  utilizando el Protocolo de Puerto Serie (SPP). Simplemente encienda el módulo 
+*+  con + 5V y conecte el pin Rx del módulo al Tx del MCU y el pin Tx del módulo 
+*+  al Rx del MCU como se muestra en la siguiente figura
+*+ 
+*+ Para este ejemplo disponemos de un módulo Bluetooth HC-05 que podemos 
+*+ conectar al puerto Serial de la Blue Pill. 
+*+ Resumidamente hemos de conectar los pines de recepción (RX) y transmisión (TX); 
+*+ que por defecto son los pines 0 y 1 respectivamente de nuestra placa con los 
+*+ pines de transmisión (TX) y recepción (RX) del módulo de forma inversa; 
+*+ tal y como se indica en la figura.
+*+ 
+*+   Módulo HC-05          Blue Pill                PIN
+*+     KEY (EN) <----------  KEY_pin (ENable)       PB_1
+*+     VCC      -----------  5V (algunos módulos pueden operar a 3.3V)
+*+     GND      -----------  GND
+*+     Tx       ---------->  Rx                     PB_11
+*+     Rx       <----------  Tx                     PB_10
+*+
+*+ Lo más importante a tener en cuenta es que debemos de activar el modo de 
+*+ configuración del Bluetooth a través de el PIN EN o KEY, que debe de estar 
+*+ activo con un voltaje y que en este caso conectacmos al pin de 3,3V.
+*+
+*+ ATENCIÓN: Hay algunos módulos HC-05 que disponen de un botón diminuto y que 
+*+ hay que apretar antes de conectarlo a la alimentación. En el momento en el 
+*+ que entre en modo configuración; el LED parpadeará más lento de lo normal y 
+*+ podemos verificar que ha cambiado de modo.
+*+
+*+  Conexiones del circuito del módulo Bluetooth HC-05
+*+
+*+  Durante el encendido, el pin de key puede conectarse a tierra para 
+*+  entrar en el modo de comando; si se deja libre, entrará de forma predeterminada 
+*+  en el modo de datos. Tan pronto como se encienda el módulo, debería poder 
+*+  encontrar el dispositivo Bluetooth como “HC-05”, luego conéctese con la 
+*+  contraseña predeterminada 1234 y comience a comunicarse con él. 
+*+  El nombre de la contraseña y otros parámetros predeterminados se pueden 
+*+  cambiar ingresando al modo de configuración.
+*+
+*+ Para poder comunicarse en modo configuración a través de la placa Blue Pill
+*+ es necesario configurar la velocidad de transmisión hacia la tarjeta HC-05 a
+*+ 38400 Bauds
+*+
+*+ 1. Dispositivos Bluetooth:
+*+ El módulo Bluetooth HC-05 viene configurado de fábrica como "Esclavo" (slave),
+*+ pero se puede cambiar para que trabaje como "maestro" (master), además al
+*+ igual que el HC-06, se puede cambiar el nombre, código de vinculación,
+*+ velocidad y otros parámetros más.
+*+
+*+ Definamos primero que es un dispositivo bluetooth maestro y dispositivo esclavo:
+*+
+*+ Modulo bluetooth hc-05 como esclavo:
+*+ Cuando está configurado de esta forma, se comporta similar a un HC-06, espera
+*+ que un dispositivo bluetooth maestro se conecte a este, generalmente se
+*+ utiliza cuando se necesita comunicarse con una PC o Celular, pues estos se
+*+ comportan como dispositivos maestros.
+*+
+*+ Modulo bluetooth hc-05 como Maestro:
+*+ En este modo, EL HC-05 es el que inicia la conexión. Un dispositivo maestro
+*+ solo se puede conectarse con un dispositivo esclavo. Generalmente se utiliza
+*+ este modo para comunicarse entre módulos bluetooth. Pero es necesario antes
+*+ especificar con que dispositivo se tiene que comunicar, esto se explicará más
+*+ adelante
+*+
+*+ El módulo HC-05 viene por defecto configurado de la siguiente forma:
+*+  - Modo o role: Esclavo
+*+  - Nombre por defeco: HC-05
+*+  - Código de emparejamiento por defecto: 1234
+*+  - La velocidad por defecto (baud rate): 9600
+*+
+*+ 2. Modos de trabajo del HC-05::
+*+ EL Modulo HC-05 tiene 4 estados los cuales es importante conocer:
+*+ 
+*+ Estado Desconectado:
+*+  - Entra a este estado tan pronto alimentas el modulo, y cuando no se ha
+*+    establecido una conexión bluetooth con ningún otro dispositivo
+*+  - EL LED del módulo en este estado parpadea rápidamente
+*+  - En este estado a diferencia del HC-06, el HC-05 no puede interpretar los
+*+    comandos AT
+*+
+*+ Estado Conectado o de comunicación
+*+  - Entra a este estado cuando se establece una conexión con otro dispositivo
+*+    bluetooth.
+*+  - El LED hace un doble parpadeo.
+*+  - Todos los datos que se ingresen al HC-05 por el Pin RX se trasmiten por
+*+    bluetooth al dispositivo conectado, y los datos recibidos se devuelven por
+*+    el pin TX. La comunicación es transparente
+*+
+*+ Modo AT 1
+*+  - Para entrar a este estado después de conectar y alimentar el modulo es
+*+    necesario presionar el botón del HC-05.
+*+  - En este estado, podemos enviar comandos AT, pero a la misma velocidad con
+*+    el que está configurado.
+*+  - EL LED del módulo en este estado parpadea rápidamente igual que en el
+*+    estado desconectado.
+*+ 
+*+ Modo AT 2
+*+  - Para entrar a este estado es necesario tener presionado el botón al momento
+*+    de alimentar el modulo, es decir el modulo debe encender con el botón
+*+    presionado, después de haber encendido se puede soltar y permanecerá en
+*+    este estado.
+*+  - En este estado, para enviar comandos AT es necesario hacerlo a la velocidad
+*+    de 38400 baudios, esto es muy útil cuando nos olvidamos la velocidad con
+*+    la que hemos dejado configurado nuestro modulo.
+*+  - El LED del módulo en este estado parpadea lentamente.
+*+  
+*+ Los siguientes pasos son para entrar al Modo AT 1 o Modo AT 2:
+*+
+*+  -Para entrar al modo AT 1, después de alimentar el modulo y haber encendido
+*+                             tan solo basta presionar el botón que tiene el
+*+                             módulo HC-05, el LED del módulo seguirá parpadeando
+*+                             rápidamente, por lo que para saber si hemos entrado
+*+                             al Modo AT 1 es necesario enviar comandos AT y ver
+*+                             si responde,  estos comandos se verán más adelante.
+*+  -Para entrar al modo AT 2, antes de alimentar o encender el modulo es necesario
+*+                             presionar su botón, mantener presionado y alimentar
+*+                             el modulo, después que enciende recién podemos
+*+                             soltar el botón. Si el LED Parpadea lentamente es
+*+                             porque ya está en Modo AT 2.
+*+
+*+ En este tutorial enviaremos los comandos AT usando el Modo AT 2, pero también
+*+ es válido si están en el Modo AT 1, con la diferencia que tendrán que cambiar
+*+ a la velocidad con la que tienen configurado su Bluetooth (si es la primera
+*+ vez que configuran, la velocidad por defecto es de 9600).
+*+
+*+ Ahora abrimos nuestro Monitor serial Tera Term, pero puedes usar
+*+ cualquier monitor serial.
+*+
+*+ En la opción Setup --> Terminal debemos escoger “Ambos LF & CR”  y la velocidad
+*+ “38400 baud” (la velocidad para comunicarse en el MODO AT 2) 
+*+      
+*+ Echo esto Podemos empezar a enviar los comandos AT a nuestro Bluetooth
+*+
+*+ Test de comunicación
+*+ Lo primero es comprobar si nuestro bluetooth responde a los comandos AT
+*+
+*+ Enviar: AT
+*+ Recibe: OK
+*+
+*+ Si recibimos como respuesta un OK entonces podemos continuar, sino verificar
+*+ las conexiones o los pasos anteriores.
+*+
+*+
+*+-----------------------------------------------------------------------------       
+*+
+*+                  MODULO BLUETOOTH HC-05
+*+
+*+  El módulo HC-05 es un módulo Bluetooth SPP (protocolo de puerto serie) 
+*+  fácil de usar, diseñado para una configuración de conexión serial inalámbrica
+*+  transparente. El módulo Bluetooth de puerto serie está totalmente calificado
+*+  como Bluetooth V2.0 + EDR (Velocidad de datos mejorada) Modulación de 3Mbps 
+*+  con transceptor de radio y banda base completos de 2.4GHz.
+*+  Utiliza el sistema Bluetooth CSR Bluecore 04-External de un solo chip con 
+*+  tecnología CMOS y con AFH (función de salto de frecuencia adaptable).
+*+  Tiene una huella tan pequeña como 12.7 mm x 27 mm. 
+*+
+*+  Características del software
+*+  
+*+ o Velocidad de transmisión predeterminada: 
+*+   38400 bauds, Bits de datos: 8, Bit de parada: 1, Paridad: Sin paridad, 
+*+   Control de datos: tiene. 
+*+   Velocidad de transmisión permitidas:
+*+   9600,19200,38400,57600,115200,230400,460800.
+*+ o Dado un pulso ascendente en PIO0, el dispositivo se desconectará.
+*+ o Puerto de instrucción de estado PIO1: Bajo=desconectado, Alto=conectado;
+*+ o PIO10 y PIO11 se pueden conectar al led rojo y azul por separado.
+*+   Cuando el maestro y el esclavo están emparejados, el LED rojo y azul 
+*+   parpadea en intervalo de 1 vez/2s, mientras que el LED azul parpadea solo
+*+   2 veces/s.
+*+ o Se conecta automáticamente al último dispositivo con alimentación de forma
+*+   predeterminada. 
+*+ o Permitir que el dispositivo se conecte de forma predeterminada.
+*+ o CÓDIGO PIN de emparejamiento automático: "0000" por defecto
+*+ o Reconexión automática en 30 minutos cuando se desconecta como resultado
+*+   de un rango de conexión más allá.
+*+
+*+ Características de hardware
+*+
+*+  Sensibilidad típica de -80dBm
+*+  Hasta + 4dBm de potencia de transmisión de RF
+*+  Operación de baja potencia  E/S de 1.8V a 3.6V 
+*+  Control PIO
+*+  Interfaz UART con velocidad de transmisión programable
+*+  Con antena integrada
+*+  Con conector de borde
+*+
+*+  Conexión al Módulo Bluetooth HC-05:
+*+  
+*+                                                   /
+*+  BluePill                       HC-05            /
+*+                              1 Enable/Key    ---o   o---> GND  
+*+    3.3V          ------      2 Vcc
+*+    GND           ------      3 GND 
+*+    Rx (PB_11)    <-----      4 Tx 
+*+    Tx (PB_10)    ----->      5 Rx
+*+                              6 State         -----------> IRQ
+*+ 
+*+  Comandos AT Soportados 
+*+
+*+  Cómo configurar el modo a servidor (maestro): 
+**  1. Conecte PIO11 a nivel alto. (pin 34)
+*+  2. Encendido, módulo en estado de comando 
+*+  3. Usando la velocidad en baudios 38400, se envía el comando 
+*+       "AT+ROLE=1\r\n" 
+*+     al módulo, con una respuesta de
+*+       "OK\r\n" 
+*+     significa establecer éxitos. 
+*+  4. Conecte el PIO11 a nivel bajo, vuelva a encender el módulo, el módulo
+*+     funciona como servidor (maestro).
+*+
+*+   Comandos AT:(todos terminan con \r\n)
+*+  1. Test command:
+*+      Comando         Respuesta           Parámetros 
+*+      AT              OK                  -
+*+  2. Reset:
+*+      Comando         Respuesta           Parámetros 
+*+      AT+RESET        OK                  -
+*+  3. Get firmware version
+*+      Comando         Respuesta           Parámetros 
+*+      AT+VERSION?     +VERSION:<Param>    Param : firmware version
+*+                      OK 
+*+
+*+   Ejemplo:
+*+      AT+VERSION?\r\n 
+*+      +VERSION:2.0-20100601 
+*+      OK 
+*+
+*+  4. Restore default
+*+      Comando         Respuesta           Parámetros 
+*+      AT+ORGL         OK                  -
+*+
+*+    Estado por Omisión:
+*+      Slave mode, pin code :1234, device name: H-C-2010-06-01 ,Baud 38400bits/s.
+*+       
+*+  5. Get moduleaddress
+*+      Comando         Respuesta           Parámetros 
+*+      AT+ADDR?        +ADDR:<Param>       Param:  address of Bluetooth Module
+*+                      OK                  
+*+
+*+       Bluetooth address: NAP: UAP : LAP
+*+       
+*+   Ejemplo: 
+*+      AT+ADDR?\r\n
+*+      +ADDR:1234:56:abcdef
+*+      OK
+*+
+*+  6. Set/Check module name
+*+      Comando         Respuesta           Parámetros 
+*+      AT+NAME=<Param> OK                  Param: Bluetooth module name
+*+      AT+NAME?        +NAME:<Param>              (Default: HC-05)
+*+                      OK (/FAIL)
+*+
+*+   Ejemplo:
+*+      AT+NAME=HC-05\r\n       set the module name to “HC-05”
+*+      OK 
+*+      AT+NAME=BluePill\r\n    set the module name to “BluePill”
+*+      OK                                                 
+*+      AT+NAME?\r\n
+*+      +NAME: BluePill
+*+      OK 
+*+
+*+  7. Get the Bluetooth device name:
+*+      Comando         Respuesta           Parámetros 
+*+    AT+RNAME?<Param1> 1. +NAME:<Param2>   Param1,Param2: the address of 
+*+                      OK                  Bluetooth device
+*+                      2. FAIL
+*+
+*+   Ejemplo:(Device address 00:02:72:od:22:24,name:BluePill)
+*+      AT+RNAME? 0002,72,od2224\r\n 
+*+      +RNAME:BluePill
+*+      OK
+*+       
+*+  8.Set/Check module mode:
+*+      Comando         Respuesta           Parámetros
+*+      AT+ROLE=<Param> OK                  Param:
+*+      AT+ ROLE?       +ROLE:<Param>          0-Slave
+*+                                             1-Master
+*+      
+*+  9. Set/Check device class     
+*+      Comando         Respuesta           Parámetros
+**    AT+CLASS=<Param>  OK                  Param: Device Class
+*+    AT+ CLASS?        1. +CLASS:<Param>
+*+                      OK
+*+                      2. FAIL
+*+                     
+*+  10. Set/Check GIAC (General Inquire Access Code)
+*+      Comando         Respuesta           Parámetros
+*+    AT+IAC=<Param>    1.OK                Param: GIAC
+*+                      2.FAIL             (Default: 9e8b33)
+*+    AT+IAC            +IAC:<Param>  
+ *+                     OK
+ *+
+*+   Ejemplo:
+*+      AT+IAC=9e8b3f\r\n 
+*+      OK
+*+      AT+IAC?\r\n 
+*+      +IAC: 9e8b3f 
+*+      OK
+*+
+*+  11. Set/Check --Query access patterns
+*+      Comando         Respuesta           Parámetros
+*+    AT+INQM=<Param>,  1.OK                Param: 
+*+    <Param2>,         2.FAIL                 0——inquiry_mode_standard
+*+    <Param3>                                 1——inquiry_mode_rssi
+*+                                          Param2:
+*+                                             Maximum number of Bluetooth
+*+                                             devices to respond to
+*+                                          Param3:
+*+                                             Timeout (1-48 : 1.28s to 61.44s)
+*+
+*+   Ejemplo:
+*+      AT+INQM=1,9,48\r\n
+*+      OK AT+INQM\r\n 
+++      +INQM: 1, 9, 48 
+*+      OK
+*+  
+*+  12. Set/Check PIN code:
+*+      Comando         Respuesta           Parámetros
+*+     AT+PSWD=<Param>  OK                  Param: PIN code(Default 1234)
+*+     AT+ PSWD?        + PSWD:<Param>
+*+                      OK
+*+
+*+  13. Set/Checkserial parameter:
+*+      Comando         Respuesta           Parámetros
+*+     AT+UART=<Param>, OK                  Param1: Baud
+*+      <Param2>,                           Param2: Stop bit
+*+      <Param3>                            Param3: Parity
+*+    AT+ UART?         +UART=<Param>,
+*+                      <Param2>, 
+*+                      <Param3> 
+*+                      OK
+*+  Ejemplo:
+*+    AT+UART=115200,1,2,\r\n
+*+    OK
+*+    AT+UART? 
+*+    +UART:115200,1,2
+*+    OK
+*+
+*+  14. Set/Check connect mode:
+*+      Comando         Respuesta           Parámetros
+*+    AT+CMODE=<Param>  OK                  Param:
+*+    AT+ CMODE?        + CMODE:<Param>        0 - connect fixed address
+*+                      OK                     1 - connect any address
+*+                                             2 - slave-Loop
+*+
+*+  15. Set/Check fixed address:
+*+      Comando         Respuesta           Parámetros
+**    AT+BIND=<Param>   OK                  Param: 
+*+                      + BIND:<Param>         Fixed address
+*+                      OK                     (Default 00:00:00:00:00:00)
+*+
+*+  Ejemplo:
+*+    AT+BIND=1234,56,abcdef\r\n
+*+    OK
+*+    AT+BIND?\r\n
+*+    +BIND:1234:56:abcdef
+*+    OK
+*+
+*+  16. Set/Check LED I/O
+*+      Comando         Respuesta           Parámetros
+*+   AT+POLAR=<Param1,  OK                  Param1: 
+*+            <Param2>                         0-PIO8 low  drive LED
+*+   AT+ POLAR?         +POLAR=<Param1>,       1-PIO8 high drive LED
+*+                             <Param2>     Param2: 
+**                                             0-PIO9 low  drive LED
+**                                             1-PIO9 high drive LED
+*+  17. Set PIO output
+*+      Comando         Respuesta           Parámetros
+*+  AT+PIO=<Param1>,    OK                  Param1:
+*+         <Param2>                            PIO number
+*+                                          Param2:
+*+                                             PIO level
+*+                                              0-low
+*+                                              1-high
+*+  Ejemplo:
+*+    1. PIO10 output high level
+*+    AT+PI0=10,1\r\n
+*+    OK
+*+
+*+  18. Set/Check –scan parameter
+*+      Comando         Respuesta           Parámetros
+*+  AT+IPSCAN=<Param1>, OK                  Param1: Query time interval
+*+            <Param2>,                     Param2:Query duration
+*+            <Param3>,                     Param3:Paging interval
+*+            <Param4>                      Param4:Call duration
+*+  AT+IPSCAN?          +IPSCAN:<Param1>,
+*+                              <Param2>,
+*+                              <Param3>,
+*+                              <Param4>
+*+                      OK
+*+   Ejemplo:
+*+      AT+IPSCAN=1234,500,1200,250\r\n
+*+      OK 
+*+      AT+IPSCAN? 
+*+      +IPSCAN:1234,500,1200,250 
+*+
+*+  19. Set/Check –SHIFF parameter
+*+      Comando         Respuesta           Parámetros
+*+  AT+SNIFF=<Param1>,  OK                  Param1: Max time
+*+           <Param2>,                      Param2: Min time 
+*+           <Param3>,                      Param3: Retry time
+*+           <Param4>                       Param4: Time out
+*+  AT+SNIFF?           +SNIFF:<Param1>,
+**                             <Param2>,
+**                             <Param3>,
+*+                             <Param4> 
+*+                      OK
+*+
+*+  20. Set/Check securitymode
+*+      Comando         Respuesta           Parámetros
+*+  AT+SENM=<Param1>,   1.OK                Param1:  
+*+          <Param2>    2.FAIL                 0——sec_mode0+off
+*+  AT+ SENM?           +SENM:<Param1>,        1——sec_mode1+non_secure
+*+                            <Param2>         2——sec_mode2_service 
+*+                      OK                     3——sec_mode3_link 
+*+                                             3——sec_mode3_link 
+*+                                             4——sec_mode_unknown 
+*+                                          Param2:
+**                                             0——hci_enc_mode_off 
+*+                                             1——hci_enc_mode_pt_to_pt
+*+                                             2——hci_enc_mode_pt_to_pt_and_bcast
+*+
+*+  21. DeleteAuthenticated Device
+*+      Comando         Respuesta           Parámetros
+*+  AT+PMSAD=<Param>    OK                  Param: Authenticated Device Address  
+*+
+*+  Ejemplo:
+*+     AT+PMSAD=1234,56,abcdef\r\n 
+*+     OK
\ No newline at end of file