En este proyecto utilizaremos una fotocelda con nuestro Arduino. Las fotoceldas o fotoresistencias son semiconductores cuya resistencia varía según la intensidad de la luz que reciben, por lo que a mayor intensidad menor resistencia.
Utilizaremos un puerto analógico para capturar el valor que nos entrega la fotocelda, no olvidemos que en el Arduino los puertos analógicos capturan valores entre 0-1023, por lo que estaremos trabajando con estos valores en en proyecto.
Componentes
Lo primero que vamos a hacer es ver por monitor serial los valores capturados por el Arduino.
Código 1
int fotocelda=A0; int valor=0; void setup() { Serial.begin(9600); } void loop() { valor=analogRead(fotocelda); Serial.println(valor); }
Explicación del código
Vamos a revisar un poco el código, comenzando con las declaraciones de variables:
int fotocelda=A0; int valor=0;
Declaramos 2 variables de tipo entero (int), la primera fotocelda=A0, que va a corresponder al pin análogo 0 donde esta nuestra fotocelda y la variable valor=0 que utilizaremos más adelante en el loop para almacenar el valor que nos envía la fotocelda.
Función setup()
Vamos a revisar la función setup:
Serial.begin(9600);
Solo tenemos una línea, Serial.begin(9600), en la que inicializamos la comunicación serial a una velocidad de 9600 baudios, gracias a esta conexión podremos ver en la consola de serie los valores que enviamos desde muestro Arduino.
Función loop()
En la función loop vamos a ver las siguientes dos líneas:
valor=analogRead(fotocelda); Serial.println(valor);
En la línea valor=analogRead(fotocelda) asignamos a la variable «valor» lo que que leemos desde el puerto A0 del Arduino, es decir la que hemos capturado de nuestra fotocelda, seguido a esto procedemos a enviar el valor a nuestro monitor serial en el computador a través de la conexión serial con la línea Serial.println(valor)
.
Así seria un resultado de los valores que registra el Arduino si hay una fuente de luz, por ejemplo iluminándola con una linterna directamente.
Así seria un resultado de los valores que registra el Arduino si no hay buena fuente de luz, por ejemplo cubriendo la fotocelda con algún objeto.
Resultado
En este primer proyecto veremos que al capturar los valores de la fotocelda cuando hay una muy buena fuente de luz los valores se aproximan a 1023 y cuando se decrementa la intensidad de luz hasta la oscuridad los valores se acercan a 0.
Código 2 +LED
const int ledPin = 11; const int fotocelda = A0; int valor=0; void setup() { Serial.begin(9600); pinMode(ledPin, OUTPUT); pinMode(fotocelda, INPUT); } void loop() { int valor = analogRead(fotocelda); if (valor <= 200) { Serial.print("Hay poca luz, el LED está encendido: "); Serial.println(valor); digitalWrite(ledPin, HIGH); } else { Serial.print("Hay buena luz, el LED está apagado: "); Serial.println(valor); digitalWrite(ledPin, LOW); } }
En este segundo ejemplo vamos a utilizar el Arduino y la fotocelda para controlar que un LED se encienda cuando hay poca iluminación.
El código es muy simple ya que reutilizamos el código anterior solo que vamos a tener una condición que nos determina cuando no hay suficiente iluminación para ordenarle al LED que se encienda.
Explicación del código
Lo primero que vamos a revisar son las declaraciones de variables.
const int ledPin = 11; const int fotocelda = A0; int valor=0;
Como es de costumbre lo primero es la declaración de las variables, esta vez utilizamos la palabra reservada const antes de la declaración, esto declara una constante en vez de una variable y como su nombre lo indica no se puede cambiar en ningún momento adelante en el código, como son puertos de entrada y salida normalmente no cambian a medida que se ejecuta el programa, por esto los declaramos como constantes.
Lo primero que declaramos es const int ledPin = 11
, con lo que asignamos a la constante ledPin el valor de 11, que será el pin de salida digital donde conectaremos el LED. En la siguiente línea const int fotocelda = A0
asignamos «A0» a la constante fotocelda, la cual utilizaremos como el puerto de entrada de la fotocelda. Por último declaramos una variable «valor», int valor=0
, la cual sera utilizada más adelante para asignarle el valor que nos entrega el puerto A0.
Función setup()
Serial.begin(9600); pinMode(ledPin, OUTPUT); pinMode(fotocelda, INPUT);
Inicializamos la comunicación serial Serial.begin(9600)
con el computador, estableciendo una velocidad de 9600 baudios. Luego vemos pinMode(ledPin, OUTPUT)
, donde establecemos que el pin 11, el cual es el ledPin es un puerto de salida. Por último, pinMode(fotocelda, INPUT)
, en esta línea establecemos que el pin A0, es decir el pin de la fotocelda es un pin de entrada.
Función loop()
valor = analogRead(fotocelda); if (valor <= 200) { Serial.print("Hay poca luz, el LED está encendido: "); Serial.println(valor); digitalWrite(ledPin, HIGH); } else { Serial.print("Hay buena luz, el LED está apagado: "); Serial.println(valor); digitalWrite(ledPin, LOW); }
En la función loop encontraremos un código que podría parecer muy complejo, pero al revisarlo es muy simple. Vamos a analizarlo.
Primero encontramos la siguiente línea valor = analogRead(fotocelda),
en la que le asignamos el valor que nos devuelve el pin A0 a la variable valor.
La segunda parte es un if (una condicional), donde miramos si el valor es menor o igual a 200, if (valor <= 200)
.
Si esta condición se cumple se ejecuta todo el bloque que vemos a continuación.
Serial.print("Hay poca luz, el LED está encendido: "); Serial.println(valor); digitalWrite(ledPin, HIGH);
La primer linea de ese bloque es Serial.print("Hay poca luz, el LED está encendido: ")
imprimiría en el monitor serial Hay poca luz, el LED está encendido: y luego imprimiría en frente el valor de la variable «valor»,Serial.println(valor). Por último encendería el LED, digitalWrite(ledPin, HIGH)
.
Por otro lado, si la condición valor <= 200
(esto es un valor de poca iluminación) no se cumple, el código iría automáticamente al bloque else:
Serial.print("Hay buena luz, el LED está apagado: "); Serial.println(valor); digitalWrite(ledPin, LOW);
Las dos primeras línea de este bloque imprimen por consola, la primera imprime Hay buena luz, el LED está apagado: , Serial.print("Hay buena luz, el LED está apagado: ")
. La segunda imprime el valor de la variable «valor», Serial.println(valor)
. Por último digitalWrite(ledPin, LOW)
, hace que se apague el LED.
Resultado
Con nuestro proyecto logramos que si hay una fuente de luz sobre nuestra fotocelda el Arduino mantiene el LED apagado y cuando hay una interrupción en la fuente de luz, el LED se enciende.