Activando un ventilador por presencia

Mi experiencia más reciente con Arduino ha consistido en activar y desactivar de forma automática un pequeño ventilador de escritorio. La idea es que el ventilador se mantenga en funcionamiento durante todo el tiempo que pase sentando frente al ordenador (o haciendo uso del escritorio) y se desactive cuando abandone mi lugar de trabajo. 

 Materiales

Esquema

El esquema es muy sencillo, el pin Trig del sensor de ultrasonidos HC-SR04 se conecta al pin 9 de arduino y el pin Echo al pin 10 de arduino. La entrada del relé (IN) se conecta al pin 2 de arduino. Además se ha añadido un LED que nos indica cuando se produce un cambio en el interruptor, dicho LED está conectado al pin 13 de arduino.

Las salidas del relé hacen de interruptor del ventilador por esa razón están conectadas al interruptor del ventilador directamente. Se puede apreciar en la imagen que aparece a continuación.

Código

A continuación se muestra el código fuente para Arduino. Está comentado para una fácil comprensión.

/*
 * Software: Controlling a fan with an ultrasonic sensor
 * Date: 15/08/2014
 * Author: Cristóbal Medina López
 * Web: http://www.cristobalmedinalopez.es
 * License:
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
*/
 
const int ON=1, OFF=0;
const int RELAY=2, LED=13; //Relay PIN 2, LED PIN 13
const int TRIG=9, ECHO=10; //Trig PIN 9, Echo PIN 10
 
long cm=0; 
int current_state=OFF, lap=0;
 
int error_margin=2; 
int distance=65; // Distancia máxima para activar el ventilador en cm.
int frequency=500; //Frecuencia en milisegundos
 
void setup(){
  pinMode(RELAY, OUTPUT);
  pinMode(LED, OUTPUT);
  pinMode(TRIG, OUTPUT);
  pinMode(ECHO, INPUT);
  digitalWrite(RELAY, HIGH); //OFF
  Serial.begin(9600);
}
 
// Hacer parpadear el LED
void alert(){
  digitalWrite(LED, HIGH);
  delay(500);
  digitalWrite(LED, LOW); 
}
 
//Interruptor para el ventilador
void setFan(int state){
  if (state==ON){
    if (current_state==OFF){
      digitalWrite(RELAY, LOW); //ON
      current_state=ON;
      alert();
    }
  }else{
    if (current_state==ON){
      digitalWrite(RELAY, HIGH); //OFF
      current_state=OFF;
      alert();
    }
  }
}
 
long ranging(){
  long duration;
 
  // Un pulso a nivel bajo asegura un pulso a nivel alto limpio.
  digitalWrite(TRIG, LOW); 
  delayMicroseconds(2);
 
  // Un pulso a nivel alto >=2 ms dispara un ping en el sensor.
  digitalWrite(TRIG, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG, LOW);
 
  duration = pulseIn(ECHO, HIGH);
 
  // La velocidad del sonido 340 m/s (29 ms/cm).
  // La distancia del objeto es la mitad de la distancia total.
  return duration / 29 / 2;
}
 
 
 
void loop(){
  //Obtener la distancia
  cm=ranging(); 
  Serial.println(cm);
 
  if (cm<=distance){
    lap++;
  }else{
    lap--;
  }
 
  if (lap>=error_margin){
    lap=error_margin;
    setFan(ON);
  }
 
  if (lap<=-error_margin){
    lap=-error_margin;
    setFan(OFF);
  }  
 
  delay(frequency);
}

El código actualizado está disponible en mi cuenta de GitHub en el siguiente enlace: Código Arduino: Activando un ventilador por presencia

12 Comments

  1. Hola Luis,

    Si te refieres a poner otro sensor de ultrasonidos y tener dos para controlar el mismo ventilador, si, no habría ningún problema. La forma más sencilla sería usar otros dos pines de arduino para el nuevo sensor y monitorizarlo. Podrías modificar la función ranging() para pasarle por parámetro los pines TRIG y ECHO.

    Espero que te sea de ayuda.
    Un Saludo.

  2. Hola,para activarlo solo a partir de que me detecte a partir de 1,5 m en adelante modo ascendente(1,50m hasta 2m) no mas de esa distancia y no tenga un consumo elevado el arduino y sensor ya que lo quiero alimentar con pila recargable(el ventilador tendría su alimentación independiente sin problemas de consumo) que configuracion me podrias recomendar.
    Gracias de antemano..

  3. Para controlar el encendido/apagado se usa la función setFan. En concreto la orden:
    digitalWrite(RELAY, LOW); //ON

    Por tanto, deberías añadir la condición que necesites y cambiar el estado de LOW a HIGH según tus necesidades.

  4. Hola Leonardo,

    En principio sería modificar la variable \”distancia\”. Si vas a trabajar con una distancia inferior a 10, te recomiendo que reduzcas el margen de error al mínimo, que serían unos 0,3 cm.

    ¡Suerte!

  5. hola! Qué tendría que cambiar para que cuando detecte presencia en vez de ponerse en ON, sólo mande un pulso, ya que el interruptor se activa con una señal y habría que mandar otra señal para desactivarlo cuando no haya presencia. Muchas gracias

  6. Hola Luis,

    Podrías poner un setFan(ON), a continuación un delay del tiempo que necesites, y finalmente un setFan(OFF). Otra opción sería directamente usar la función digitalWrite si no necesitas el relé.

    Un saludo.

Deja un comentario

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