I am writing this Instructable because Bot1398 used an Arduino and I've never used them. I have nothing against them, however, when I started using microcontrollers about 3 years ago I was looking for speed and power for a specific application. I settled on the PIC Microcontroller series by Microchip. It is amazing what you can do with microcontrollers, you can let your imagination run wild and with a little creative programming achieve exactly what you want. There are a number of programming languages out there as well but when I started I wanted speed and to know exactly what was going on at each and every step, therefore, I chose Assembly Language since it seemed a lot like BASIC that I learned on the IBM PC Jr. back in the 1980's when I was growing up. That is what this Instructable entails: PIC Microcontrollers and Assembly Language to use an LED (Light Emitting Diode) to detect the amount of ambient light and display the numerical measure of this light along with a bargraph on an LCD screen.
Why This Works
When we attach an LED to a Microcontroller we are usually doing that to light it up. In this case, however, we are actually applying a positive voltage to the negative end of the electrode. This is so we can take advantage of something called parasitic capacitance. Applying this positive voltage will build up a small charge (resources on the internet say within about 100-200 nanoseconds) within this parasitic capacitance of the LED that we are using. The actual capacitance is not very important but online resouces say that it is around 10-15 pF. We will then switch the pin of the microcontroller attached to the negative end of the electrode from an OUTPUT to an INPUT and wait for the charge to drain. When charge drains enough the pin will now read a Logic Level 0 or Low state where we will turn off the timer and use this value to calculate the moving average and display the results on the screen. We will then take more readings and display them on the screen at the interval that is written in the assembly code. In the finished code, I have it set to take one reading about every 20 or so microseconds. This occurs 50 times so that an updated result is displayed on the screen approximately every second or so. The time it takes to get a reading will vary a little bit because it takes longer for the charge to drain in a dark environment and this occurs faster in light environments. The discharge rate of the LED capacitance is somehow directly related to the number of photons or amount of light striking the LED light generating elements. Neat isn't it. :)
Now that we know how it works, let's move on to Step #1.