Light Level Monitor Using ADC in MicroPython for ESP32 and ESP8266

In this project, you’ll learn how to monitor light levels using an Light Level Monitor Using ADC in MicroPython for ESP32 and ESP8266. The LDR is an analog sensor that changes its resistance based on the surrounding light intensity. By connecting it to an ADC (Analog-to-Digital Converter) pin, we can read the voltage across the LDR and determine the ambient light level. This project introduces key concepts like ADC initialization, reading analog values, and interpreting those values to monitor environmental changes.

Purpose of the Project:

The purpose of this project is to help you:

  • Initialize and use the ADC in MicroPython for ESP32 and ESP8266.
  • Monitor light levels by reading the ADC values from an LDR sensor.
  • Convert analog sensor data into useful digital values for real-time monitoring.
  • Build a foundation for environmental monitoring using analog sensors.

Data Types and Variable Table for Light Level Monitor Using ADC in MicroPython

Data Type Variable Name Description
ADC adc Represents the ADC object reading the light intensity from the LDR.
int light_value Stores the raw ADC value from the LDR, representing the light intensity.
float voltage Represents the voltage calculated from the ADC value, related to light level.

Syntax Table for Light Level Monitor Using ADC in MicroPython

Operation Syntax Example
Initialize ADC adc = ADC(Pin(pin_number)) adc = ADC(Pin(34))
Read ADC Value adc.read() light_value = adc.read()
Convert ADC to Voltage voltage = (adc.read() * reference_voltage) / 4095 voltage = (adc.read() * 3.3) / 4095

Required Components for Light Level Monitor Using ADC

  • ESP32 or ESP8266 Board: Microcontroller that supports ADC and runs MicroPython code.
  • LDR (Light Dependent Resistor): Analog sensor that changes its resistance based on light intensity.
  • 10kΩ Resistor: Forms part of the voltage divider circuit with the LDR to ensure proper analog readings.
  • Breadboard: For easy prototyping and connecting components.
  • Jumper Wires: To connect the components on the breadboard.

Circuit Diagram for Light Level Monitor Using ADC

         LDR

          —–

          |—|—--> VCC (3.3V)  

          |   |     

          |—|—--> GPIO34 (ADC Pin)

             |

           10kΩ Resistor

             |

            GND

 

In this circuit, the LDR and the 10kΩ resistor form a voltage divider. The varying resistance of the LDR based on light intensity results in a varying voltage at the ADC pin, which is then read by the ESP32 or ESP8266.

Circuit Connection Table

Component Pin ESP32/ESP8266 Pin Explanation
LDR Pin 1 Connected to 3.3V 3.3V Provides power to the LDR.
LDR Pin 2 Connected to GPIO34 GPIO34 (ADC Pin) Measures the analog voltage for light intensity.
10kΩ Resistor Connected to GND GND Completes the voltage divider circuit for proper ADC readings.

Warning:

  • ADC Pin Selection: Make sure you are using a GPIO pin that supports ADC functionality, such as GPIO34 on ESP32.
  • Use a Resistor: Always connect the LDR in a voltage divider configuration with a resistor to ensure accurate readings. Without the resistor, the ADC may not provide reliable values.

Circuit Analysis for Light Level Monitor Using ADC:

The LDR’s resistance decreases as light intensity increases. When exposed to more light, the voltage across the LDR drops, allowing the ESP32 or ESP8266 to read the voltage difference at the ADC pin. The analog value is then converted to a digital value (ranging from 0 to 4095 for a 12-bit ADC). In bright conditions, the ADC value will be low, and in darkness, the value will be higher. This allows for real-time monitoring of light levels.

Installing MicroPython and Libraries (If Needed):

No additional libraries are required. The machine module in MicroPython provides built-in functions to handle ADC readings.

Writing the MicroPython Code for Light Level Monitor Using ADC:

Here’s a step-by-step breakdown of the code to monitor light levels using an LDR:

import machine

import time

 

# Initialize ADC on GPIO34

adc = machine.ADC(machine.Pin(34))

 

# Function to read light level and convert ADC value to voltage

def read_light_level():

    light_value = adc.read()  # Read raw ADC value (0-4095 for 12-bit resolution)

    voltage = (light_value * 3.3) / 4095  # Convert ADC value to voltage

    return light_value, voltage

 

# Continuously read and display light level

while True:

    light_value, voltage = read_light_level()

    print(“Light Level (Raw ADC):”, light_value)

    print(“Voltage (V): {:.2f}”.format(voltage))

    time.sleep(1)

 

Running the Code and Checking the Output:

  1. Upload the code to your ESP32 or ESP8266 using Thonny or another MicroPython IDE.
  2. Observe the output in the console: The raw ADC value (between 0 and 4095) and the corresponding voltage will be displayed every second.
  3. Change the lighting conditions: Cover the LDR with your hand or expose it to a light source and observe how the ADC values and voltage change.

Explanation of the Code:

  • ADC Initialization: The LDR is connected to GPIO34, which is configured as an ADC input to read analog voltage.
  • Read ADC Value: The function read_light_level reads the raw ADC value, which ranges from 0 to 4095, corresponding to the analog voltage at the LDR.
  • Convert to Voltage: The raw ADC value is converted into voltage by multiplying the ADC value by the reference voltage (3.3V) and dividing by the ADC resolution (4095 for 12-bit ADC).
  • Loop Function: The program continuously reads the light level and prints both the raw ADC value and the corresponding voltage every second.

Expanding the Project:

  1. Create Threshold-Based Alerts: Add an LED or buzzer that activates when light levels fall below or rise above a certain threshold (e.g., too bright or too dark).
  2. Data Logging: Store light intensity data over time, allowing you to analyze trends in light levels during different times of day.
  3. User Interface: Display the light levels on an LCD or OLED screen for real-time monitoring in a user-friendly manner.

Common Problems and Solutions for Light Level Monitor Using ADC:

Problem Solution
Inconsistent ADC readings Use a capacitor across the LDR to filter noise or average multiple readings to smooth out fluctuations.
ADC value not changing Ensure the LDR is correctly wired and receiving power. Verify the voltage divider setup.
Wrong GPIO pin used for ADC Double-check that you are using an ADC-capable GPIO pin (e.g., GPIO34 for ESP32).

FAQ for Light Level Monitor Using ADC:

Q: Can I use a different analog sensor with this setup?
A: Yes, any sensor that outputs analog voltage can be used with the ADC, such as temperature or moisture sensors. Modify the voltage-to-data conversion based on the specific sensor.

Q: How do I adjust the sensitivity of the LDR?
A: You can change the value of the resistor in the voltage divider circuit to make the LDR more or less sensitive to light changes.

Q: Can I use a different GPIO pin for the ADC?
A: Yes, as long as the GPIO pin supports ADC. Adjust the Pin() initialization accordingly.

Conclusion:

In this project, you successfully learned how to monitor light levels using an LDR connected to an ADC pin in MicroPython for ESP32 and ESP8266. You now understand how to read and interpret analog sensor values, convert those values to meaningful data, and apply this knowledge to monitor environmental changes. This project forms the foundation for more advanced environmental monitoring and automation systems.