Detector de presencia con una resistenicia fotoeléctrica (LDR) -Tiene otros usos

Aquí pongo el código modificado y mejorado, que permite al detector adaptarse a cambios de luz progresivos, normales en ambientes iluminados con luz natural. El anterior código no tenía en cuanta los cambios de tensión suaves y progresivos producidos en la fotoresistencia, debido a los cambios naturales de la intensidad de la luz, que varían dependiendo de la hora del día. El actual código si los tiene en cuenta y se reajusta automáticamente cada 10 segundos. Este plazo de tiempo se puede cambiar con facilidad, cambiando la variable "tiempoadaptacion".

También se a modificado el código, para que no se active el detector nada más encender el arduino, evitando así, falsos positivos al arrancar el programa.

/*
- Este programa es un disparador, que activa una salida lógica si detecta un cambio de tensión en su entrada analógica, dentro de un rango establecido por el usuario.
- Las aplicaciones pueden ser por ejemplo, como detector en alguna aplicación que use un sensor que pueda producir variaciones de tensión.
- El circuito de ejemplo usa una resistencia fotoeléctrica (LDR) para hacer un detector de presencia o de movimiento, de los del tipo PIR.

CONEXIONADO.

CONECTAR LA LDR AL TERMINAL POSITIVO
CONECTAR UNA RESISTENCIA DE 33k EN SERIE CON LA RESISTENCIA FOTOELÉCTRICA (LDR) Y CONECTAR EL EXTREMO LIBRE A MASA.
CONECTAR LA ENTRADA ANALÓGICA "CERO" DEL ARDUINO ENTRE LA RESISTENCIA LDR Y LA RESISTENCIA DE 33k. ES DECIR, ENTRE LOS DOS COMPONENTES.

CONECTAR UN EL ÁNODO DE UN DIODO LED AL TERMINA DIGITAL 2
CONECTAR EL CÁTODO DEL DIODO LED A UNA RESISTENCIA DE 220 OHMIOS Y LA RESISTENCIA A MASA.

FUNCIONAMIENTO

EL LED SE ENCENDERÁ SI LA VARIACIÓN DE TENSIÓN DETECTADA POR LA ENTRADA ANALÓGICA 0 DEL ARDUINO SUPERA UN DETERMINADO RANGO, ESTABLECIDO POR LA CONSTANTE.

Si pasamos la mano frente a la resistencia LDR el LED se encenderá, por la variación de tensión detectada por el arduino en su entrada.
Si al LDR lo colocamos en el interior de un capuchón de un bolígrafo BIC (de esos que tienen un agujero), usaremos el capuchón como cámara oscura rudimentaria, que permitirá a la LDR detectar el movimiento a distancias mayores.

ESTE CIRCUITO A SIDO PROBADO Y FUNCIONA CORRECTAMENTE

EL USUARIO TENDRÁ QUE AJUSTAR LA SENSIBILIDAD DEL DISPOSITIVO, CAMBIANDO EL VALOR DE LA VARIABLE LLAMADA RANGO QUE POR DEFECTO ESTÁN EN 5, PUDIENDO SE PONER ENTRE 1 (MÁXIMA SENSIBILIDAD) O VALORES MAYORES, QUE DEPENDERÁN DE LA TENSIÓN DE ENTRADA Y LAS VARIACIONES.

ULTIMA MEJORA

EL PROGRAMA DISPONE DE UN BUCLE FOR, QUE PERMITE AL PROGRAMA IGNORAR LOS CAMBIOS SUAVES, CORRESPONDIENTE A CAMBIOS PRODUCIDOS A INTERVALOS SUPERIORES A LOS 10 SEGUNDOS.

TAMBIÉN SE A MODIFICADO EL CÓDIGO PARA QUE NO SE ACTIVE EL LED NADA MÁS PONER EN FUNCIONAMIENTO EL ARDUINO, COSA QUE ANTES SÍ HACÍA, DANDO ASÍ, UN FALSO POSITIVO.

*/
const long tiempoadaptacion=10; // tiempo de adaptación a los cambios progresivos. Evita que el programa de falsos positivos, en cambios de tensión suaves y progresivos. Por defecto su valor es 10 y corresponde a un tiempo de 10 segundos de adaptación. Esto es últil para evitar falsos positivos en el caso de que la fotoresistencia esté iluminada por luz ambiental, que irá aumentado o disminuyendo según las horas del día.
const long rango=6; // este es el rango por el que se disparará la salida 2 y pasa a estado lógico 1
const long tiempo=1000; // tiempo que permanecerá activa la salida 2 en caso de pasar a estado lógico 1
long sensorValue; // Declaración de la variable que contendrá le lectura de tensión del pin analógico cero, del arduino;
long ultimamedicion; // contiene el valor de la última medición que disparó a lógico 1, la salida 2

