Está en la página 1de 11

INSTITUTO TECNOLÓGICO DE SONORA

Dirección de Ingeniería y Tecnología

Departamento de Computación y Diseño

Sistemas Empotrados

Práctica 11- Fotoresistencias y el


Microcontrolador ESP32
Una fotoresistencia, también conocida como resistencia dependiente de la luz, LDR, son
dispositivos sensibles a la luz. Se usan para detectar la presencia o ausencia de la luz o para
medir la intensidad de la luz.

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

Controlar el encendido de un LED y la brillantez de un LED usando una


fotoresistencia.

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

ITSON Manuel Domitsu Kono


2 Sistemas Empotrados

Se desea un programa que un LED 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.

El siguiente diagrama de estados modela el comportamiento del sistema:

Figura 2. Diagrama de Estados del Programa fotoresLed.ino

1. Arme el circuito de las figuras 3 y 4:

Figura 3. Circuito con una Fotoresistencia y LED

Figura 4. Circuito con una Fotoresistencia y LED

2. Usando el IDE 2.0 de Arduino, edite el siguiente programa. Guárdelo con el nombre de
fotoresLed.ino y compílelo.

ITSON Manuel Domitsu Kono


Sistemas Empotrados 3

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>

// Pin a la que esta conectado el LED, GPIO2


const unsigned int PIN_LED = 2;
// Pin a la que esta conectada la salida del divisor, GPIO34
const unsigned int PIN_FOT = 34;
// Numero de valores de salida del ADC. 2**12 = 4096
const unsigned ADC_VALORES = 4096;
// Valor del ADC al que se enciende el LED
const unsigned NIVEL_ON = ADC_VALORES/5.0;
// Valor del ADC al que se apaga el LED
const unsigned NIVEL_OFF = 2.0*ADC_VALORES/5.0;
// Tiempo entre lecturas de la intensidad de la luz
const long PAUSA = 500;
// Velocidad de transmisión del puerto serie
const unsigned int BAUD_RATE = 115200;

// Define los posibles estados del LED


typedef enum {
LED_APAGADO,
LED_ENCENDIDO
} estadoLed;

// Variable que guarda el estado del LED


estadoLed edoLed;
// Crea una instancia de la clase noDelay
// que determina si han transcurrido PERIODO ms
noDelay pausa(PAUSA);

void apagaLED();
void enciendeLED();

void setup() {
// Establece el pin PIN_LED (GPIO2) como de salida.
pinMode(PIN_LED, OUTPUT);

ITSON Manuel Domitsu Kono


4 Sistemas Empotrados

// Establece la velocidad de transmisión del puerto


// serie al valor BAUD_RATE
Serial.begin(BAUD_RATE);

// Establece el estado inicial del LED


apagaLED();
}

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");
}

3. Conecte el microcontrolador ESP32 a la computadora mediante el cable USB a micro USB.

ITSON Manuel Domitsu Kono


Sistemas Empotrados 5

4. Cargue el programa al microcontrolador ESP32.

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.

6. 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 el valor de la intensidad
de luz y el encendido y apagado del LED.

7. Cierre 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.

9. Cierre el graficador serial.

10. Desconecte el Microcontrolador ESP32 de la computadora.

Controlar la brillantez de un LED mediante una fotoresistencia Usando un


microcontrolador ESP32

Se desea un programa que controle la intensidad de encendido de un LED alimentándolo con


una forma de onda PWM. El ciclo de trabajo del canal PWM estará 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 brillantés hasta quedar encendida. Si el nivel de luz aumenta, el ciclo de trabajo
disminuye, con lo que el LED disminuirá su brillantés hasta quedar apagado.

El siguiente diagrama de estados modela el comportamiento del sistema:

Figura 5. Diagrama de Estados de los Programa fotoresLedPWM.ino y


fotoresLedPWMCal.ino

1. Arme el circuito de las figuras 6 y 7:

ITSON Manuel Domitsu Kono


6 Sistemas Empotrados

