domingo, 11 de diciembre de 2016

Arduino Bluetooth y Android Studio (1/2)


Comunicación de ARDUINO con SMARTPHONE via Bluetooth

INTRODUCCIÓN:
Además de las desiciones, esperas (para recibir mis compras) y pequeñas pruebas de cada uno de los componentes y luego de pasar por muchas luchas con los Microprocesadores (Caso: PIC F18-XXX).
Junté todo lo aprendido a golpes y preguntas sin respuestas claras (para mi poco conocimiento) en la Web y ya no recuerdo de que modo y como llegué a conocer el mundo ARDUINO.
fue esto lo que terminó de hacerme sentir realmente útil frente a este nuevo mundo de la Electrónica Digital.
Fue así que terminé de comprender y encontrar todas las respuestas que me hacía detrás de la compra de un simple módulo que me permitía hacer y aplicar muchisimas aplicaciones. Muchas de ellas (inimaginables para mi) y que luego de unos días lograba concretar.
Lo que veremos en este Post no es otra cosa que lo explicado en mil y una formas distintas, lo que nos muestran en videos sin decirnos como lo lograron, lo que explican y explican mareandonos llevándonos de un lado para el otro. Diciendonos lo sencillo que es hacer y "MANOS A LA OBRA".
Pero que al final de todo esto ¡NADA FUNCIONA!
Claro Nada funciona porque omitieron explicar detalles creyendo que ya lo sabemos, o porque simplemente consideraron que no hacía falta aclarar o explicar.
Bien de una cosa te juro y aseguro, esto esta hecho para nosotros, los que necesitamos que nos ayuden a ¡ARRANCAR! para que a partir de esto y cuando queramos modificarlo y no funciones comencemos a aprender de verdad. Bueno, ahora como dicen TODOS!!! Manos a la OBRA!.


HARDWARE: Para esta comunicación hemos de usar:
Placa Arduino UNO, NANO, MEGA.
Módulo Bluetooth HC-05
Led colores Azul y Rojo
Sensor DHT-11
ProtoBoard con 8 o 10 Cables para conectar cada múdulo con nuestro Arduino.


SOFTWARE:
Arduino con su editor (.INO)
Android Studio para la realización de la Aplicación (.APK)

Desarrollo de todo
Este código de Arduino permite que con mi Smartphone via Bluetooth pueda:
- Enviarle un texto. Este puede ser una clave de acceso por ejemplo.
- Presionar Tecla Led ON y Tecla OFF para Encender y Apagar un Led de color Azul.
- Por medio de una Barra de Corrimiento Enciendo, Apago y le doy mayor o menor densidad a un Led de color Rojo.
- Presiono una Tecla de nombre Temperatura y me envía la Temp. y Humedad captada por el Sensor DHT-11.


Codigo del Arduino:

// Creado el 11/12/2016 Combinado.INO
// Permite Encender/Apagar LED Azul
// Controla LED Rojo con PWN
// Informa la Temperatura y Humedad con DHT11

#include 

#include 
SoftwareSerial BTxT(10, 11); // Crea nueva conexion- Pin10(RX) a TX y Pin11(TX) a RX

/*-----( Declaro Variables )-----*/
dht DHT;
#define DHT_PIN 3
String Temx; // Variable que contiene Temperatura
String Humx; // Variable que contiene Humedad
String Mensaje;  // Variable de cadena de caracteres para el mensaje
String DigitoEnvio; // La libreria Envia una cadena de a un caracter por vez 
int Bandera; // Bandera de Recepción de mensajes

void setup()
{
  Serial.begin(9600);  // Iniciamos el puerto que esta conectado al PC a 9600 Baudios
  BTxT.begin(9600);    // Iniciamos el puerto nuevo Serial_2 a 9600 Baudios
  
  Serial.println("PROGRAMA Led Azul y Rojo con Sensor DHT11 para Tolba Con Bluetooth");
  Serial.println();

  pinMode(10, INPUT);  // RxD Recepcion
  pinMode(11, OUTPUT); // TxD Transmicion
  pinMode(13, OUTPUT); // Configura Pin 13 como Salida
  pinMode(5, OUTPUT);  // Configura Pin 05 como Salida PWN
  pinMode(3, OUTPUT);  // Configura Pin 03 como Salida Temperatura/Humedad
}

