Este tutorial es la continuación de nuestro último artículo sobre Arduino. En él, aprendimos a variar la intensidad de un LED mediante una resistencia LDR, ahora en este, haremos unos pequeños cambios para encender y apagar un LED dependiendo de la luz que reciba la LDR, algo más práctico que nuestro anterior tutorial.
Esquema eléctrico Arduino Mega.
Esquema gráfico Arduino Mega.
Funcionamiento
El funcionamiento es el mismo que se explicó en el tutorial LDR con Arduino – Ajuste de intensidad de un LED, recordemos como funciona.
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. int middle = 0; // Valor medio para encender o apagar el LED. 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. if(middle == 0){ // Si no hemos configurado manualmente un valor medio: middle = (max - min ) / 2; // Calculamos el valor medio. middle = middle + min; } Serial.print ("Valor medio: "); Serial.println(middle); // Valor de entrda de A0. if (valor >= middle){ // Si el valor leido es superior o igual al valor medio: analogWrite(ledPin, 255); // Encendemos LED. } else { analogWrite(ledPin, 0); // Apagamos 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.
Descripción del código
Tenemos una tercera variable para su configuración, middle, no es más que una variable para indicar para que valor realizar un cambio en el LED. Por defecto se encuentra definida a 0, y el mismo programa calculará un valor medio entre max y min. Si lo preferimos, podemos configurar manualmente esta variable, para que el LED se encienda antes o después.
Se ha usado una salida analógica para encender el LED, lo más usual es usar una salida digital si solo vamos a tener dos estados, pero de esta manera podremos ajustar la intensidad dependiendo de su uso.
Resultado final.