What is a photocell?
Photocells are sensors that allow you to detect light. They are small, inexpensive, low-power, easy to use and don’t wear out. For that reason they often appear in toys, gadgets and appliances. Theys are are often refered to a CdS cells (they are made of Cadmium-Sulfide), light-dependent resistors (LDR), and photoresistors.
Photocells are basically a resistor that changes its resistive value (in ohms Ω) depending on how much. They are very low cost, easy to get in many sizes and specifications, but are very innacurate. Each photocell sensor will act a little differently than the other, even if they are from the same batch. The variations can be really large, 50% or higher! For this reason, they shouldn’t be used to try to determine precise light levels in lux or millicandela. Instead, you can expect to only be able to determine basic light changes.
For most light-sentsitive applications like “is it light or dark out”, “is there something in front of the sensor (that would block light)”, “is there something interrupting a laser beam” (break-beam sensors), or “which of multiple sensors has the most light hitting it”, photocells can be a good choice!
Some basic stats
These stats are for the photocell in the Adafruit shop which is very much like the PDV-P8001. Nearly all photocells will have slightly different specifications, although they all pretty much work the same. If there’s a datasheet, you’ll want to refer to it
Size: Round, 5mm (0.2″) diameter. (Other photocells can get up to 11mm/0.4″ diameter!)
How to measure light using a photocell
As we’ve said, a photocell’s resistance changes as the face is exposed to more light. When its dark, the sensor looks like an large resistor up to 10MΩ, as the light level increases, the resistance goes down. This graph indicates approximately the resistance of the sensor at different light levels. Remember each photocell will be a little different so use this as a guide only!
Adafruit publishes a wide range of writing and video content, including interviews and reporting on the maker market and the wider technology world. Our standards page is intended as a guide to best practices that Adafruit uses, as well as an outline of the ethical standards Adafruit aspires to. While Adafruit is not an independent journalistic institution, Adafruit strives to be a fair, informative, and positive voice within the community – check it out here: adafruit.com/editorialstandards
Stop breadboarding and soldering – start making immediately! Adafruit’s Circuit Playground is jam-packed with LEDs, sensors, buttons, alligator clip pads and more. Build projects with Circuit Playground in a few minutes with the drag-and-drop MakeCode programming site, learn computer science using the CS Discoveries class on code.org, jump into CircuitPython to learn Python and hardware together, TinyGO, or even use the Arduino IDE. Circuit Playground Express is the newest and best Circuit Playground board, with support for CircuitPython, MakeCode, and Arduino. It has a powerful processor, 10 NeoPixels, mini speaker, InfraRed receive and transmit, two buttons, a switch, 14 alligator clip pads, and lots of sensors: capacitive touch, IR proximity, temperature, light, motion and sound. A whole wide world of electronics and coding is waiting for you, and it fits in the palm of your hand.
Have an amazing project to share? The Electronics Show and Tell is every Wednesday at 7:30pm ET! To join, head over to YouTube and check out the show’s live chat and our Discord!
Python for Microcontrollers – Adafruit Daily — Python on Microcontrollers Newsletter: New Python Releases, an ESP32+MicroPython IDE and Much More! #CircuitPython #Python #micropython @ThePSF @Raspberry_Pi
EYE on NPI – Adafruit Daily — EYE on NPI Maxim’s Himalaya uSLIC Step-Down Power Module #EyeOnNPI @maximintegrated @digikey
“its resistive value (in ohms Ω) depending on how much.”
should maybe read
“its resistive value (in ohms Ω) depending on how much light is shining on it.”
Sadly I think CdS photocells are soon to be extinct thanks to RoHS. (Many people including myself now make it a point to properly recycle electronics, in order to keep lead and other nasties out of the landfill. Will people do the same once the RoHS directive makes it perfectly safe to toss them all into the trash?)
“Note that the “lower bounds” of either range may be larger or smaller than the “upper bounds” so the map() function may be used to reverse a range of numbers, for example
Have an autocalibrate routine for LDRs and FSRs. It records maximum and minimum intensity and then gives the full 0-255 PWM output over the input range.
I clicked on the datasheet links and got the following errors:
Not Found
The requested URL /media/sensors/PDV-P8001.pdf was not found on this server.
Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.
________________________________________
Apache/1.3.41 Server at http://www.adafruit.com Port 80
I’m using FireFox 3.0.10.
Not Found
The requested URL /media/sensors/DTS_A9950_A7060_B9060.pdf was not found on this server.
Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.
________________________________________
Apache/1.3.41 Server at http://www.adafruit.com Port 80
“its resistive value (in ohms Ω) depending on how much.”
should maybe read
“its resistive value (in ohms Ω) depending on how much light is shining on it.”
Sadly I think CdS photocells are soon to be extinct thanks to RoHS. (Many people including myself now make it a point to properly recycle electronics, in order to keep lead and other nasties out of the landfill. Will people do the same once the RoHS directive makes it perfectly safe to toss them all into the trash?)
In the sample sketch, I think you can omit this line:
photocellReading = 1023 – photocellReading;
if you rewrite the map line as:
LEDbrightness = map(photocellReading, 1023, 0, 0, 255);
That is, map() works with decreasing ranges as well as increasing ones.
(From http://www.arduino.cc/en/Reference/Map:
“Note that the “lower bounds” of either range may be larger or smaller than the “upper bounds” so the map() function may be used to reverse a range of numbers, for example
y = map(x, 1, 50, 50, 1);”)
@joshua they’re rohs exempt
@finsprings i didnt find map worked but sure, whichever way
Have an autocalibrate routine for LDRs and FSRs. It records maximum and minimum intensity and then gives the full 0-255 PWM output over the input range.
http://duinolab.blogspot.com/2009/05/autocalibrate-and-analog-sensors.html
I clicked on the datasheet links and got the following errors:
Not Found
The requested URL /media/sensors/PDV-P8001.pdf was not found on this server.
Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.
________________________________________
Apache/1.3.41 Server at http://www.adafruit.com Port 80
I’m using FireFox 3.0.10.
Not Found
The requested URL /media/sensors/DTS_A9950_A7060_B9060.pdf was not found on this server.
Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.
________________________________________
Apache/1.3.41 Server at http://www.adafruit.com Port 80
Just wanted to add that the difference between the links to the datasheets in this blog vs. the links on http://www.ladyada.net/learn/sensors/cds.html page, is the domain name.