ArduHome

Introducción

¿Alguna vez has soñado con tener una casa inteligente? ArduHome es el asistente que llevas esperando todo este tiempo. Pudiendo ser construido por ti mismo, ArduHome llega para revolucionar el mercado de la domótica.

¿Pero cómo consigo mi ArduHome? En primer lugar, vamos a introducir en qué consiste. A rasgos generales, se trata de un asistente de voz inteligente con el que se pueden controlar muchas tareas, que facilitan la calidad de vida en el hogar.

Explicación general

En cuanto a las funcionalidades que hemos implementado, la principal es el reconocimiento de voz. De esta dependen las restantes funcionalidades, ya que es el pilar central con el que podemos controlarlo todo. De esta forma, mediante distintos comandos de voz, podemos activar distintas tareas como el reproductor de música, encender luces o encender el ventilador. Además, se han incorporado funcionalidades extra mediante una pantalla que muestra información referente a la temperatura y la humedad. Así mismo, también nos preocupamos por la salud del usuario e incorporamos sensor de ritmo cardiaco, además de su seguridad, mediante el sensor de incendios y derrumbamiento de la vivienda.

Componentes empleados

A continuación, se detallan los componentes empleados en el proyecto:

  1. Geeetech Voice Recognition Module with microphone control voice board.
  2. 2W 8R 8 Ohm 28MM Speaker Loudspeakers Horn for VCD EVD Thick 5.6MM
  3. 10 Pcs TO-92 Triode Transistor BC547 BC557 NPN PBP Low Power Transistors
  4. DFPlayer Mini MP3 Player Module MP3 Voice Audio Decoder Board For Supporting TF Card U-Disk IO/Serial Port/AD
  5. Sensor DHT 11
  6. Sensor de ritmo cardíaco KY-039
  7. Sensor de detección de incendios KY-036
  8. Sensor de inclinación KY-020
  9. Motor
  10. Buzzer
  11. Leds x4
  12. DSD TECH USB a TTL convertidor serie CP2102 con 4 PIN Dupont Cable

Presupuesto

El precio de cada componente se detalla a continuación:

  • x2 Arduino Uno -> 19.99€ c/u Amazon
  • x1 Pack sensores -> 7.99$ c/u Banggood
  • x1 Módulo de reconocimiento de voz -> 18.99$ c/u Banggood
  • x1 Pack 10 transistores -> 1.83$ c/u Banggood
  • x1 Adaptador SD para Arduino -> 1.99$ c/u Banggood
  • x1 Altavoz 8 ohmios 2W Arduino -> 2.24$ c/u Banggood
  • x1 Pack 120 cables -> 5.99€ c/u Amazon
  • x1 Adaptador USB Serial -> 7.99€ c/u Amazon
  • x1 Caja de cartón duro -> 7.50€ c/u Maxi China Alcorcón
  • x1 Lámina de cartón duro -> 2.50€ Maxi China Alcorcón
  • x1 Pack herramientas para manejar los materiales (tijeras, pegamento, segueta, soldador, …) -> Gratis

En total, el desembolso asciende a 53,81 €, dado que contábamos con los dos Arduino Uno.

Librerías utilizadas

Además, hemos empleado las siguientes librerías, que explicaremos más adelante:

  • LiquidCrystal
  • DFPlayerMini
  • SoftwareSerial
  • DHT

Explicación de las funcionalidades

Reconocimiento de voz

La implementación del reconocimiento de voz se realiza mediante el modulo de Geeetech anteriormente mencionado. 

Para la grabación de los comandos de voz, se ha necesitado utilizar un micrófono externo al que el módulo traía por defecto, puesto que el componente vino defectuoso. Además, se ha necesitado utilizar un USB serial para realizar la conexión con el ordenador, y poder utilizar el programa DockLight, mediante el que se introdujeron los mandatos. Esto se puede realizar hasta alcanzar un máximo de 15 comandos, distribuidos en 3 grupos de 5. En ello residía una de las mayores complicaciones del proyecto, dado que el módulo únicamente permite activar un grupo de comandos de voz. Sin embargo, esto 

Como hemos comentado, esta es la pieza clave de nuestro proyecto. 

Una vez iniciada la ejecución, ArduHome comenzará saludándonos. A partir de ahí, basta con indicarle la tarea que tiene que realizar.

