sábado, 20 de febrero de 2016

Arduino - Luces automáticas para tu casa

Hola, en esta primera entrada les voy a mostrar como hacer que unas luces se enciendan automáticamente al pasar con Arduino.

        -Materiales:
   Arduino UNO/Mega/Nano o similar.
   2 sensores ultrasónicos HC-SR04
   Un relé(Yo puse un Led pero simplemente es conectar un  rele en vez de el Led).




      -Aqui os dejo el esquema  y una explicación de colocación de componentes.




      1-Colocamos los sensores ultrasónicos en una protoboard ,o si lo van a incluir en su casa en un PCB.
      2-Ahora conectamos GND y 5V de Arduino con los sensores, después conectamos los pines trig y echo de los sensores a los pines digitales que queramos (en mi caso trig1 pin 7,echo1 pin 8 , trig 2 pin 12 y echo 2 pin 12).

      3-Una vez colocados los sensores colocamos en el lugar del Led  un relé 5V( con diodos  para no quemar el Arduino con corrientes inversas), un pin de el relé va a una salida digital y el otro a GND.


 -Funcionamiento de los sensores.
       En este caso usaremos la librería NewPing, así que no haría falta saber como funciona el sensor, pero si  no quieres usar la librería para controlar estos sensores lo explico:

El sensor funciona midiendo el tiempo  que tarda la onda desde que tu la mandas mediante el pin trig hasta que vuelve en el pin echo, así que seria así.

Como el pin trig es el que manda la señal de sonido cuando tu quieras accionarlo, empezaríamos el sketch de Arduino poniendo el siguiente código:

                                                                                                                                                                          
                                                                                                                                                                                
 void loop(){                                                                                                                                                        
digitalWrite(trig,LOW);                                                                                                                                    
delayMicroseconds(2);                                                                                                                                    
digitalWrite(trig,HIGH);                                                                                                                            
delayMicroseconds(10);                                                                                                                                    
digitalWrite(trig,LOW);                                                                                                                                    
}                                                                                                                                                                                
                                                                                                                                                                                 


Primero nos aseguramos de que esta apagado el sensor poniéndolo en LOW, después esperamos 2 microsegundos y ya accionamos el pin trig para mandar la onda, lo siguiente seria dejarle un tiempo a que reboten las ondas, y finalmente apagar el sensor.  Ahora hay que medir el tiempo que tardan las ondas en ir y venir así que  usamos la función "pulseIn" guardando el resultado en una variable (llamada duración  en mi caso).


                                                                                                                                                                                
duración = pulseIn(echo,HIGH);                                                                                                                                    
                                                                                                                                                                                


Ya una vez guardado el tiempo seria hacer una simple operación matemática, el tiempo que ha tardado al onda en volver / velocidad del sonido en  cm por microsegundo / 2 por que las ondas van y vuelven, así que si no lo dividiéramos la distancia seria el doble de la que es:


                                                                                                                                                                                
distancia = duración/29,1/2                                                                                                                                    
                                                                                                                                                                                

Y ya si queremos ver en el ordenador la distancia que mide el sensor usaríamos la comunicación serial, así que quedaría algo así:


 int trig = 2;    //Conectaríamos el pin trig en el 2(o cambiamos el pin en el que esta trig)                                     
int echo =4;   //Conectaríamos el pin echo en el 4(o cambiamos el pin en el que esta echo)                     
int distancia;                                                                                                                                                         
int duración;                                                                                                                                                         
                                                                                                                                                                                
void setup(){                                                                                                                                                        
pinMode(trig,OUTPUT);                                                                                                                                    
pinMode(echo,INPUT);                                                                                                                                    
Serial.begin(9600);                                                                                                                                                          
}                                                                                                                                                                                      
                                                                                                                                                                                
void loop(){                                                                                                                                                                     
digitalWrite(trig,LOW);                                                                                                                                    
delayMicroseconds(2);                                                                                                                              
digitalWrite(trig,HIGH);                                                                                                                             
delayMicroseconds(10);                                                                                                                             
digitalWrite(trig,LOW);                                                                                                                               
duración = pulseIn(echo,HIGH);                                                                                                                           
distancia = duración/29,1/2                                                                                                                           
Serial.print(distancia);                                                                                                                                
// Se puede poner un delay aquí para poder leer la medida.                                                                                  
}                                                                                                                                                                 
                                                                                                                                                                    


     -Programa
