Práctica 11 - Fotoresistencias y El Microcontrolador ESP32
Práctica 11 - Fotoresistencias y El Microcontrolador ESP32
Práctica 11 - Fotoresistencias y El Microcontrolador ESP32
Sistemas Empotrados
En la oscuridad, su resistencia es muy alta, algunas veces hasta 1 MΩ, pero en la presencia de
la luz la resistencia cae hasta valores tan pequeños como unos cuantos ohms, dependiendo de
la intensidad de la luz. La sensitividad de las fotoresistencias depende de la longitud de onda
de la luz.
Figura 1
Objetivo
Equipo y Materiales
1 Microcontrolador ESP32 DEVKIT DOIT de 30 pines
1 Base para el Microcontrolador ESP32 DEVKIT DOIT de 30 pines
1 Cable USB a micro USB
1 Protoboard
1 Fotoresistencia
1 Resistencia de 10 KΩ
1 Resistencia de 220 Ω
1 LED
Cables Dupont macho – hembra
Cables Dupont macho – macho
Procedimiento
Controlar el encendido de un LED usando una fotoresistencia y un microcontrolador
ESP32
2. Usando el IDE 2.0 de Arduino, edite el siguiente programa. Guárdelo con el nombre de
fotoresLed.ino y compílelo.
fotoresLed.ino
/*
* fotoresLED.ino
*
* Este programa hace que el LED de status del microcontrolador
* ESP32 DEVKIT DOIT de 30 pines o un LED conectado al pin 2,
* se encienda o apague dependiendo de la intensidad de la luz
* de ambiente. Si el nivel de luz es muy bajo, el LED
* se enciende y si es alto, se apaga.
*
* Para medir la intensidad de la luz de ambiente se usa una
* fotoresistencia conectada en serie con una resistencia de 10
* Kohms formando un divisor de voltaje. La fotoresistencia esta
* colocada entre el pin 3V3 y el pin 34 y la resistencia de
* 10Kohms entre el pin 34 y el pin GND. El voltaje de salida del
* divisor se alimentara al pin 34 y sera muy pequeño en la
* oscuridad y aumentara hasta a medida que la luz de ambiente
* aumente.
*
* La lectura de la intensidad de luz se hace cada PAUSA s.
* No usa la funcion delay(). En lugar de ello utiliza la
* biblioteca NoDelay. Esto permite que otro codigo ejecute al
* mismo tiempo que se encuentra en el periodo de espera.
*/
#include <NoDelay.h>
void apagaLED();
void enciendeLED();
void setup() {
// Establece el pin PIN_LED (GPIO2) como de salida.
pinMode(PIN_LED, OUTPUT);
void loop() {
// Verifica si es tiempo de leer la intensidad de la luz
if (pausa.update()) {
// Lee y digitaliza el valor del voltaje en la
// fotoresistencia
unsigned valorADC = analogRead(PIN_FOT);
Serial.print("Intensidad de luz (0 - 4095): ");
Serial.println(valorADC);
// Prender/apagar el LED
switch(edoLed) {
case LED_APAGADO:
// Si la intensidad de luz <= NIVEL_ON,
// enciende el LED
if(valorADC <= NIVEL_ON)
enciendeLED();
break;
case LED_ENCENDIDO:
// Si la intensidad de luz >= NIVEL_OFF,
// apaga el LED
if(valorADC >= NIVEL_OFF)
apagaLED();
}
}
}
/**
* Esta funcion apaga el LED de status del microcontrolador
* ESP32 DEVKIT DOIT de 30 pines o un LED conectado al pin 2
* También actualiza la variable edoLed al valor LED_APAGADO
*/
void apagaLED() {
// Apaga el LED
digitalWrite(PIN_LED, LOW);
// Actualiza la variable que guarda el estado del LED
edoLed = LED_APAGADO;
Serial.println("LED apagado");
}
/**
* Esta funcion enciende el LED de status del microcontrolador
* ESP32 DEVKIT DOIT de 30 pines o un LED conectado al pin 2
* También actualiza la variable edoLed al valor ENCENDIDO
*/
void enciendeLED() {
// Enciende el LED
digitalWrite(PIN_LED, HIGH);
// Actualiza la variable que guarda el estado del LED
edoLed = LED_ENCENDIDO;
Serial.println("LED encendido");
}
5. Abra el monitor serie. Los valores de voltaje (que son proporcionales a la intensidad de
luz) leídos del pin GPIO34 del microcontrolador ESP32 deberán aparecer en el monitor
serie.
8. Abra el graficador serial. Varíe la intensidad de luz que recibe la fotoresistencia cubriéndola
parcial o totalmente o iluminándola mediante una fuente de luz y observe los cambios en
la gráfica.
2. Usando el IDE 2.0 de Arduino, edite el siguiente programa. Guárdelo con el nombre de
fotoresLedPWM.ino y compílelo.
fotoresLedPWM.ino
/*
* fotoresLedPWM.ino
*
* Este programa hace que el led conectado al pin 16 del
* microcontrolador ESP32 DEVKIT DOIT de 30 pines, encienda
* con una intensidad controlada por un canal PWM. El ciclo
* de trabajo del canal PWM estara controlado por la intensidad
* de la luz de ambiente. Si el nivel de luz disminuye, el
* ciclo de trabajo aumenta, con lo que el LED aumentara su
* brillantes hasta quedar encendida. Si el nivel de luz
* aumenta, el ciclo de trabajo disminuye, con lo que el
* LED disminuira su brillantes hasta quedar apagado.
*
* Para medir la intensidad de la luz de ambiente se usa una
* fotoresistencia conectada en serie con una resistencia de 10
* Kohms formando un divisor de voltaje. La fotoresistencia esta
* colcada entre el pin 3V3 y el pin 34 y la resistencia de
* 10Kohms entre el pin 34 y el pin GND. El voltaje de salida del
* divisor se alimentara al pin 34 y sera muy pequeño en la
* oscuridad y aumentara hasta a medida que la luz de ambiente
* aumente.
*
* La lectura de la intensidad de luz se hace cada PAUSA s.
* No usa la funcion delay(). En lugar de ello utiliza la
* biblioteca NoDelay. Esto permite que otro codigo ejecute al
* mismo tiempo que se encuentra en el periodo de espera.
*/
#include <NoDelay.h>
void actualizaCicloTrabajo();
void setup() {
// Configura los parametros de la señal PWM
ledcSetup(CANAL_PWM, FRECUENCIA, RESOLUCION);
// Establece el canal PWM al pin PIN_LED (GPIO16).
ledcAttachPin(PIN_LED, CANAL_PWM);
void loop() {
// Verifica si ha transcurrido el tiempo dado por PAUSA
if (pausa.update()) {
// Establece el valor del ciclo de trabajo de la señal
// PWM en función del voltaje en la fotoresistencia
actualizaCicloTrabajo();
}
}
/**
5. Abra el monitor serie. Los valores de la intensidad de luz leídos del pin GPIO34 del
microcontrolador ESP32 deberán aparecer en el monitor serie. También el LED encenderá
con una intensidad inversamente proporcional a la intensidad de luz ambiental.
1. Usando el IDE 2.0 de Arduino, edite el siguiente programa. Guárdelo con el nombre de
fotoresLedPWMCal.ino y compílelo.
fotoresLedPWMCal.ino
/*
* fotoresLedPWMCal.ino
*
* Este programa hace que el led conectado al pin 16 del
* microcontrolador ESP32 DEVKIT DOIT de 30 pines, encienda
* con una intensidad controlada por un canal PWM. El ciclo
* de trabajo del canal PWM estara controlado por la intensidad
* de la luz de ambiente. Si el nivel de luz disminuye, el
* ciclo de trabajo aumenta, con lo que el LED aumentara su
* brillantes hasta quedar encendida. Si el nivel de luz
* aumenta, el ciclo de trabajo disminuye, con lo que el
* LED disminuira su brillantes hasta quedar apagado.
* El programa escala los valores empleados por la
#include <NoDelay.h>
void setup() {
// Configura los parametros de la señal PWM
ledcSetup(CANAL_PWM, FRECUENCIA, RESOLUCION);
// Establece el canal PWM al pin PIN_LED (GPIO16).
ledcAttachPin(PIN_LED, CANAL_PWM);
void loop() {
// Verifica si ha transcurrido el tiempo dado por PAUSA
if (pausa.update()) {
// Establece el valor del ciclo de trabajo de la señal
// PWM en función del voltaje en la fotoresistencia
actualizaCicloTrabajo();
}
}
/*
* void calibraSensor()
*
* Esta funcion determina los valores maximo y minimo de los valores
* leidos por el sensor de acuerdo a las condiciones del ambiente
*/
void calibraSensor(int *pValorSensorMin, int *pValorSensorMax,
int pinSensor, unsigned long tiempoCal) {
unsigned long inicio = millis();
/**
* Esa función establece el valor del ciclo de trabajo de la señal
4. Abra el monitor serie. Los valores de la intensidad de luz leídos del pin GPIO34 del
microcontrolador ESP32 deberán aparecer en el monitor serie. También el LED encenderá
con una intensidad inversamente proporcional a la intensidad de luz ambiental.