Las comandos de voz que ArduHome detectará son los siguientes:

  • Luces: Tras indicarselo, ArduHome nos preguntará qué luces queremos modificar. Si dicha luz se encuentra encendida, se apagará, y viceversa. Se ofrecen las siguientes opciones:
    • Salón
    • Cocina
    • Habitación
    • Garaje
    • Todas
  • Música: ArduHome preguntará qué queremos que haga, en referencia al apartado música. En ese momento, podremos indicarle varias opciones:
    • Play
    • Pausa
    • Siguiente
    • Anterior
    • Fiesta: En este caso, ArduHome seleccionará una canción aleatoria a su elección y comenzará a encender y apagar las luces de la casa de igual manera aleatoria.
  • Ventilador: ArduHome activará o desactivará el ventilador en función de cómo se encuentre antes de la petición.
  • Hola: Si saludamos a ArduHome, nos devolverá el saludo y preguntará qué tal estamos.

Reproductor de música

El reproductor de música consta de un altavoz, un lector y una tarjeta microSD para almacenar los archivos de audio que queramos reproducir (en formato mp3). Es capaz de comenzar a reproducir una pista de audio mediante el comando de voz “play”, pasar a la siguiente pista mediante el comando “siguiente”, volver a la pista anterior mediante el comando “anterior”, y pausarla mediante el comando “pausa”. Además, hemos implementado la función de “fiesta”, mediante la cual comenzará a sonar música (de una pista elegida al azar) y las luces se encenderán de manera aleatoria.

Luces

La iluminación del hogar se encuentra dividida en distintas estancias. De esta forma, podemos encender las luces correspondiente a cada habitación de forma independiente mediante los comandos “baño”, “salón”, “habitación” y “garaje” . El sistema es capaz de reconocer si las luces están encendidas o apagadas, por lo que nos basta con decir el nombre de la estancia para que se apague si está encendida o viceversa. Además, también se pueden activar todas las luces a la vez mediante el comando de voz “todas”. 

El asistente nos dará retroalimentación mientras realiza las tareas. Por ejemplo, dice “encendiendo” o “apagando” justo antes de encender o apagar una luz. De forma análoga, dice “que empiece la fiesta” si hemos escogido la opción de fiesta.

Sensor de derrumbamiento

El sensor de derrumbamiento nos avisará si la casa se está derrumbando, por ejemplo por la acción de un terremoto o un fallo en los cimientos. Para detectarlo, se cuenta con un sensor que mide la inclinación, de forma de que si la casa comienza a inclinarse se muestra un mensaje por pantalla que alerta del peligro de derrumbe.

Sensor de incendios

El sensor de incendios alertará mediante el pitido de un buzzer cuando detecte que hay fuego en una distancia relativamente cercana.

Sensor de temperatura y humedad

El sensor de temperatura y humedad detecta lo dicho en tiempo real, y lo muestra por la pantalla LCD implementada.

Sensor de ritmo cardíaco

Situando el dedo en el sensor de ritmo cardíaco, es capaz de indicarnos en tiempo real nuestra frecuencia cardíaca, mostrándola mediante la pantalla LCD.

Pantalla LCD

La pantalla LCD es el perfecto acompañante de la asistencia por voz. Mediante ella, ArduHome nos indica ciertos datos de la casa, como la temperatura o humedad actual, los indicadores de inclinación y detección de fuego, o nuestro ritmo cardíaco cuando sea necesario.

Librerías

LiquidCrystal

Esta librería se utiliza para poder tener manejo sobre la pantalla LCD de 16 pines que tenemos, y tener más accesibles sus funcionalidades, tales como la configuración de la pantalla o la limpieza cuando se escriba algo. Es una librería auxiliar que hemos incluido en nuestro proyecto, ya que programar nosotros incluso el código de esta librería sería un trabajo más duro que el propio proyecto en sí.

Más información: https://www.arduino.cc/en/Reference/LiquidCrystal

DFPlayerMini

Esta es otra librería auxiliar en la que nos hemos apoyado para realizar toda la funcionalidad referida a la reproducción de audio. Como hemos comentado arriba, nuestra casa domótica tiene la opción de reproducirla, pararla, reproducir la siguiente canción o reproducir la anterior.

Esta librería nos permite utilizar funciones ya programadas que nos evitan perder tiempo en entenderlas y así podemos probarlas y utilizarlas directamente.

Descarga: https://github.com/DFRobot/DFRobotDFPlayerMini

SoftwareSerial

