BLUETOOTH
Conocimientos previos
Tienes que visitar las siguientes páginas de la Unidad 4 Comunicaciones con Arduino:
- ¿Qué es el HC-06?
-
La APP que tienes que intalarte
-
Vincular tu móvil con el HC-06 con tu móvil
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; //sensor tactil
const int TIMBRE =3; //buzzer activo
const int PUERTA = 4; //servo puerta
const int AZUL = 5; //led RGB
const int ROJO = 6; //led RGB
const int VERDE = 7; //led RGB
const int AGUA =8; //sensor agua
const int LLAMA=9; //sensor LLAMA
const int LASER=10; //diodo LASER
const int RX = 11; //transmisión Bluetooth TX
const int TX = 12; //transmisión Bluetooth RX
const int LED = 13; //led interno
////////////////////////////////////// ENTRADAS ANALÓGICAS ///////////////////////
const int LDR = 0; //sensor luz LDR
const int JOYSTICKAZUL = 1; //potenciómetro eje x del joystick
const int JOYSTICKROJO = 2; //potenciómetro eje y del joystick
const int JOYSTICKSW = 3; //switch del joystick
const int ONOFF = 4; //interruptor que apaga o enciende la alarma
/////////////////////////////////////////////////////////// OBJETOS///////////////
Servo myservo; //objeto servo
SoftwareSerial Serial1(RX, TX); // objeto puerto serie1 del Bluetooth
///////////////////////////////////////VARIABLES//////////////////////////////////
const int ABIERTO =0; //ángulo abierto puerta
const int CERRADO =75; //ángulo cerrado puerta, se ha modificado con respecto a 90 que es cierre total pues tropezaba con la pared
bool PUERTAABIERTA; //guardará si está abierto o no
const int QUITAREBOTES = 1000; //el tiempo para eliminar rebotes
String command = ""; // guardará la respuesta desde el BT
bool ENCENDIDO; //guardará que debe de dejar la luz encendida
bool PONERALARMA; //guardará que las alarmas están activas
String QUESENSOR; //guarda qué sensor se ha disparado;
bool DISPARO; //guardará que ha ocurrido un disparo de alarma
/////////////////////////////////////FUNCIONES
void CerrarPuerta();
void Alarma(String Que);
void ComandoBT();
//////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////INICIO //////////////////////////
//////////////////////////////////////////////////////////////////////////
void setup() {
Serial.begin(9600); //inicializar el puerto serie del ordenador
Serial1.begin(9600); //CONEXION SERIE PARA EL MODULO BT
////////////////////////////////fijar input/output
pinMode(PULSADORTIMBRE, INPUT);
pinMode(TIMBRE, OUTPUT);
pinMode(PUERTA, OUTPUT);
pinMode(AZUL, OUTPUT);
pinMode(ROJO, OUTPUT);
pinMode(VERDE, OUTPUT);
pinMode(LED,OUTPUT);
pinMode(AGUA,INPUT);
pinMode(LLAMA,INPUT);
pinMode(LASER,OUTPUT);
///////////////////////////////fijar situación inicial
digitalWrite(TIMBRE,HIGH); // timbre apagado
myservo.attach(PUERTA); //servo en el pin correspondiente
myservo.write(CERRADO); //puerta cerrada
PUERTAABIERTA = false;
digitalWrite(AZUL,LOW); //luz rgb apagada
digitalWrite(ROJO,LOW); //luz rgb apagada
digitalWrite(VERDE,LOW); //luz verde apagada
digitalWrite(LASER,LOW);
PONERALARMA = false;
DISPARO = false;
QUESENSOR = "";
command="";
}
//////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////BUCLE ///////////////////////////
//////////////////////////////////////////////////////////////////////////
void loop() {
///////////////////////////////// bluetooth /////////////////////////////
ComandoBT();
//////////////////////////// timbre ////////////////////////////////////////
if ((digitalRead(PULSADORTIMBRE))||(command=="A")){
Serial.println("Abriendo puerta .... ");
PUERTAABIERTA=true;
myservo.write(ABIERTO);
delay(3000);
CerrarPuerta();
}
////////// pulsadorjoystick abrir y cerrar la puerta //////////////////////
int valor=analogRead(JOYSTICKSW);
//Serial.println(valor);
if (valor==0){
delay(QUITAREBOTES);
valor=analogRead(JOYSTICKSW);
if (valor==0){
Serial.println("//////////////HAS PULSADO EL BOTÓN DEL JOYSTICK");
command="P";
}
}
if (command=="P"){
if (!PUERTAABIERTA){
Serial.println("Abriendo puerta .... ");
PUERTAABIERTA=true;
myservo.write(ABIERTO);
}else{
CerrarPuerta();
}
}
//////////// juego luces joystick //////////////////////////////////////////
int valorAz = analogRead(JOYSTICKAZUL);
valorAz = (valorAz-500)/2.5;
if (valorAz<5) valorAz =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") analogWrite(ROJO,255);
if (command=="B") analogWrite(AZUL,255);
if (command=="O"){
analogWrite(ROJO,0);
analogWrite(AZUL,0);
}
//////////////// agua /////////////////////////////////////////////////
if (digitalRead(AGUA)){
Alarma("AGUA !!!");
if (PUERTAABIERTA) CerrarPuerta();
}
/////////////// ALARMA FUEGO y LASER /////////////////////////////////////
if (PONERALARMA){
digitalWrite(VERDE,HIGH);
digitalWrite(LASER,HIGH);
delay(QUITAREBOTES); //se pone un poco de retraso pues había falsos disparos
if (digitalRead(LLAMA)==0){
DISPARO=true;
QUESENSOR =" ########## FUEGO ##########";
}
if (800<analogRead(LDR)){
DISPARO=true;
QUESENSOR =" ########## LADRON ##########";
}
////////////// DISPARO //////////////
if (DISPARO) Alarma(QUESENSOR);
}else{
digitalWrite(VERDE,LOW);
digitalWrite(LASER,LOW);
}
////////////// ONOFF ///////////////
valor=analogRead(ONOFF);
if (valor==0){
delay(QUITAREBOTES);
valor=analogRead(ONOFF);
if (valor==0){
Serial.println("//////////////HAS PULSADO EL BOTÓN ON/OFF ALARMA ////////////////");
command="L";
}
}
if (command=="L"){
if (PONERALARMA){
PONERALARMA=false;
DISPARO = false;
}else{
PONERALARMA=true;
}
}
if (command=="T") Alarma("PIIIIT");
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////FUNCION CERRAR PUERTA////////////////////
//////////////////////////////////////////////////////////////////////////
void CerrarPuerta(){
if (PUERTAABIERTA){
for (int i=1;i<=3;i++){
Serial.println("CERRANDO PUERTA !!!");
digitalWrite(LED,HIGH);
digitalWrite(TIMBRE,LOW);
delay(1000);
digitalWrite(TIMBRE,HIGH);
digitalWrite(LED,LOW);
delay(1000);
}
myservo.write(CERRADO);
PUERTAABIERTA=false;
Serial.println("Puerta cerrada");
}
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////FUNCION ALARMA ///////////////////
//////////////////////////////////////////////////////////////////////////
void Alarma(String Que){
for (int i = 1;i<=10;i++){
digitalWrite(TIMBRE,LOW);
digitalWrite(LED,HIGH);
String mensaje="ALARMA !!!!!!"+Que;
Serial.println(mensaje);
delay(100);
digitalWrite(TIMBRE,HIGH);
digitalWrite(LED,LOW);
mensaje="ATENCIÓN !!!!!!"+Que;
Serial.println(mensaje);
delay(100);
}
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////FUNCION LEER COMANDO BLUETOOTH///////////
//////////////////////////////////////////////////////////////////////////
void ComandoBT(){
if((command=="R")||(command=="B")){
}else{
command="";
}
if (Serial1.available()) {
while(Serial1.available()) {
command += (char)Serial1.read();
}
Serial.println("Comando recibido por Bluetooth = " );
Serial.println(command);
}
}