Instructables

LED LYT Meter: LED, PIC Microcontroller, and Moving Average Code

Picture of LED LYT Meter: LED, PIC Microcontroller, and Moving Average Code
Hello everyone, thank you for checking out my first Instructable. I have enjoyed seeing your creations over the years and love what all of you are contributing. This project is a spin off of one that I recently saw here and I need to give a shout out to Bot1398 because he demonstrated to me in his Instructable that you could use an LED to detect changes in light intensity in the environment and use this to turn another LED on or off. I knew that if you supplied a little bit of power to an LED it would emit light. I never thought it could be used the other way around. After I saw his Instructable: Light Sensing LEDs it made sense but I wanted to see this actually work for myself.

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.


 
I did produce the first version of this LED-based Light Sensing device which did work, the trouble that I noticed was that the values jumped around quite a bit. Therefore, I looked for a solution to this problem I thought about averaging the values, but how? Binary math does is kind of difficult but there is always a way to get it done. As I was searching for solutions I came across a great page about Moving Averages and how to do it most effectively so that even the 8-Bit Microcontrollers can handle it with ease. The link to the page is here: Computationally Efficient Moving Averages and this works extremely well. This implementation displays the Moving Average of the last 256 light readings and displays that value along with a bargraph on the LCD Screen. The moving average code prevents the values read from the LED from jumping around much and gives you a better, much more accurate result.

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.
 
Remove these adsRemove these ads by Signing Up
Pro

Get More Out of Instructables

Already have an Account?

close

PDF Downloads
As a Pro member, you will gain access to download any Instructable in the PDF format. You also have the ability to customize your PDF download.

Upgrade to Pro today!