void loop() {

vuelta:
  Mensaje = ""; // Preparamos el mensaje ha recibir hacia el PC
  Bandera = 0;  // Recepcion de mensajes
  
  // Mientras que lleguen caracteres por el puerto BTxT (serial_2)
  while (BTxT.available()) {
     char c = BTxT.read();  // Lee los caracteres uno a uno con la variable c
     delay(10);
     Mensaje += c;          // Almacena la suma de caracteres en el mensaje
     Bandera = 1;
  }

  if (Bandera == 1) {
     Mensaje.trim();
     Serial.println("Hemos recibido un Mensaje: ["+Mensaje+"]"); 
  } else {
     goto vuelta;
  }
  
  if (Mensaje == "A" || Mensaje == "B") {
      Serial.println("Recibimos esta Orden: "+Mensaje);
      if (Mensaje == "A"){
          digitalWrite(13,1);   // Enciende LED en Pin 13
          DigitoEnvio = "A~";
          BTxT.println(DigitoEnvio);
      } else {
          digitalWrite(13,0);   // Apaga LED en Pin 13 
          DigitoEnvio = "B~";
          BTxT.println(DigitoEnvio);
      }
      delay(10);
      Serial.println("Respuesta: " + DigitoEnvio);        
      goto vuelta;
  }
  
  if (Mensaje == "TH"){
     Tolvas();
     Serial.println("Recibimos este Texto "+Mensaje);
     delay(100);
     BTxT.println("TH-"+Temx+"-"+Humx+"~");
     goto vuelta;
  }

  if (Mensaje.substring(0,3) == "TXT"){
     int desde = 4;
     int hasta = Mensaje.length();
     Mensaje = Mensaje.substring(desde, hasta);
     Serial.println("Recibimos este Texto "+Mensaje);
     BTxT.println("Enviaste "+Mensaje+"~");
     goto vuelta;
  }

  if ((Mensaje.toInt() >= 0) && (Mensaje.toInt() < 256)) {
      Serial.println("Recibimos este Numero: "+Mensaje);
      if (Mensaje.toInt() < 65){
          analogWrite(5,0);
          BTxT.println("Led Rojo OFF~");
      } else {
          analogWrite(5, Mensaje.toInt());
//          Esta linea molesta más de lo que sirve
//          BTxT.println(Mensaje+"~");
      }
      delay(10);
      Serial.println("PWM Recibido ["+Mensaje+"]");
  }
}

void Tolvas(){
  int chk = DHT.read11(DHT_PIN);
  delay (100);
  chk = DHT.read11(DHT_PIN);
  delay (1000);
  switch (chk)
  {
    case DHTLIB_OK:  
        Serial.print("OK \t");
        break;
    case DHTLIB_ERROR_CHECKSUM: 
        Serial.print("Error en el Checksum \t");
        break;
    case DHTLIB_ERROR_TIMEOUT: 
        Serial.print("Error Tiempo de Salida \t");
        break;
    case DHTLIB_ERROR_CONNECT:
        Serial.print("Error de Coneccion \t");
        break;
    case DHTLIB_ERROR_ACK_L:
        Serial.print("Error Ack Bajo (Low)/Falta 5v \t");
        break;
    case DHTLIB_ERROR_ACK_H:
        Serial.print("Error Ack Alto (High) \t");
        break;
    default:
        Serial.print("Error Desconocido \t");
        break;
  }
  // DISPLAY DATA
  Temx = "";
  Humx = "";
  Serial.println(DHT.temperature, 1);
  Serial.println(DHT.humidity, 1);
  Temx = DHT.temperature;
  Humx = DHT.humidity;  
  delay (100);
  return Temx, Humx;
}
 
OBSERVACIONES:
No tengo duda alguna, que este codigo luego de analizarlo, podremos conincidir que sobran muchas cosas y que se podía hacer más "técnico" de otros modos y con otros comandos. No es el objetivo de ello. Este programa primario enseña como se comporta cada componente y le dice a TODOS que esta pasando a cada momento. Esa fue la necesidad de hacerlo de este modo tan básico de Comandos y Estructuras.

En la próxima entrega veremos el Desarrollo de la aplicación (.APK) realizada con Android Studio.
Les deseo lo mejor!