Por defecto, Arduino permite realizar comunicaciones seriales por hardware mediante los pines digitales 0 y 1. Mediante esta librería, se permite simular dicho comportamiento por software, permitiendo utilizar pines diferentes para realizar el mismo comportamiento.

Más información: https://www.arduino.cc/en/Reference/SoftwareSerial

DHT

La librería DHT permite manejar de manera más sencilla el módulo de detección de humedad y temperatura.

Descarga:

Problemas encontrados

Al principio, cuando recibimos todos los componentes, intentamos grabar el audio, pero resultó que nos faltaba un componente fundamental, que era el adaptador USB serial para poder grabar los comandos. Además de no disponer del USB serial, el micrófono que nos mandaron no funcionaba, por lo que tuvimos que apañarnos con uno de peor calidad, que montamos de manera independiente. Esto supuso el tener que pedir el nuevo componente y retrasar un poco más el trabajo.

Una vez que conseguimos grabar el audio, estuvimos intentando probar varios sensores e implementar nuevas funcionalidades para nuestra casa domótica. Cuando nos dispusimos a esto, vimos que algunos sensores no funcionaban correctamente, o funcionaban de manera intermitente, por lo que tuvimos que eliminar ciertas funcionalidades que en un principio deseábamos implementar.

También tuvimos problemas con la pantalla LCD, ya que la única que disponíamos necesitaba de un conector especial que no teníamos (y que curiosamente no encontramos repuesto por Internet). Por ello, tuvimos que comprar más cables (un pack de 120) y conectar minuciosamente cada uno de los 16 pines que eran necesarios para nuestra pantalla.

Hemos tenido problemas debido a que necesitamos muchas conexiones de pines por la gran cantidad de sensores, aunque al final lo hemos conseguido con dos Arduino Uno. Además, como íbamos trabajando en paralelo, juntar los diferentes códigos de los sensores e integrar todo ha sido más difícil de lo que pensábamos.

En último lugar, cabe mencionar que lo que más problemas nos ha causado ha sido el reconocimiento de voz. Por un lado, por distintos fallos con la importación de librerías, además de que en Internet tampoco hay mucha documentación sobre esto. Por otro lado, la mala calidad del micrófono y las veces que éste nos fallaba, lo que hizo que el reconocimiento de voz se eternizara hasta que finalmente conseguimos grabar los comandos. 

El último gran problema está, de nuevo, relacionado con los propios comandos de voz. El módulo utilizado únicamente permite activar un grupo de 5 comandos de manera simultánea, por lo que, si esto acabase así, veríamos muy limitadas las funcionalidades implementadas. En el único manual del módulo que localizamos, se recomendaba realizar la activación de grupos y la grabación de comandos mediante Docklight, un programa externo. Sin embargo, para poder utilizar la totalidad de grupos de comandos y poder acceder a los 15 mandatos de voz, conseguimos comunicarnos con el módulo de voz en tiempo de ejecución e indicarle mediante escrituras hexadecimales los diferentes cambios de grupos necesarios. Esto desembocó en un rediseño de la agrupación de comandos, agrupándolos en diferentes secciones temáticas.

Algunas imágenes del proceso

A continuación se muestras algunas imágenes que hicimos durante el desarrollo del proyecto.

Imagen 1 – Montando las luces
Imagen 2 – Sensor de inclinación con alarma (buzzer)
Imagen 3 – Pantalla LCD con los 16 pines conectados manualmente
Imagen 4 – Juntando todo
Imagen 5 – Resultado final

Video explicativo

A continuación, se incorpora un video resumen de los materiales necesarios para construir ArduHome y su funcionamiento:

¿Por qué elegir ArduHome? Comparativa con otras alternativas comerciales

Do it yourself

Está claro que no se puede competir tan fácilmente con gigantes en el mercado como Google o Amazon… Pero lo mejor de este proyecto, ¡Es que puedes hacer tú mismo! A tu medida y según tus preferencias, mientras como nosotros, aprendes del proceso. Todo es mucho más enriquecedor cuando lo haces tú mismo y no te limitas a comprarlo para utilizarlo.

Código

Por último, se adjunta el código utilizado para implementar la funcionalidad de ambas placas Arduino:

//ARDUINO 1 - RECONOCIMIENTO DE VOZ, RESPUESTAS A COMANDOS Y MP3
//Includes
#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"

SoftwareSerial myPlayerSerial(10, 11); //DFPlayer
SoftwareSerial myVoiceSerial(2, 3); //Voice Module
DFRobotDFPlayerMini myDFPlayer;

