La sencillez de Arduino para interactuar con sensores hace que el desarrollo de proyectos solo tenga los límites de nuestra imaginación. En el siguiente artículo, usaremos una pequeña resistencia variable con la luz llamada LDR para ajustar la intensidad de un LED. Es un circuito bastante sencillo, pero es la base fundamental para proyectos más complejos.
Esquema eléctrico Arduino Mega.
Esquema gráfico Arduino Mega.
Índice de Contenido
Funcionamiento
Como se puede ver en el esquema eléctrico, en este circuito se usaran muy pocos componentes, un LED con su resistencia limitadora R1, la resistencia LDR junto a una resistencia de 1k que conforman un divisor de tensión del cual se analizará la variación de tensión.
Partiendo de un estado de iluminación, cuando a la LDR se le aplique una fuente de luz máxima su resistencia interna disminuirá (supongamos un caso ideal resistencia 0), por tanto, A0 tendrá un valor más bajo (si en el caso ideal LDR es 0 ohmios, A0 estaría conectado a GND, 0 voltios). Por el otro lado, al reducir a la mínima iluminación la resistencia de la LDR aumentará (supongamos un caso ideal resistencia infinita), A0 tendrá un valor más alto (si en el caso ideal LDR es infinito, circuito abierto, A0 es aproximadamente 5 voltios). Para valores intermedios de resistencia en la LDR, A0 tendrá valores intermedios.
Código
int lightPin = 0; // Pin LDR. int ledPin = 11; // Pin LED. int valor; // Variable para cálculos. int min = 988; // Valor minimo obtenido por A0. int max = 1018; // Valor maximo obtenido por A0. void setup(){ Serial.begin(9600); // Inicializa el puerto serie. pinMode( ledPin, OUTPUT ); // ledPin como salida. } void loop(){ valor = analogRead(lightPin); // Leemos el valor de A0. Serial.print ("Valor de entrada: "); Serial.println(valor); // Valor de entrada de A0. valor = constrain(valor, min, max); // Normalizamos el valor. valor = map(valor, min, max, 0, 255); // Re-mapeamos. analogWrite(ledPin, valor); // Escribimos el valor. Serial.print ("Valor de salida: "); Serial.println(valor); // Valor de salida del LED delay(1000); }
El código anterior muestra por puerto serie los valores de entrada de A0. Usaremos estos valores para calibrar nuestro sensor LDR. Expondremos la LDR a las condiciones máximas y mínimas de iluminación a las que normalmente será expuesta. Estos valores serán definidos en las variables max y min.
Valores de entrada de A0 vistos desde el puerto serie.
Una vez obtenidos los valores máximos y mínimos de A0 podremos sustituirlos en el siguiente código:
int lightPin = 0; // Pin LDR. int ledPin = 11; // Pin LED. int valor; // Variable para cálculos. int min = 988; // Valor minimo obtenido por A0. int max = 1018; // Valor maximo obtenido por A0. void setup(){ Serial.begin(9600); // Inicializa el puerto serie. pinMode( ledPin, OUTPUT ); // ledPin como salida. } void loop(){ valor = analogRead(lightPin); // Leemos el valor de A0. Serial.print ("Valor de entrada: "); Serial.println(valor); // Valor de entrda de A0. valor = constrain(valor, min, max); // Normalizamos el valor. valor = map(valor, min, max, 0, 255); // Re-mapeamos. analogWrite(ledPin, valor); // Escribimos el valor. Serial.print ("Valor de salida: "); Serial.println(valor); // Valor de salida del LED. //delay(1000); // Descomentar para calibrado. }
Descripción del código
constrain(valor, a, b);
Esta función normaliza valor a un rango [a,b]. Si valor es menor que a, el resultado de la función será a, si valor es mayor que b, el resultado de la función es b. De esta forma trabajaremos siempre con el margen de valores establecidos por min y max.
map(valor, min, max, 0, 255);
Re-mapea un número desde un rango hacia otro. Esto significa que valor con respecto al rango min-max será mapeado al rango 0-255. Esta función es útil para hacer la variación de luminosidad del LED. A medida que el rango entre min y max sea mayor, mayor serán los valores intermedios de luminosidad del LED, mayor suavidad en los cambios.
Resultado final.