Arduino Project 2 of 100: Photosensitive Discrete LEDs

Aquarius: 1  2  3  4  5  6  7  8  9  10  11  12  13
email me
email me

In this project, I build upon the ideas in Project 1, and use discrete LEDs on a breadboard to visibly show when low or bright light is detected. Red is low light. Green is bright light.

It is essentially a light-sensing system using a photoresistor and two LEDs to indicate the ambient light level. The logic is controlled through programming the Arduino microcontroller.


PARTS

1 x Arduino UNO R3
3 x 220 ohm resistors
1 x Red LED
1 x Green LED
1 x 5528 photoresistor
5 x Jumper wires
1 x Breadboard
5 volt power source


MEDIA

VIDEOS


CONNECTIONS

Ground rail to Ground on controller
220R to A0 on controller
5528 Photoresistor to 5V on controller
220R to ground rail
5528 Photoresistor to 220R
Red LED+ to 220R, 220R to pin12
Red LED- to ground rail
Black LED+ to 220R, 220R to pin11
Black LED- to ground rail

see Wokwi, Board Simulator

 

OPERATIONS

  1. Initialization (Setup Function):
    • The setup function initializes the pins used in the circuit:
      • LED_BUILTIN pin as an output for the built-in LED.
      • PHOTORESISTOR_PIN as an input for the photoresistor.
      • RED_LED_PIN and GREEN_LED_PIN as outputs for the red and green LEDs, respectively.
    • It also starts serial communication at a baud rate of 9600 for debugging purposes. Make sure you click the little monitor icon in the top right of the Arduino app (looks almost like a little magnify glass).
  2. Main Loop (Loop Function):
    • Light Intensity Measurement:
      • Reads the analog value from the photoresistor connected to PHOTORESISTOR_PIN.
      • Prints the light value to the serial monitor for debugging.
    • Calibration:
      • Initializes variables darkest_light and brightest_light with the current light value for calibration.
      • Updates darkest_light and brightest_light if the current light value is darker or brighter than the previous values, respectively.
    • Mapping Delay:
      • Maps the current light value to a delay value using the map() function. This delay value determines how fast the built-in LED blinks, based on the light intensity.
      • Prints the delay value to the serial monitor for debugging.
    • Blinking Built-in LED:
      • Turns on the built-in LED ( LED_BUILTIN ) for a duration determined by the delay value.
      • Then, turns off the built-in LED for the same duration, creating a blinking effect.
    • Control of Red and Green LEDs:
      • Checks the light intensity to determine whether it is low, medium, or high:
        • If the light value is below one-third of the range between darkest_light and brightest_light , the red LED is turned on, indicating low light.
        • If the light value is above two-thirds of the range, the green LED is turned on, indicating high light.
        • Otherwise, both LEDs are turned off, indicating medium light.
    • Loop Continues:
      • The loop function repeats continuously, continually measuring light intensity, adjusting LED behavior, and blinking the built-in LED accordingly.

 

CODE

#include "Arduino.h"

// MrNetTek 
// eddiejackson.net
// 4/12/2024
// free for public use 
// free to claim as your own

// DEFINE PIN ASSIGNMENTS
const byte PHOTORESISTOR_PIN = A0; // Pin connected to the photoresistor
const byte RED_LED_PIN = 12;        // Red LED pin
const byte GREEN_LED_PIN = 11;      // Green LED pin

// DEFINE DELAY CONSTANTS
const unsigned int MIN_DELAY = 50;  // Minimum delay between LED toggles
const unsigned int MAX_DELAY = 500; // Maximum delay between LED toggles

void setup() {
  // SET PIN MODES
  pinMode(LED_BUILTIN, OUTPUT);      // Built-in LED pin as output
  pinMode(PHOTORESISTOR_PIN, INPUT); // Photoresistor pin as input
  pinMode(RED_LED_PIN, OUTPUT);      // Red LED pin as output
  pinMode(GREEN_LED_PIN, OUTPUT);    // Green LED pin as output
  
  // START SERIAL COMMUNICATION
  Serial.begin(9600);
}

void loop() {
  // READ LIGHT INTENSITY FROM THE PHOTORESISTOR
  unsigned int light_value = analogRead(PHOTORESISTOR_PIN);
  
  // PRINT LIGHT VALUE TO SERIAL MONITOR
  Serial.print("Light value: ");
  Serial.print(light_value);

  // INITIALIZE VARIABLES FOR CALIBRATION
  static unsigned int darkest_light = light_value;
  static unsigned int brightest_light = light_value;
  
  // CALIBRATION
  // UPDATE DARKEST AND BRIGHTEST LIGHT VALUES
  if (light_value < darkest_light) {
    darkest_light = light_value;
  }
  if (light_value > brightest_light) {
    brightest_light = light_value;
  }

  // MAP LIGHT VALUE TO DELAY VALUE
  unsigned int delay_value = map(light_value, darkest_light, brightest_light, MAX_DELAY, MIN_DELAY);
  Serial.print(", Delay value: ");
  Serial.println(delay_value);

  // TOGGLE BUILT-IN LED WITH CALCULATED DELAY
  digitalWrite(LED_BUILTIN, HIGH);
  delay(delay_value);
  digitalWrite(LED_BUILTIN, LOW);
  delay(delay_value);
  
  // CHECK LIGHT INTENSITY AND CONTROL LEDS ACCORDINGLY
  // CHECK LOW LIGHT - CHANGE RANGE HERE
  if (light_value < darkest_light + ((brightest_light - darkest_light) / 3)) {
    digitalWrite(RED_LED_PIN, HIGH);    // Turn on Red LED
    digitalWrite(GREEN_LED_PIN, LOW);   // Turn off Green LED
  }
  // CHECK BRIGHT LIGHT - CHANGE RANGE HERE
  else if (light_value > brightest_light - ((brightest_light - darkest_light) / 3)) {
    digitalWrite(GREEN_LED_PIN, HIGH);  // Turn on Green LED
    digitalWrite(RED_LED_PIN, LOW);     // Turn off Red LED
  }
  // BETWEEN RANGE
  else {
    digitalWrite(RED_LED_PIN, LOW);     // Turn off Red LED
    digitalWrite(GREEN_LED_PIN, LOW);   // Turn off Green LED
  }
}

 

 

NOTES

 
Arduino UNO R3 Datasheet

Arduino UNO R3 Documentation


delay()

Serial.begin()

Serial.print()

Serial.println()

digitalWrite

 

Tags: Arduino, maker, builder, engineer, inventor, Project Aquarius