int grupo_activo=1; //Variabe que indica el grupo actual

//Leds//
//In and Out
int led1 = 5; //Salon
int led2 = 6; //Cocina
int led3 = 9; //Bano
int led4 = A2;  //Garaje

//LDR//
int ldrPin=A0;

//Variables
byte com = 0;
int luzSalon=0;
int luzBano=0;
int luzCocina=0;
int luzGaraje=0;


int ldrStatus;

int fiesta=0;

int pista_actual=10;

int motor=12;
int motorOn=0;

int comAlarma=13;
int alarma=0;

//Grupo 1
//Luces,musica,ventilador, alarma, hola
//Grupo 2
//Salon, baño, cocina, garaje encender todas(luces)
//Grupo 3 
//Play, pause, ant,sig, fiesta

void importGroup(int n){
   
    myVoiceSerial.write(0xAA);
    myVoiceSerial.write((byte)0x00);//Waiting
    delay(100);
    myVoiceSerial.write(0xAA);
    myVoiceSerial.write(0x37);//Compact mode
    delay(100);
    myVoiceSerial.write(0xAA);
    myVoiceSerial.write((byte)0x00);//Waiting
    delay(100);
    if(n==1){
      myVoiceSerial.write(0xAA);
      myVoiceSerial.write(0x21);//Import group 1
    }
    if(n==2){
      myVoiceSerial.write(0xAA);
      myVoiceSerial.write(0x22);//Import group 2
    }
    else{
      myVoiceSerial.write(0xAA);
      myVoiceSerial.write(0x23);//Import group 3
    }
}
void fiestaHandler(){
  if(fiesta==1){
          if(random(2)==1){
            digitalWrite(led1, HIGH);
          }else{
            digitalWrite(led1, LOW);
          }
          if(random(2)==1){
            digitalWrite(led2, HIGH);
          }else{
            digitalWrite(led2, LOW);
          }
          if(random(2)==1){
            digitalWrite(led3, HIGH);
          }else{
            digitalWrite(led3, LOW);
          }
          if(random(2)==1){
            digitalWrite(led4, HIGH);
          }else{
            digitalWrite(led4, LOW);
          }
          delay(500);
  }else{
    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW);
    digitalWrite(led3, LOW);
    digitalWrite(led4, LOW);
    
  }
}
void setup()
{

  Serial.begin(9600);
  
  // Set leds //
  pinMode(led1, OUTPUT); 
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT); 
  pinMode(led4, OUTPUT); 
  pinMode(ldrPin,INPUT);
  pinMode(motor, OUTPUT);
  pinMode(comAlarma, OUTPUT);

  randomSeed(analogRead(A2));
  
  myPlayerSerial.begin(9600);
  Serial.println();
  Serial.println(F("DFRobot DFPlayer Mini Demo"));
  Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));

  if (!myDFPlayer.begin(myPlayerSerial)) { 
    Serial.println(F("Unable to begin:"));
    Serial.println(F("1.Please recheck the connection!"));
    Serial.println(F("2.Please insert the SD card!"));
    while(true);
  }
  Serial.println(F("DFPlayer Mini online."));

  myDFPlayer.volume(30);  //0-30
  myDFPlayer.play(6);
  delay(1500);
  myDFPlayer.pause();

  //Voice recognition
  myVoiceSerial.begin(9600);
  myVoiceSerial.write(0xAA);
  myVoiceSerial.write((byte)0x00);//Waiting
  delay(100);
  myVoiceSerial.write(0xAA);
  myVoiceSerial.write(0x37);//Compact mode
  delay(100);
  myVoiceSerial.write(0xAA);
  myVoiceSerial.write((byte)0x00);//Waiting
  delay(100);
  importGroup(1);
  
}

