viernes, 24 de abril de 2015

Tutorial: Uso de un sensor PIR para Domótica

Sensor PIR

Protoboard de Electrohobby

El tutorial de hoy se basa en el sensor PIR. Este sensor es el típico sensor de proximidad que se usa en edificios grandes para que la luz sólo esté encendida cuando se encuentra alguien por las inmediaciones.

Nuestro sensor PIR posee diferentes elementos. Tres pines (VCC, GND y OUT) y dos potenciómetros TX y SX que regularán el tiempo de permanencia de la respuesta y el umbral de actuación del sensor (entre 3m y 7m).

Además usaremos un Relé con la misma configuración que en el otro tutorial de domótica.

Las conexiones las efectuaremos como siguen:

Rele:
  • VCC con 5V
  • GND con GND 
  • IN con pin 8

PIR:
  • GND con GND
  • OUT con pin 7
  • VCC con 5V

Programa:
#include <Arduino.h>

//sensor PIR
//tiempo que el sensor nos da a calibrar
int tcalibracion=10;

//el tiempo cuando el sensro nos da un impulso de baja
long unsigned int lowIn;

//cantidad de respuesta en milisegundos debe de ser baja
//ademas, antes de asumir los movimientos debe detenerse (posicion inicial)
long unsigned int pause = 5000;

boolean lockLow = true;
boolean takeLowTime;

int pirPin = 7; //pin digital conectado a la salida del sensor
int RelePin= 8; //pin conectado a la instrucción del relé

///Vamos con el SETUP

void setup(){
  Serial.begin(9600);
  pinMode(pirPin, INPUT);
  pinMode(RelePin, OUTPUT);
  digitalWrite(pirPin, LOW);

  //daremos un tiempo de calibración al sensor
  Serial.print(" Calibrando sensor ");
  for(int i=0; i< tcalibracion; i++){
    Serial.print(".");
    delay(1000);
  }
Serial.println("hecho");
Serial.println("SENSOR ACTIVO");
delay(50);
}
//vamos a la función bucle
void loop(){
  if(digitalRead(pirPin) == HIGH){
    digitalWrite(RelePin, HIGH); //el relé recibe el estado de salida del sensor en mi caso mi relé funcionaba al revés, si es vuestro caso cambiar HIGH por LOW y en la otra instrucción al revés.
    if(lockLow){
      lockLow = false;
      Serial.println("---");
      Serial.print("movimiento encontrado a los ");
      Serial.print(millis()/1000);
      Serial.println(" segundos ");
      delay(50);
    }
    takeLowTime = true;
    delay(20000);
  }
  if(digitalRead(pirPin) == LOW){
    digitalWrite(RelePin, LOW);
 
    if(takeLowTime){
      lowIn = millis();
      takeLowTime = false;
      delay(50);
    }
 
    if(!lockLow && millis() - lowIn > pause){
      lockLow= true;
      Serial.print("Movimiento detenido a los ");
      Serial.print((millis() - pause)/1000);
      Serial.println( " segundos ");
      delay(50);
    }
  }
}

Como siempre para cualquier duda o pregunta, no dudéis en comentarlo más abajo o enviárnosla a través de ecda.info@gmail.com

Un saludo.

C.