Yo repito, les voy a dar  el sketch con la librería NewPing así que tienen que descargársela, sin la libreria se las apañan ustedes con el código que he dado antes.




#include <NewPing.h>                                                                                                                                        
const int Trig1 = 7;                                                                                                                                        
const int Echo1 = 8;                                                                                                                                        
const int Trig2 = 12;                                                                                                                                        
const int Echo2 = 11;                                                                                                                                        
int personas = -1;           //Aqui guardaremos el nuero de personas que hay en la habtación.                                  
int distancia1;                                                                                                                                                         
int distancia2;                                                                                                                                                         
int duracion1;                                                                                                                                                         
int Led = 2;                                                                                                                                                         
int estado = 0;                                                                                                                                                         
int estadoAnterior ;                                                                                                                                        
NewPing Sonar2(Trig2,Echo2,500);                                                                                                                       
                                                                                                                                                                          
void setup() {                                                                                                                                                         
 pinMode(Trig1,OUTPUT);                                                                                                                       
 pinMode(Trig2,OUTPUT);                                                                                                                                      
 pinMode(Echo1,INPUT);                                                                                                                                        
 pinMode(Echo2,INPUT);                                                                                                                                        
 pinMode(Led,OUTPUT);             //Declaramos que el pin Led o rele sera una salida.                                             
Serial.begin(9600);                                                                                                                                        
}                                                                                                                                                                          
                                                                                                                                                                          
void loop() {                                                                                                                                                         
 digitalWrite(Trig1, LOW);                                                                                                                                        
 digitalWrite(Trig2, LOW);                                                                                                                               
            delayMicroseconds(2);                                                                                                                    
            digitalWrite(Trig1, HIGH);                                                                                                              
            delayMicroseconds(10);                                                                                                                   
            digitalWrite(Trig1, LOW);                                                                                                                            
            duracion1 = pulseIn(Echo1, HIGH);                                                                                                      
            distancia1 = duracion1 / 2 / 29.1 ;                                                                                                      
            if(distancia1 < 0){                                                                                                                                        
              distancia1 = distancia1 + distancia1;                                                                                                      
                                                                                                                                                                       
              }                                                                                                                                                         
            distancia2 = Sonar2.ping_cm();                                                                                                      
    if(distancia1 >60 && distancia2 <60 ){  //Si la distancia1 es mayor 60 y la 2 es menor a 60.                        
     delay(1000);                                                                                                                                        
    estado = 1;                               //Estado es 1.                                                                                                  
    personas = personas + 1;                //Y sumamos una persona a la sala.                                                   
                                                                                                                                                                              
    }                                                                                                                                                                          
    if(distancia2 >60 && distancia1 <60){   //Si la distancia2 es mayor 60 y la 2 es menor a 60.               
     delay(1000);                                                                                                                                                         
      estado= 0;                            //Estado es 0.                                                                                                      
      personas = personas - 1;              //Y restamos una persona a la sala.                                                   
      if(personas < 0){                     //Por si alguien intenta hacer  que las personas sean negativas                  evitando el sensor al entrar ,cuando las personas sean menor a 0.                                                                     
        personas = 0;                       //Personas sera 0.                                                                                     
        }                                                                                                                                                         
                                                                                                                                                                                
      }                                                                                                                                                                          
  if(estado == 1){                          //Si estado es 1.                                                                                                    
    digitalWrite(Led,HIGH);                 //Encendemos el Led/Relé.                                                                    
    }                                                                                                                                                                          
  if(estado == 0 && personas == 0){         //Si estado es 0 y hay 0 personas en la sala.                                
    digitalWrite(Led,LOW  );                //Apagamos el Led/Relé.                                                                    
    }                                                                                                                                                                          
                     
        Serial.println("personas");//Si quieres un contador deparsonas aqui lo tienes.
       Serial.println(personas);
  }
         

      
      
    
        
El contador de personas es por si entra alguien a tu cuarto y sale no se apague la luz y te deje a oscuras   xD



Gracias,por haber leido la entrada. 


Si no les funciona decírmelo ,por que por ejemplo a mi uno de los sensores me media mal con la librería así que lo hice sin la librería como podéis ver arriba.
      











No hay comentarios:

Publicar un comentario