void loop()
{
  
  myVoiceSerial.listen();
  ldrStatus=analogRead(ldrPin);


  while(grupo_activo==1){
    com = myVoiceSerial.read();
    
    if(com==0x11){
       myDFPlayer.play(8); //¿Qué luz quieres cambiar?
       delay(1500);
       myDFPlayer.pause();
            
       grupo_activo=2;
       myVoiceSerial.listen();
       importGroup(2);
      
    }
    if(com==0x12){
      myDFPlayer.play(9);
      grupo_activo=3;
      myVoiceSerial.listen();
      importGroup(3);
      
    }
    if(com==0x13){
      if(motorOn==1){
        Serial.print("Ventilador no");
        digitalWrite(motor, LOW);
        motorOn=0;
      }else{
        Serial.print("Ventilador");
        digitalWrite(motor, HIGH);
        motorOn=1;
      }
    }

    if(com==0x15){
      myDFPlayer.play(6); //Play - Hola qué tal
      delay(1500);
      myDFPlayer.pause();
      
    }
  }

  
  
  while(grupo_activo==2){
    com = myVoiceSerial.read();
    
    if(com==0x11){
      Serial.print("Luz salon");
            if(luzSalon==0){
              myDFPlayer.play(5); //Encendiendo
              delay(2000);
              myDFPlayer.pause();
              Serial.print("Salon encendida");
              digitalWrite(led1, HIGH);
              luzSalon=1;
            }
            else{
              myDFPlayer.play(2); //Apagando
              delay(2000);
              myDFPlayer.pause();
              Serial.print("Salon apagada");
  
              //Apagar luz//
              digitalWrite(led1, LOW);
              luzSalon=0; 
              
            }
            grupo_activo=1;
            myVoiceSerial.listen();
            importGroup(1);

      
    }
    if(com==0x12){
      //Luz Bano
            if(luzBano==0){     
              myDFPlayer.play(5); //Encendiendo
              delay(2000);
              myDFPlayer.pause();
              Serial.print("Bano encendida");
              digitalWrite(led3, HIGH);
              luzBano=1;
              
            }
            else{
              myDFPlayer.play(2); //Apagando
              delay(2000);
              myDFPlayer.pause();
              Serial.print("Bano apagada");
  
              //Apagar luz//
              digitalWrite(led3, LOW);
              luzBano=0; 
                         
            }
            grupo_activo=1;
            myVoiceSerial.listen();
            importGroup(1);

      
    }
    if(com==0x13){
      //Luz Cocina
  
            if(luzCocina==0){
              myDFPlayer.play(5); //Encendiendo
              delay(2000);
              myDFPlayer.pause();
              Serial.print("Cocina encendida");
              digitalWrite(led3, HIGH);
              luzCocina=1;
              
            }
            else{
              myDFPlayer.play(2); //Apagando
              delay(2000);
              myDFPlayer.pause();
              Serial.print("Cocina apagada");
  
              //Apagar luz//
              digitalWrite(led3, LOW);
              luzCocina=0; 
              
            }
            
            grupo_activo=1;
            myVoiceSerial.listen();
            importGroup(1);
      
    }
    if(com==0x14){
      //Luz garaje      
            if(luzGaraje==0){
              myDFPlayer.play(5); //Encendiendo
              delay(2000);
              myDFPlayer.pause();
              Serial.print("Garaje encendida");
              digitalWrite(led4, HIGH);
              luzGaraje=1;
              
            }
            else{
              myDFPlayer.play(2); //Apagando
              delay(2000);
              myDFPlayer.pause();
              Serial.print("Garaje apagada");
  
              //Apagar luz//
              digitalWrite(led4, LOW);
              luzGaraje=0; 
              
            }
  
            grupo_activo=1;
            myVoiceSerial.listen();
            importGroup(1);
      
    }
    if(com==0x15){
      //Encender todas      
            
              myDFPlayer.play(5); //Activado
              delay(1500);
              myDFPlayer.pause();
              
              //Encender luces//
              Serial.write("Todas");
              digitalWrite(led1, HIGH);
              digitalWrite(led2, HIGH);
              digitalWrite(led3, HIGH);
              digitalWrite(led4, HIGH);
              luzSalon=1;
              luzBano=1;
              luzCocina=1;
              luzGaraje=1;
              
              grupo_activo=1;
              myVoiceSerial.listen();
              importGroup(1);
    }
  }

  
  
  while(grupo_activo==3){
    com = myVoiceSerial.read();
    
    if(com==0x11){
      //Play música   
            myDFPlayer.play(pista_actual);

      
    }
    if(com==0x12){
      //Pausar música
            myDFPlayer.pause();     
            grupo_activo=1;
            myVoiceSerial.listen();
            importGroup(1);

      
    }
    if(com==0x13){
          //Pone la canción anterior 
          Serial.print("Anterior");
            if(pista_actual>10){
              pista_actual--;
            }else{
              pista_actual=13;
            }
            myDFPlayer.play(pista_actual);
      
    }
    if(com==0x14){
      
            Serial.print("Siguiente");
            if(pista_actual<13){
              pista_actual++;
            }else{
              pista_actual=10;
            }
            myDFPlayer.play(pista_actual);
      
    }
    if(com==0x15){
      
      if(fiesta==0){
        Serial.print("Fiesta");
        myDFPlayer.play(7);
        delay(2000);
        myDFPlayer.play(random(10,14));
        fiesta=1;
        
      }else{
        Serial.print("Fiesta fuera");
        myDFPlayer.pause();
        fiesta=0;
        grupo_activo=1;
        myVoiceSerial.listen();
        importGroup(1);        
      }

    }
    fiestaHandler();
  }
        delay(1000);
      
}
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"

