Read Light Sensor with ADC Using MicroPython for ESP32 and ESP8266

In this project, you will learn how to read the light intensity using Read Light Sensor with ADC Using MicroPython for ESP32 and ESP8266. The light intensity value is measured by converting the analog signal from the LDR into a digital value using the ADC. This project is perfect for learning about ADC initialization and reading analog values with MicroPython.

What is ADC (Analog-to-Digital Conversion) in MicroPython for ESP32 and ESP8266?

The ADC in MicroPython converts an analog signal (such as the varying resistance of an LDR) into a digital value that can be processed by the ESP32/ESP8266. This conversion allows us to measure physical quantities like light intensity using analog sensors.

Purpose of the Project:

This project will teach you how to:

  • Initialize ADC in MicroPython to read analog signals.
  • Use an LDR sensor to measure light intensity.
  • Convert the analog signal into a digital value and display the result in the console.

MicroPython Syntax for Reading ADC with Light Sensor:

Operation Syntax Example
Initialize ADC adc = machine.ADC(Pin(pin_number)) adc = machine.ADC(machine.Pin(34))
Read ADC value adc.read() light_value = adc.read()

Required Components:

  • ESP32 or ESP8266
  • LDR (Light Dependent Resistor)
  • 1 Resistor (10kΩ)
  • Breadboard
  • Jumper Wires

Circuit Diagram:

       LDR

        —–

        |—|—> GPIO34 (ADC Pin)  

        |   |     

        |—|—> 3.3V (VCC)

         |

       10kΩ Resistor

         |

       GND

 

Circuit Connection Table:

Component Pin ESP32/ESP8266 Pin Explanation
LDR Pin 1 Connect to GPIO34 GPIO34 (ADC Pin) Reads the analog value from the LDR
LDR Pin 2 Connect to 3.3V 3.3V Power supply to the LDR
Resistor Pin 1 Connect to GND GND Completes the circuit for the LDR

Warnings:

  • Ensure you are connecting the LDR to an ADC pin on the ESP32 or ESP8266, as not all GPIO pins support analog reading.
  • Always use a pull-down resistor (typically 10kΩ) with the LDR to ensure proper voltage division for ADC measurement.

Circuit Analysis:

The LDR (light-dependent resistor) changes its resistance based on the light intensity. The voltage across the LDR is fed into the ADC pin on the ESP32 or ESP8266, which converts the analog voltage into a digital value. The stronger the light, the lower the resistance of the LDR, and the ADC reads a lower voltage.

Installing MicroPython and Libraries:

Install MicroPython on your ESP32 or ESP8266 using Thonny or esptool:
esptool.py –chip esp32 erase_flash

esptool.py –chip esp32 write_flash -z 0x1000 esp32-20210902-v1.17.bin

  1. No Additional Libraries Required: The built-in machine library is sufficient for reading ADC values in MicroPython.

Writing the MicroPython Code to Read Light Sensor with ADC:

import machine

import time

 

# Initialize the ADC on GPIO34 (or any available ADC pin on your ESP32/ESP8266)

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

 

while True:

    # Read the value from the LDR sensor

    light_value = adc.read()

    

    # Print the light intensity value

    print(“Light Intensity:”, light_value)

    

    # Small delay to prevent flooding the console

    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 console output: The light intensity values will be displayed as numbers between 0 and 4095 (for a 12-bit ADC on ESP32) or 0 and 1023 (for a 10-bit ADC on ESP8266).
  3. Change the lighting conditions: Shine more light on the LDR and cover it to see the values change.

Explanation of the Code:

  • ADC Initialization: The ADC is initialized on GPIO34 (an ADC pin on the ESP32). You can select any available ADC pin.
  • Reading ADC Value: The adc.read() function reads the analog value from the LDR sensor. This value is then printed in the console.
  • Loop: The code runs in a loop to continuously monitor the light intensity, updating the value every second.

Expanding the Project:

  • Display on LCD: Display the light intensity on an LCD screen instead of the console.
  • Trigger LED or Alarm: Use the light intensity value to trigger an LED or alarm when the light drops below or rises above a certain threshold.
  • Data Logging: Log the light intensity values over time and analyze the changes in light conditions throughout the day.

Common Problems and Solutions:

  1. Problem: The light sensor readings are not changing.
    • Solution: Ensure the LDR is connected correctly, with the appropriate pull-down resistor. Double-check the pin configuration.
  2. Problem: The ADC value is not in the expected range.
    • Solution: Verify that the ADC pin supports analog reading and that the LDR circuit is correctly wired.
  3. Problem: The code throws an error during ADC initialization.
    • Solution: Make sure you are using an ADC-capable GPIO pin on the ESP32 or ESP8266.

FAQ:

Q: Can I use a different GPIO pin for the LDR?
A: Yes, as long as the GPIO pin supports ADC (analog reading). Check the ESP32/ESP8266 documentation for ADC-compatible pins.

Q: How do I calibrate the ADC to give more accurate readings?
A: You can map the raw ADC values to a specific range using code. For instance, if you know the maximum and minimum light intensity values, you can scale the ADC output accordingly.

Q: Can I use other sensors with the ADC in this project?
A: Yes, any analog sensor that provides a varying voltage output (e.g., temperature sensors, potentiometers) can be connected to an ADC pin.

Conclusion:

In this project, you successfully used an LDR sensor to read light intensity with ADC on ESP32/ESP8266. By understanding how to initialize and read from the ADC, you can measure analog values and process real-world sensor data in your MicroPython projects. This project is a foundational step for building more complex sensor-based applications.