lunes, 16 de marzo de 2015

Práctica 3.3.1: Entrada analógica con LDR y salida analógica con un LED


Muy probablemente el resultado sea decepcionante: el LED brilla poco y cuando pasamos la mano por encima de la fotoresistencia el brillo del LED baja un poco más, pero dependiendo de las condiciones de luz ambiental es probable que no se note apenas nada.
La solución es el calibrado del sensor, esto es, hacer una lectura de los valores que devuelve el sensor en el ambiente en el que va a trabajar y ajustar los valores de salida a este rango. Para ello emplearemos el comando map().

map(valor, desdeBajo, desdeAlto, hastaBajo, hastaAlto)

valor: el número (valor) a mapear.
desdeBajo: el límite inferior del rango actual del valor.
desdeAlto: el límite superior del rango actual del valor.
hastaBajo: límite inferior del rango deseado.
hastaAlto: límite superior del rango deseado.

Primero debes realizar el programa sin la línea de programación en rojo. Cuando leas los valores en pantalla de la entrada analógica, ya podras calcular cuales son los valores máximos y mínimos que alcanza la variable valor y podras ajustar el valor max y min.



int lightPin = 0;  //define el pin de la foto-resistencia
int ledPin=11;    //define el pin para el  LED

int valor;            //define una variable en la que haremos los cálculos
int min = 0;        //valor mínimo que da la foto-resistencia
 int max = 0;      //valor máximo que da la foto-resistencia

void setup() {
    Serial.begin(9600);  //Inicializa la comunicación serie
    pinMode( ledPin, OUTPUT );
}
void loop() {
    valor = analogRead(lightPin);
    valor = map(valor, min, max, 0, 255);  
    analogWrite(ledPin, valor);
    Serial.println(valor);
    delay(100); //pequeño retardo para darle tiempo al LED a responder y la escritura del valor leído.

  }

El comando map() re-mapea un número desde un rango hacia otro. Esto significa que, un valor contenido en el al rango desdeBajo-desdeAlto será mapeado al rango hastaBajo-hastaAlto.
No se limitan los valores dentro del rango, ya que los valores fuera de rango son a veces objetivos y útiles, así que si le pasamos un valor fuera del rango inicial calculará una salida dentro del rango de salida. Se puede utilizar el comando constrain() tanto antes como después de ésta función si es importante respetar los límites de los rangos.

Ten en cuenta que los límites “inferiores” de algún rango pueden ser mayores o menores que el límite “superior” por lo que map() puede utilizarse para revertir una serie de números, por ejemplo:
y = map(x, 1, 50, 50, 1);

La función maneja correctamente también los números negativos, por ejemplo:
y = map(x, 1, 50, 50, -100);
también es válido y funciona correctamente.

El comando map() usa matemática de enteros por lo que no generará números en coma flotante, es decir, su uso se limita a valores o variables del tipo int.
Trata de aplicar la función map() al ejercicio por ti mismo, de modo que el LED brille al mínimo cuando tapas con la mano la LDR y al máximo cuando la LDR capta la luz de ambiente. Si te atascas aquí tienes la solución, aunque te sentirás más orgulloso si lo resuelves sin mirar.

Fuente:  http://www.ardumania.es/ejercicio-4-ldr/

No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.