SoftwareSerial myPlayerSerial(10, 11); //DFPlayer
SoftwareSerial myVoiceSerial(2, 3); //Voice Module
DFRobotDFPlayerMini myDFPlayer;

int grupo_activo=1; //Variabe que indica el grupo actual

//Leds//
//In and Out
int led1 = 5; //Salon
int led2 = 6; //Cocina
int led3 = 9; //Bano
int led4 = A2;  //Garaje

//LDR//
int ldrPin=A0;

//Variables
byte com = 0;
int luzSalon=0;
int luzBano=0;
int luzCocina=0;
int luzGaraje=0;


int ldrStatus;

int fiesta=0;

int pista_actual=10;

int motor=12;
int motorOn=0;

int comAlarma=13;
int alarma=0;

//Grupo 1
//Luces,musica,ventilador, alarma, hola
//Grupo 2
//Salon, baño, cocina, garaje encender todas(luces)
//Grupo 3 
//Play, pause, ant,sig, fiesta

void importGroup(int n){
   
    myVoiceSerial.write(0xAA);
    myVoiceSerial.write((byte)0x00);//Waiting
    delay(100);
    myVoiceSerial.write(0xAA);
    myVoiceSerial.write(0x37);//Compact mode
    delay(100);
    myVoiceSerial.write(0xAA);
    myVoiceSerial.write((byte)0x00);//Waiting
    delay(100);
    if(n==1){
      myVoiceSerial.write(0xAA);
      myVoiceSerial.write(0x21);//Import group 1
    }
    if(n==2){
      myVoiceSerial.write(0xAA);
      myVoiceSerial.write(0x22);//Import group 2
    }
    else{
      myVoiceSerial.write(0xAA);
      myVoiceSerial.write(0x23);//Import group 3
    }
}
void fiestaHandler(){
  if(fiesta==1){
          if(random(2)==1){
            digitalWrite(led1, HIGH);
          }else{
            digitalWrite(led1, LOW);
          }
          if(random(2)==1){
            digitalWrite(led2, HIGH);
          }else{
            digitalWrite(led2, LOW);
          }
          if(random(2)==1){
            digitalWrite(led3, HIGH);
          }else{
            digitalWrite(led3, LOW);
          }
          if(random(2)==1){
            digitalWrite(led4, HIGH);
          }else{
            digitalWrite(led4, LOW);
          }
          delay(500);
  }else{
    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW);
    digitalWrite(led3, LOW);
    digitalWrite(led4, LOW);
    
  }
}
void setup()
{

  Serial.begin(9600);
  
  // Set leds //
  pinMode(led1, OUTPUT); 
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT); 
  pinMode(led4, OUTPUT); 
  pinMode(ldrPin,INPUT);
  pinMode(motor, OUTPUT);
  pinMode(comAlarma, OUTPUT);

  randomSeed(analogRead(A2));
  
  myPlayerSerial.begin(9600);
  Serial.println();
  Serial.println(F("DFRobot DFPlayer Mini Demo"));
  Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));

  if (!myDFPlayer.begin(myPlayerSerial)) { 
    Serial.println(F("Unable to begin:"));
    Serial.println(F("1.Please recheck the connection!"));
    Serial.println(F("2.Please insert the SD card!"));
    while(true);
  }
  Serial.println(F("DFPlayer Mini online."));

  myDFPlayer.volume(30);  //0-30
  myDFPlayer.play(6);
  delay(1500);
  myDFPlayer.pause();

  //Voice recognition
  myVoiceSerial.begin(9600);
  myVoiceSerial.write(0xAA);
  myVoiceSerial.write((byte)0x00);//Waiting
  delay(100);
  myVoiceSerial.write(0xAA);
  myVoiceSerial.write(0x37);//Compact mode
  delay(100);
  myVoiceSerial.write(0xAA);
  myVoiceSerial.write((byte)0x00);//Waiting
  delay(100);
  importGroup(1);
  
}