Figura 6. Circuito con una Fotoresistencia y un LED

Figura 7. Circuito con una Fotoresistencia y un LED

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

ITSON Manuel Domitsu Kono


Sistemas Empotrados 7

* 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>

// Pin a la que esta conectado el LED, GPIO16


const unsigned int PIN_LED = 16;
// Pin a la que esta conectada la salida del divisor, GPIO34
const unsigned int PIN_FOT = 34;
// Numero de valores de salida del ADC. 2**12 = 4096
const unsigned ADC_VALORES = 4096;
// Tiempo entre lecturas de la intensidad de la luz
const long PAUSA = 500;
// Parametros de la señal PWM
const int FRECUENCIA = 5000;
const int CANAL_PWM = 0;
const int RESOLUCION = 8;
// Valor minimo del ciclo de trabajo
const unsigned int CT_MIN = 0;
// Valor maximo del ciclo de trabajo. 2**RESOLUCION - 1
const unsigned int CT_MAX = 255;
// Velocidad de transmisión del puerto serie
const unsigned int BAUD_RATE = 115200;

// Valor del ciclo de trabajo de la forma de onda PWM


unsigned int cicloTrabajo;
// Crea una instancia de la clase noDelay
// que determina si han transcurrido PAUSA ms
noDelay pausa(PAUSA);

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);

// Valor inicial del Ciclo de trabajo de la forma de onda PWM


cicloTrabajo = 0;

// Establece la velocidad de transmisión del puerto


// serie al valor BAUD_RATE
Serial.begin(BAUD_RATE);
}

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();
}
}

/**

ITSON Manuel Domitsu Kono


8 Sistemas Empotrados

* Esa función establece el valor del ciclo de trabajo de la señal


* PWM en función del voltaje en la fotoresistencia (intensidad de
* luz), dado por muestra
*/
void actualizaCicloTrabajo() {
// Lee y digitaliza el valor del voltaje en la
// fotoresistencia
int muestra = analogRead(PIN_FOT);
Serial.print("Muestra: ");
Serial.println(muestra);

// Convierte a un valor para el ciclo de trabajo


cicloTrabajo = map(muestra, 0, ADC_VALORES - 1,
CT_MAX, CT_MIN);
Serial.print("Ciclo Trabajo: ");
Serial.println(cicloTrabajo);

// Cambia la brillantes del LED, cambiando el ciclo


// de trabajo del canal PWM
ledcWrite(CANAL_PWM, cicloTrabajo);
}

3. Conecte el Microcontrolador ESP32 a la computadora mediante el cable USB a micro USB.

4. Cargue el programa al Microcontrolador ESP32.

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.

6. 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 el monitor serie y en la
intensidad del led.

7. Cierre el monitor serie.

11. Desconecte el Microcontrolador ESP32 de la computadora.

Si en el programa anterior, los niveles de luz no varían considerablemente, la brillantez del


diodo tampoco lo hará. Para mejorar la respuesta del sensor podemos escalar los valores
empleados por la función map() para que en lugar de usar los valores de 0 a ADC_VALORES -
1 como los valores iniciales usemos los valores mínimo y máximo de las lecturas del sensor.
Esto se muestra en el siguiente programa.

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

ITSON Manuel Domitsu Kono


Sistemas Empotrados 9

* función map() para que en lugar de usar los valores de 0 a


* ADC_VALORES - 1 como los valores iniciales usemos los
* valores mínimo y máximo de las lecturas del sensor.
*
* 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>

// Pin a la que esta conectado el LED, GPIO16


const unsigned int PIN_LED = 16;
// Pin a la que esta conectada la salida del divisor, GPIO34
const unsigned int PIN_FOT = 34;
// Numero de valores de salida del ADC. 2**12 = 4096
const unsigned ADC_VALORES = 4096;
// Tiempo entre lecturas de la intensidad de la luz
const long PAUSA = 500;
// Parametros de la señal PWM
const int FRECUENCIA = 5000;
const int CANAL_PWM = 0;
const int RESOLUCION = 8;
// Valor minimo del ciclo de trabajo
const unsigned int CT_MIN = 0;
// Valor maximo del ciclo de trabajo. 2**RESOLUCION - 1
const unsigned int CT_MAX = 255;
// Tiempo empleado para la calibracion
const unsigned long TIEMPO_CAL = 5000;
// Velocidad de transmisión del puerto serie
const unsigned int BAUD_RATE = 115200;