void setup() {
 //Serial.begin(9600); // esto es para poder leer por el puerto serie los valores medidos
  pinMode(A0, INPUT); // se establece el pin analógico 0 del arduino como pin de entrada de datos
  pinMode(2, OUTPUT); // se establece el pin digital 2 del arduino como pin de salida de datos
  long sensorValue = analogRead(A0); // este trozo de código, se pone aquí, para evitar que el programa de un falso positivo nada más ponerse en funcionamiento
  ultimamedicion = sensorValue; // este trozo de código, se pone aquí, para evitar que el programa de un falso positivo nada más ponerse en funcionamiento
}

void loop() {
  

 for (int i=0; i <= 1000; i++){ // El bucle FOR sirve para que transcurrido un tiempo de 10 segundos, se asigne automáticamente el valor leído por la fotorresistencia a la variable última medición. Esto se hace para que el programa se adapte gradualmente a los cambios suaves de luz, normales en ambientes de luz natural. Si no se hiciese esto, el detector daría falsos positivos, por la normal caída o aumento de la luz ambiental,motivadas por la hora del día.

  long sensorValue = analogRead(A0); // se asigna a la variable "sensorValue" el valor leído por el pin analógico 0, correspondiente a la tensión leída en la fotorresistencia
  
  if (sensorValue >= ( ultimamedicion+rango)) // La salida 2 pasa a 1 lógico si la tensión medida en la entrada analógica 0 es mayor que la anterior lectura + la tensión de RANGO
  {
    digitalWrite(2, HIGH); // se enciende el LED
    ultimamedicion = sensorValue; 
    delay(tiempo); // tiempo que permanece encendido el led
  }
  else  // La salida 2 pasa a 0 si la tensión medida en la entrada analógica 0 no es mayor 
  {
  digitalWrite(2, LOW);
  }
  
  
    
  if (sensorValue <= ( ultimamedicion-rango))  // La salida 2 pasa a 1 lógico si la tensión medida en la entrada analógica 0 es menor que la anterior lectura - la tensión de RANGO
  {
    digitalWrite(2, HIGH);      
    ultimamedicion = sensorValue;
    delay(tiempo);
  }
  else
  {
  digitalWrite(2, LOW);
  }
    
 
  delay(tiempoadaptacion); // el tiempo de delay, determina cuanto tiempo en el que el programa se irá adaptando a los cambio suabes de tensión, medidos en la entrada cero del arduino. 
}

  // transcurridos 10 segundos, se asigna automáticamente el valor leydo por la fotoresistencia, a la variable "ultimamedicion", para que el programa se adapte a los cambios suaves y progresivos de tensión, producido por los cambios suaves y progresivos de luz y así evitar errores.
  long sensorValue = analogRead(A0);
  ultimamedicion = sensorValue;
 
  //Serial.println(sensorValue); // Por si quieres ver por el puerto serie las lecturas tomadas
  //Serial.println(ultimamedicion); // Por si quieres ver por el puerto serie las lecturas tomadas


}