void loop()
{
  
  myVoiceSerial.listen();
  ldrStatus=analogRead(ldrPin);


  while(grupo_activo==1){
    com = myVoiceSerial.read();
    
    if(com==0x11){
       myDFPlayer.play(8); //¿Qué luz quieres cambiar?
       delay(1500);
       myDFPlayer.pause();
            
       grupo_activo=2;
       myVoiceSerial.listen();
       importGroup(2);
      
    }
    if(com==0x12){
      myDFPlayer.play(9);
      grupo_activo=3;
      myVoiceSerial.listen();
      importGroup(3);
      
    }
    if(com==0x13){
      if(motorOn==1){
        Serial.print("Ventilador no");
        digitalWrite(motor, LOW);
        motorOn=0;
      }else{
        Serial.print("Ventilador");
        digitalWrite(motor, HIGH);
        motorOn=1;
      }
    }

    if(com==0x15){
      myDFPlayer.play(6); //Play - Hola qué tal
      delay(1500);
      myDFPlayer.pause();
      
    }
  }

  
  
  while(grupo_activo==2){
    com = myVoiceSerial.read();
    
    if(com==0x11){
      Serial.print("Luz salon");
            if(luzSalon==0){
              myDFPlayer.play(5); //Encendiendo
              delay(2000);
              myDFPlayer.pause();
              Serial.print("Salon encendida");
              digitalWrite(led1, HIGH);
              luzSalon=1;
            }
            else{
              myDFPlayer.play(2); //Apagando
              delay(2000);
              myDFPlayer.pause();
              Serial.print("Salon apagada");
  
              //Apagar luz//
              digitalWrite(led1, LOW);
              luzSalon=0; 
              
            }
            grupo_activo=1;
            myVoiceSerial.listen();
            importGroup(1);

      
    }
    if(com==0x12){
      //Luz Bano
            if(luzBano==0){     
              myDFPlayer.play(5); //Encendiendo
              delay(2000);
              myDFPlayer.pause();
              Serial.print("Bano encendida");
              digitalWrite(led3, HIGH);
              luzBano=1;
              
            }
            else{
              myDFPlayer.play(2); //Apagando
              delay(2000);
              myDFPlayer.pause();
              Serial.print("Bano apagada");
  
              //Apagar luz//
              digitalWrite(led3, LOW);
              luzBano=0; 
                         
            }
            grupo_activo=1;
            myVoiceSerial.listen();
            importGroup(1);

      
    }
    if(com==0x13){
      //Luz Cocina
  
            if(luzCocina==0){
              myDFPlayer.play(5); //Encendiendo
              delay(2000);
              myDFPlayer.pause();
              Serial.print("Cocina encendida");
              digitalWrite(led3, HIGH);
              luzCocina=1;
              
            }
            else{
              myDFPlayer.play(2); //Apagando
              delay(2000);
              myDFPlayer.pause();
              Serial.print("Cocina apagada");
  
              //Apagar luz//
              digitalWrite(led3, LOW);
              luzCocina=0; 
              
            }
            
            grupo_activo=1;
            myVoiceSerial.listen();
            importGroup(1);
      
    }
    if(com==0x14){
      //Luz garaje      
            if(luzGaraje==0){
              myDFPlayer.play(5); //Encendiendo
              delay(2000);
              myDFPlayer.pause();
              Serial.print("Garaje encendida");
              digitalWrite(led4, HIGH);
              luzGaraje=1;
              
            }
            else{
              myDFPlayer.play(2); //Apagando
              delay(2000);
              myDFPlayer.pause();
              Serial.print("Garaje apagada");
  
              //Apagar luz//
              digitalWrite(led4, LOW);
              luzGaraje=0; 
              
            }
  
            grupo_activo=1;
            myVoiceSerial.listen();
            importGroup(1);
      
    }
    if(com==0x15){
      //Encender todas      
            
              myDFPlayer.play(5); //Activado
              delay(1500);
              myDFPlayer.pause();
              
              //Encender luces//
              Serial.write("Todas");
              digitalWrite(led1, HIGH);
              digitalWrite(led2, HIGH);
              digitalWrite(led3, HIGH);
              digitalWrite(led4, HIGH);
              luzSalon=1;
              luzBano=1;
              luzCocina=1;
              luzGaraje=1;
              
              grupo_activo=1;
              myVoiceSerial.listen();
              importGroup(1);
    }
  }

  
  
  while(grupo_activo==3){
    com = myVoiceSerial.read();
    
    if(com==0x11){
      //Play música   
            myDFPlayer.play(pista_actual);

      
    }
    if(com==0x12){
      //Pausar música
            myDFPlayer.pause();     
            grupo_activo=1;
            myVoiceSerial.listen();
            importGroup(1);

      
    }
    if(com==0x13){
          //Pone la canción anterior 
          Serial.print("Anterior");
            if(pista_actual>10){
              pista_actual--;
            }else{
              pista_actual=13;
            }
            myDFPlayer.play(pista_actual);
      
    }
    if(com==0x14){
      
            Serial.print("Siguiente");
            if(pista_actual<13){
              pista_actual++;
            }else{
              pista_actual=10;
            }
            myDFPlayer.play(pista_actual);
      
    }
    if(com==0x15){
      
      if(fiesta==0){
        Serial.print("Fiesta");
        myDFPlayer.play(7);
        delay(2000);
        myDFPlayer.play(random(10,14));
        fiesta=1;
        
      }else{
        Serial.print("Fiesta fuera");
        myDFPlayer.pause();
        fiesta=0;
        grupo_activo=1;
        myVoiceSerial.listen();
        importGroup(1);        
      }

    }
    fiestaHandler();
  }
        delay(1000);
      
}
//ARDUINO 2 - PANTALLA LCD Y LECTURA DE SENSORES
// Includes sensor de temperatura y humedad
#include <dht.h>