// Valor del ciclo de trabajo de la forma de onda PWM


unsigned int cicloTrabajo;
// Variable usada para establecer el nivel de luz maximo
int nivelLuzMax = 0;
// Variable usada para establecer el nivel de luz minimo
int nivelLuzMin = ADC_VALORES - 1;

// Crea una instancia de la clase noDelay


// que determina si han transcurrido PAUSA ms
noDelay pausa(PAUSA);

void calibraSensor(int *pValorSensorMin, int *pValorSensorMax,


int pinSensor, unsigned long tiempoCal);
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).

ITSON Manuel Domitsu Kono


10 Sistemas Empotrados

ledcAttachPin(PIN_LED, CANAL_PWM);

// Valor inicial del Ciclo de trabajo de la forma de onda PWM


cicloTrabajo = 0;

// Establece la velocidad de transmisión del puerto


// serie al valor BAUD_RATE
Serial.begin(BAUD_RATE);

// Enciende el led para indicar el inicio de la calibracion


digitalWrite(PIN_LED, HIGH);

// Establece los valores de nivelLuzMin y nivelLuzMax para


// los niveles de luz del sitio. Mueve la mano o fuente de
// luz para que la fotoresistencia detecte un rango completo
// de valores. Esto hara que se autocalibre al rango de
// entradas.
calibraSensor(&nivelLuzMin, &nivelLuzMax, PIN_FOT, TIEMPO_CAL);

// Apaga el led para indicar el fin de la calibracion


digitalWrite(PIN_LED, LOW);
Serial.print("Nivel de luminosidad minimo: ");
Serial.println(nivelLuzMin);
Serial.print("Nivel de luminosidad maximo: ");
Serial.println(nivelLuzMax);
}

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();

while(millis() - inicio < tiempoCal) {


int valorSensor = analogRead(pinSensor);

// Registra el valor maximo del sensor


if (valorSensor > *pValorSensorMax)
*pValorSensorMax = valorSensor;

// Registra el valor minimo del sensor


if (valorSensor < *pValorSensorMin)
*pValorSensorMin = valorSensor;
}
}

/**
* Esa función establece el valor del ciclo de trabajo de la señal

ITSON Manuel Domitsu Kono


Sistemas Empotrados 11

* PWM en función del voltaje en la fotoresistencia (intensidad de


* luz), dado por muestra
*/
void actualizaCicloTrabajo() {
// Lee y digitaliza el valor del voltaje en la
// fotoresistencia
int muestra = analogRead(PIN_FOT);
Serial.print("Muestra: ");
Serial.println(muestra);

// Convierte a un valor para el ciclo de trabajo


cicloTrabajo = map(muestra, nivelLuzMin, nivelLuzMax,
CT_MAX, CT_MIN);

// Restringe el valor de cicloTrabajo al rango [0, 255]


cicloTrabajo = constrain(cicloTrabajo, 0, 255);
Serial.print("Ciclo Trabajo: ");
Serial.println(cicloTrabajo);

// Cambia la brillantes del LED, cambiando el ciclo


// de trabajo del canal PWM
ledcWrite(CANAL_PWM, cicloTrabajo);
}

2. Conecte el Microcontrolador ESP32 a la computadora mediante el cable USB a micro USB.

3. Cargue el programa al Microcontrolador ESP32.

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.

5. 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 el monitor serie y en la
intensidad del led.

6. Cierre el monitor serie.

7. Desconecte el Microcontrolador ESP32 de la computadora.

ITSON Manuel Domitsu Kono

También podría gustarte