Light Dependent Resistor Tester

When I was working on the “FOSCAM FI904W IP-Camera IR Light Modification”  project (see post below) I acquired three bags of Light Dependent Resistors (LDR). I purchased them direct from China because they were so inexpensive – a bulk package was only slightly more than the domestic price of just a couple of LDRs. The types are GL5528, PDV-P9005, and MJ5549. The GL5528 LDR purchase was special because it was an assembly, exactly as used in the Foscam cameras – including the LDR, an infrared blocking glass filter and a rubber housing.

3 LDR types

3 LDR types

One thing that I noticed with these cheap LDRs was that there were some in the bag that didn’t quite perform correctly. In other words their response to light didn’t match the device specifications. Now if I was going to ever use the extra LDRs in future devices, or  sell them, I needed to test each one for specification compliance. Not owning any fancy, specialized LDR testing equipment, I decided to fabricate one with an Arduino.


The circuit above is the Arduino portion of my test hardware (I used a nano, not the uno shown). The circuit is very simple, with two parts. Arduino port A0 uses PWM to drive the 2N3904 transistor (filtered with a 10uf capacitor) which, in turn has sufficient current capability to drive the LED which shines on the LDR under test. The Arduino script steps the LED through increments of brightness. The second part of the circuit is the LDR. The Arduino reads the voltage drop across the LDR on Arduino pin A0.

For my first test set-up, I used a $1 white LED book light that I purchased at the local Dollar-Tree store.  The photo below shows the test set-up – the LED shines directly on the LDR below. This was a total failure! Even with the room lights turned off, there was enough ambient light from the computer screen, and other sources, to screw up the tests – plus, with the room lights turned off it was hard for me to see what I was doing. Time for plan B.


I made another trip to the Dollar-Tree store and purchased a $1 while-light flashlight. I disassembled the flashlight and salvaged the round printed circuit board with three white light LEDs configured in a 5-volt configuration. Perfect! Next I needed a test chamber that would permit testing even with the room lights on.  I raided my closet and salvaged a show box that would serve as my test chamber. I drilled holes in each end – one for the light and the other for the LDR being tested. After soldering wires to the white light LED assembly and to a test socket for the LDR, I was ready for testing. The shoebox test chamber is shown in the composite photograph below, sitting on my messy desk. The lower left part of the photo shows the flashlight white-light LED assembly hot-glued to one end of the box. The lower right part of the photo shows a LDR inserted into the hole on the other end of the test chamber.


The software to do the testing consists of two parts. Part one is a script running in the Arduino that submits the LDR to controlled light levels while measuring the subject LDR and sends the results out the serial port. The results are structured for subsequent use by gnuplot on my Linux desktop. The second piece of software is a shell script on my Linux desktop that reads the initiates the Arduino test, reads the data over the Arduino serial port and, upon completion, presents a visual represention of the LDR response curve as a line graph.

Before I finalized my tests I did some manual testing on the LDR using a different Arduino test script that permitted me to manually set the light level and take readings. Using this set-up and a Weston Master II light meter and a VoltOhmMeter (VOM) I characterized the GL5528 with candlepower per square foot and resistance. Note that the VOM does not measure above 2 megohms nor does the lightmeter read below .1 foot-candles. The measured data is shown in the chart below, which is useful to compare to the Arduino’s port A0 and A1 values used in my actual tests. The resulting curve is shown below the chart.


GL5528 LDR

GL5528 LDR

For my actual tests I attempted no conversion from the Arduino’s port A0 and A1 values, primarily because the data was non-linear and I could find no obvious formula for computing it.  The Arduino port values, however, serve my purpose because I will be able to easily see a deviant LDR when compared to known good LDR. The image below shows the exact same LDR as tested above except this time plotted in Arduino port A0 and A1 values. The green “control” line in the image is the control plot of the known good sample. If the two lines are reasonably close, then the LDR is good.


Finally, the software is available at these clickable links: the Arduino script, named “ldrtest.ino” and the Linux shell script named “” and its accompanying  gnuplot script named “” and a file of control values, “control.txt

This entry was posted in Arduino, Electronics, Linux, Programming. Bookmark the permalink.

3 Responses to Light Dependent Resistor Tester

  1. Pingback: Light Dependent Resistor Tester « freetronicsblog

  2. magiciant says:

    You ca’t drice 10uF cap by PWM w/o conecting resistor in series. BTW, how you get PWM on A0, AFAIK it’s not PWD-ed pin?


    • celem says:

      Good catch. The schematic incorrectly shows the transistor connected to A0. If you’ll look at the Arduino source code you will see that pin A3 is actually used, which IS a PWM pin. The circuit is from PWM positive voltage to ground through the 240k resistor. The cap is just for filtering at the junction to the transistor.

      P.S.: I just replaced the schematic with a corrected version.


Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s