// Includes pantalla lcd
#include <LiquidCrystal.h>


LiquidCrystal lcd(7,8,9,10,11,12);  // set the LCD address to 0x27 for a 16 chars and 2 line display

dht DHT;

#define DHT11_PIN 13

// Sensor cardiaco
int sensor_pin = 0;
double alpha = 0.75;
int period = 20;
double refresh = 0.0;



// Sensor inclinacion
int SENSORINCLINACION = 5;      
int ESTADO;                 

// Motor
int MOTOR = 2;    
int buzzer = 4;      // selecciona el pin para el zumbador

// Sensor temperatura y humedad
int valorSensor = 0;  // variable para almacenar el valor proveniente del sensor

void setup(){
  
 Serial.begin(9600);
 // declarar buzzer como una SALIDA:
 pinMode(A1,INPUT);
  pinMode(buzzer, OUTPUT);

  pinMode(MOTOR,OUTPUT);
  pinMode(SENSORINCLINACION, INPUT);  


}


void loop()
{

  static double old_value=0;
  static double old_refresh=0;

   lcd.begin(16,2);

    // Ritmo cardiaco
  int beat = analogRead(A1);
  double value = alpha * old_value + (0 - alpha) * beat;
  refresh = value - old_value;
  old_value=value;
  old_refresh=refresh;

  // Inclinacion
  ESTADO = digitalRead(SENSORINCLINACION); 
  int chk = DHT.read11(DHT11_PIN);
  if(DHT.temperature>32) {
    digitalWrite(MOTOR,HIGH);
  } else {
    digitalWrite(MOTOR,LOW);
  }
  valorSensor = analogRead(A0);

  // Humedad y temperatura
  lcd.setCursor(0,0);
  lcd.print("Temperature = ");
  lcd.print(DHT.temperature);
  
  lcd.print("Fuego = ");
  if(valorSensor < 650) {
    lcd.print("positivo  ");
    digitalWrite(buzzer, HIGH);
  } else {
    lcd.print("negativo  ");
    digitalWrite(buzzer, LOW); 
  }
  
  lcd.setCursor(0,1);
  lcd.print("Humidity = ");
  lcd.print(DHT.humidity);
  
   if (ESTADO == HIGH) {
   lcd.print("   Peligro derrumbe");
  } else {
    lcd.print("   Sin peligro");
  } 

  
  delay(1300);
  for(int i=0;i<19;i++) {
  lcd.scrollDisplayLeft();
  }
  delay(1300);

  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Latido: ");
  lcd.setCursor(0,1);
  lcd.print(beat/10);
  lcd.print("  ");
  delay(1300);
  
  
}

Autoría

Este proyecto ha sido realizado por:

  • Carlos Colmenero Gómez-Cambronero
  • Álvaro López Sierra
  • Pablo Bayona González
  • Sergio Arévalo Gil

Alumnos del Doble Grado en Diseño y Desarrollo de Videojuegos e Ingeniería de Computadores de la Universidad Rey Juan Carlos.

También te podría gustar...

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *