Skip to main content

BLUETOOTH

Conocimientos previos

Tienes que visitar las siguientes páginas de la Unidad 4 Comunicaciones con Arduino:

Aprende a configurar los botones de la APP !! diapositiva 12 pero en vez de Up, Down, Right y Left los que se establezcan en el reto

  • Configuración avanzada pues nosotros conectaremos el HC-06 en los pines digitales D11 y D12 y no en D0 y D1 pues están ocupados con la comunicación del ordenador.

Reto

Controlar nuestra casa con el móvil, para ello vamos a definir los siguientes comandos:

COMANDO VOZ DATO descripción
Comando 1 abrir A abrir la puerta y cierra automáticamente
Comando 2 puerta P abrir/cerrar la puerta
Comando 3 alarma L activar/desactivar la alarma
Comando 4 pit T hace un pit
Comando 5 rojo R enciende luz interior roja
Comando 6 azul B enciende luz interior azul
Comando 7 apaga O apaga luces interiores

Lo tienes que hacer así:

Solución conexión eléctrica
  • Conectaremos Vcc y GND del HC06 igual que antes en la placa protoboard sí ya sé que casi no queda sitio, es el último, lo prometo
  • TX de HC06 al pin D11
  • RX de HC06 al pin D12
Solución vídeo

Solución código
///////////////////////////////////////LIBRERIAS
#include <Servo.h> 
#include <SoftwareSerial.h>
///////////////////////////////////////ENTRADAS SALIDAS DIGITALES ///////
// 0 ocupado por el puerto serie ordenador-arduino
// 1 ocupado por el puerto serie ordenador-arduino
const int PULSADORTIMBRE =2;2;      //sensor tactil
const int TIMBRE =3;3;              //buzzer activo
const int PUERTA = 4;4;             //servo puerta
const int AZUL = 5;5;               //led RGB
const int ROJO = 6;6;               //led RGB
const int VERDE = 7;7;              //led RGB
const int AGUA =8;8;                //sensor agua
const int LLAMA=9;LLAMA=9;                //sensor LLAMA
const int LASER=10;LASER=10;               //diodo LASER 
const constint intRX   RX= =11;              11;              //transmisión Bluetooth TX
const int TX = 12;12;                //transmisión Bluetooth RX
const int LED = 13;13;               //led interno
////////////////////////////////////// ENTRADAS ANALÓGICAS ///////////////////////
const int LDR = 0;0;               //sensor luz LDR
const int JOYSTICKAZUL = 1;1;       //potenciómetro eje x del joystick
const int JOYSTICKROJO = 2;2;      //potenciómetro eje y del joystick
const int JOYSTICKSW   = 3;3;      //switch del joystick
const int ONOFF        = 4;4;       //interruptor que apaga o enciende la alarma
/////////////////////////////////////////////////////////// OBJETOS///////////////
Servo myservo;myservo;                  //objeto servo
SoftwareSerial Serial1(RX,RX, TX)TX); // objeto puerto serie1 del Bluetooth
///////////////////////////////////////VARIABLES//////////////////////////////////
const int ABIERTO =0;0;               //ángulo abierto puerta
const int CERRADO =75;75;              //ángulo cerrado puerta, se ha modificado con respecto a 90 que es cierre total pues tropezaba con la pared
bool PUERTAABIERTA;PUERTAABIERTA;                 //guardará si está abierto o no
const int QUITAREBOTES = 1000;1000;      //el tiempo para eliminar rebotes
String command = "";                // guardará la respuesta desde el BT
bool ENCENDIDO;ENCENDIDO;                     //guardará que debe de dejar la luz encendida
bool PONERALARMA;PONERALARMA;                   //guardará que las alarmas están activas
String QUESENSOR;QUESENSOR;                   //guarda qué sensor se ha disparado;
bool DISPARO;DISPARO;                       //guardará que ha ocurrido un disparo de alarma
/////////////////////////////////////FUNCIONES
void CerrarPuerta(CerrarPuerta();
void Alarma(Alarma(String QueQue);
void ComandoBT();


void ComandoBT();


//////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////INICIO //////////////////////////
//////////////////////////////////////////////////////////////////////////
void setup(setup() {
  Serial.begin(9600)begin(9600);       //inicializar el puerto serie del ordenador
  Serial1.begin(9600)begin(9600);      //CONEXION SERIE PARA EL MODULO BT
  ////////////////////////////////fijar input/output
  pinMode(PULSADORTIMBRE,pinMode(PULSADORTIMBRE, INPUT)INPUT);
  pinMode(TIMBRE,pinMode(TIMBRE, OUTPUT)OUTPUT);
  pinMode(PUERTA,pinMode(PUERTA, OUTPUT)OUTPUT); 
  pinMode(AZUL,pinMode(AZUL, OUTPUT)OUTPUT);
  pinMode(ROJO,pinMode(ROJO, OUTPUT)OUTPUT);
  pinMode(VERDE,pinMode(VERDE, OUTPUT)OUTPUT);
  pinMode(LED,OUTPUT)pinMode(LED,OUTPUT); 
  pinMode(AGUA,INPUT)pinMode(AGUA,INPUT);
  pinMode(LLAMA,INPUT)pinMode(LLAMA,INPUT);
  pinMode(LASER,OUTPUT)pinMode(LASER,OUTPUT);
  ///////////////////////////////fijar situación inicial
  digitalWrite(TIMBRE,HIGH)digitalWrite(TIMBRE,HIGH);  // timbre apagado
  myservo.attach(PUERTA)myservo.attach(PUERTA);    //servo en el pin correspondiente
  myservo.write(CERRADO)myservo.write(CERRADO);   //puerta cerrada
  PUERTAABIERTA = falsefalse;
  digitalWrite(AZUL,LOW);  digitalWrite(AZUL,LOW);  //luz rgb apagada  
  digitalWrite(ROJO,LOW);  digitalWrite(ROJO,LOW);  //luz rgb apagada  
  digitalWrite(VERDE,LOW);  digitalWrite(VERDE,LOW);  //luz verde apagada  
  digitalWrite(LASER,LOW); 
  digitalWrite(LASER,LOW);PONERALARMA PONERALARMA= false;
  DISPARO = false;false;
  DISPAROQUESENSOR = false;
  QUESENSOR = "";
  command=command="";
}
//////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////BUCLE ///////////////////////////
//////////////////////////////////////////////////////////////////////////
void loop(loop() {
  ///////////////////////////////// bluetooth /////////////////////////////
  ComandoBT(ComandoBT();
  //////////////////////////// timbre ////////////////////////////////////////
  if ((digitalRead(PULSADORTIMBREdigitalRead(PULSADORTIMBRE)))||(commandcommand==="A")){
    Serial.println(println("Abriendo puerta .... ");
    PUERTAABIERTA=truePUERTAABIERTA=true;
    myservo.write(ABIERTO);
    myservo.write(ABIERTOdelay(3000);
    CerrarPuerta();
  delay(3000);}
  CerrarPuerta();
  }
  ////////// pulsadorjoystick abrir y cerrar la puerta  //////////////////////
  int valor=analogRead(JOYSTICKSW)valor=analogRead(JOYSTICKSW);
  //Serial.println(valor);
  if (valorvalor==0){
    delay(QUITAREBOTES);
    valor=analogRead(JOYSTICKSW);
    if (valor==0)0){
    delay(QUITAREBOTES);
    valor=analogRead(JOYSTICKSW);
    if (valor==0){
      Serial.println(println("//////////////HAS PULSADO EL BOTÓN DEL JOYSTICK");
      command=command="P";  
    }
  }
  if (commandcommand==="P"){
    if (!PUERTAABIERTA)PUERTAABIERTA){
        Serial.println(println("Abriendo puerta .... ");
        PUERTAABIERTA=truePUERTAABIERTA=true;
        myservo.write(ABIERTO);  
      myservo.write(ABIERTO}else{
        CerrarPuerta();
      }else{
  CerrarPuerta();}
  }
  }
  //////////// juego luces joystick //////////////////////////////////////////
  int valorAz = analogReadanalogRead(JOYSTICKAZUL);
  valorAz = (JOYSTICKAZUL)valorAz-500)/2.5;
  if (valorAz<5) valorAz =0;
  if (!ENCENDIDO)analogWrite(AZUL,valorAz);
  valorAzint valorRo = analogRead(JOYSTICKROJO);
  valorRo = (valorAz-500)valorRo-550)/2.55;
  if (valorRo<5) valorRo =0;
  if (!ENCENDIDO) analogWrite(ROJO,valorRo);
  if (valorAz<5) valorAz command==0;
  if (!ENCENDIDO)analogWrite(AZUL,valorAz);
  int valorRo = analogRead(JOYSTICKROJO);
  valorRo = (valorRo-550)/2.5;
  if (valorRo<5) valorRo =0;
  if (!ENCENDIDO) analogWrite(ROJO,valorRo);
  if (command=="R") analogWriteanalogWrite(ROJO,255);
  if (ROJO,255);
  if (commandcommand==="B") analogWriteanalogWrite(AZUL,255);
  if (AZUL,255);
  if (commandcommand==="O"){
    analogWrite(ROJO,0)analogWrite(ROJO,0);
    analogWrite(AZUL,0)analogWrite(AZUL,0);
  }
  //////////////// agua /////////////////////////////////////////////////
  if (digitalRead(AGUAdigitalRead(AGUA))){
    Alarma(Alarma("AGUA !!!");
    if (PUERTAABIERTAPUERTAABIERTA)  CerrarPuerta();
  CerrarPuerta();}
  }
  /////////////// ALARMA FUEGO y LASER /////////////////////////////////////
  if (PONERALARMA)PONERALARMA){
    digitalWrite(VERDE,HIGH)digitalWrite(VERDE,HIGH);
    digitalWrite(LASER,HIGH)digitalWrite(LASER,HIGH);   
    delay(QUITAREBOTES)delay(QUITAREBOTES);  //se pone un poco de retraso pues había falsos disparos  
    if if (digitalRead(LLAMA)digitalRead(LLAMA)==0)0){
      DISPARODISPARO=true;
      QUESENSOR =true;
      QUESENSOR =" ########## FUEGO ##########";
    }
    if (800<analogRead(LDRanalogRead(LDR))){
      DISPARODISPARO=true;
      QUESENSOR =true;
      QUESENSOR =" ########## LADRON ##########";
    }
    ////////////// DISPARO //////////////
    if (DISPARO)DISPARO) Alarma(QUESENSOR)Alarma(QUESENSOR);
  }else{else{
    digitalWrite(VERDE,LOW)digitalWrite(VERDE,LOW);
     digitalWrite(LASER,LOW)digitalWrite(LASER,LOW); 
  }
  ////////////// ONOFF ///////////////
  valorvalor=analogRead(ONOFF);
  if (valor==analogRead0){
    delay(QUITAREBOTES);
    valor=analogRead(ONOFF);
    if (ONOFF);
  if (valorvalor===0)0){
    delay(QUITAREBOTES);
    valor=analogRead(ONOFF);
    if (valor==0){
      Serial.println(println("//////////////HAS PULSADO EL BOTÓN ON/OFF ALARMA ////////////////");
      command=command="L";
    }
  }
  if (commandcommand==="L"){
    if (PONERALARMA)PONERALARMA){
        PONERALARMAPONERALARMA=false;
        DISPARO =false; DISPAROfalse;
    }else{
        PONERALARMA=true;
    }
  }
  if (command== false;
    }else{
        PONERALARMA=true;
    }
  }
  if (command=="T") Alarma(Alarma("PIIIIT");
}






//////////////////////////////////////////////////////////////////////////
//////////////////////////////////FUNCION CERRAR PUERTA////////////////////
//////////////////////////////////////////////////////////////////////////
void CerrarPuertaCerrarPuerta(){
  if ()PUERTAABIERTA){
    iffor (PUERTAABIERTA){int for (int i=1;i=1;i<=3;i3;i+++){
      Serial.println(println("CERRANDO PUERTA !!!");
      digitalWrite(LED,HIGH)digitalWrite(LED,HIGH);
      digitalWrite(TIMBRE,LOW)digitalWrite(TIMBRE,LOW);
      delay(1000)delay(1000);
      digitalWrite(TIMBRE,HIGH)digitalWrite(TIMBRE,HIGH);
      digitalWrite(LED,LOW)digitalWrite(LED,LOW);
      delay(1000)delay(1000);
    }
     myservo.write(CERRADO)myservo.write(CERRADO);
    PUERTAABIERTA=false;PUERTAABIERTA=false;
    Serial.println(println("Puerta cerrada");
  }
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////FUNCION ALARMA ///////////////////
//////////////////////////////////////////////////////////////////////////
void AlarmaAlarma(String Que){
  for (Stringint Que){i for= (int 1;i = 1;i<=1010;i++){
    digitalWrite(TIMBRE,LOW);i++){
    digitalWrite(TIMBRE,LOW)digitalWrite(LED,HIGH);
    digitalWrite(LED,HIGH);String String mensaje=mensaje="ALARMA !!!!!!"+Que;Que;
    Serial.println(mensaje)println(mensaje);
    delay(100)delay(100);
    digitalWrite(TIMBRE,HIGH)digitalWrite(TIMBRE,HIGH);
    digitalWrite(LED,LOW)digitalWrite(LED,LOW);
    mensaje=mensaje="ATENCIÓN !!!!!!"+Que;Que;
    Serial.println(mensaje)println(mensaje);
    delay(100)delay(100);  
  }
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////FUNCION LEER COMANDO BLUETOOTH///////////
//////////////////////////////////////////////////////////////////////////
void ComandoBTComandoBT(){
  if((){
  if((commandcommand==="R")||(commandcommand==="B")){
  }else{else{
    command=command="";
  }
  if (Serial1.available(available()) {
     while(while(Serial1.available(available()) { 
      command += (charchar)Serial1.read()Serial1.read();
     }
     Serial.println(println("Comando recibido por Bluetooth = " );
     Serial.println(command)println(command);
  }
}