Autor Tema: Programa domotizar iluminacion con sensor PIR  (Leído 3900 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado sokoloko

  • PIC12
  • **
  • Mensajes: 77
Programa domotizar iluminacion con sensor PIR
« en: 17 de Noviembre de 2010, 06:38:38 »
Hola amigos!!

Hace un par de dias compre en un centro comercial una "linterna de leds" de esas para poner dentro de los armarios, que van con 3 pilas AAA y tienen 3 leds y un sensor PIR ( http://cdn.shopify.com/s/files/1/0038/9582/files/330600005.pdf ).

Dandole vueltas, he pensado usar ese sensor para automatizar la iluminacion de mi pasillo, pues el sensor funcionan muy bien, por ejemplo no se activan con un gato ni perro, pero en cuanto se acerca una persona a menos de 5 metros, se activa.

La idea es conectar el PIR a un PIC 12F683, poner una LDR para que solo se accionen los detectores cuando es de noche, y si se detecta una persona, se activa la luz durante 30 sg, pasado este tiempo, si no detecta movimiento, se desconectan las luces (pongo 30 sg pues es solo un lugar de paso).

De primeras me parecia un proyecto sencillo y util, aparte de economico. Pero he empezado con la programacion para activar el senor, y ya no hay forma de que detecte nada.

El programa lee el valor del sensor PIR, y lo compara la lectura anterior, si detecta cambios activa la salida.

Alguno se le ocurre que puede estar mal?? Con un potenciometro en lugar del PIR funciona perfectamente....

Os dejo el codigo, Saludos.

Código: [Seleccionar]
// Control temporizado con PIC 12F683
// Control de dos sensores de presencia
// Con 2 salidas que se mantienen durante 30 sg



#include <12f683.h>
#device adc=8
#fuses   INTRC_IO,NOWDT,PUT,NOPROTECT,NOBROWNOUT,NOIESO,NOCPD,NOFCMEN,NOMCLR
#use  delay(clock=4000000)   
#use  fast_io(A)
#byte port_A = 0x05 

#define OUT1 PIN_A5     //pin de salida 1

int S1_OLD=0;  // Valor anterior del sensor
int S1_NOW=0;  // Valor actual del sensor
int DIF=0;     // Diferencia de valores
int T1=0;     // Valor de temporizacion 1


void LeerEntradas (void) {   // Leo el valor analogico de la señal del sensor.
        set_adc_channel(0);
        delay_us(10);
        S1_NOW=read_adc();
}

void ValidarSensores (void) { 

    DIF=abs(S1_OLD-S1_NOW);

    if(DIF>=10)   //Si la diferencia entre el valor anterior del sensor y el nuevo es mayor que 10,
        T1=300;   // activamos la salida y la temporizacion 30 veces.

    S1_OLD=S1_NOW;  // Guardamos el valor como viejo para la siguiente comparacion.
 
}

void ControlSalidas (void) {

    if (T1>1) {       // Si hay tiempo que temporizar, activo las salidas.
        output_high(OUT1);
        delay_ms(1000);     //Espero un sg tras temporizar   
        T1--;
    }else{
        output_low(OUT1); // Si no necesita temporizar apaga
    }

}
//----------------------------------Funcion Main--------------------------------------
void Main(void) {                //Funcion principal del microprocesador.

   setup_oscillator(OSC_4MHZ);     
   set_tris_A(0x00);                       // Puerto A como salida.
   port_A = 0b00000000;                    // Salidas todas a cero.

    //CONFIGURACIÓN CONVERSOR AD
    SETUP_ADC(ADC_CLOCK_INTERNAL); //TIEMPO DE CONVERSION Fosc/8
    SETUP_ADC_PORTS(sAN0);      // CONFIGURACION DE AN0 COMO CANAL ANALÓGICO 1
    SET_ADC_CHANNEL(0);         //SELECCIONAMOS EL CANAL 0 PARA LA CONVERSION

   while(1){

        LeerEntradas();
        ValidarSensores();
        ControlSalidas();
        delay_ms(100);  // regula el tiempo de temporizacion 0,1 sg
    }
}