User Tools

Site Tools


oak:tutorials:leds

Oak: LED basics

This tutorial will build on the last by using an external LED bulb. We will also control the brightness of an LED vs. simply turning it on and off. There are excellent articles about LEDs, so if you want to know more about the nitty gritty of how LEDs work, please seek out other resources. One example is the excellent article, All about LEDs on Adafruit.

Components used

Part Quantity Identification
Oak with soldered headers 1
Breadboard1
5mm LED bulb, any color2
Jumper wires2
Resistor, 220 ohm*1Red-Red-Brown

Note: 220 ohm is one possible option. You can use any resistor between 100-1,000 ohms if you'd like. 100 ohms will produce the brightest light and 1,000 will be a bit dimmer. Any in this range are safe.

Concepts

analogWrite()

The digitalWrite() function used in the blink tutorial can send HIGH or LOW signals to a pin on the Oak. This is like turning the light switch on and off. Using analogWrite() is like adding a dimmer to your switch! You can now decide if the LED is on, and how bright it should be. The function takes parameters for a pin on which to send the output, and what output level to send. Microcontrollers use integers from 0 - some limit based on the bits of resolution they use. To keep things simple, just remember that the Oak can use analogWrite() from 0 (off) to 1023 (full power).

PWM

The term PWM stands for pulse-width modulation. A full description is outside the scope of this tutorial, but feel free to read up on the concept (e.g. on Wikipedia). The simplified version is that by pulsing a single voltage (like 3.3V) on and off, the LED will behave as if we sent a lower voltage. The pulses are very fast (generally faster than one can see) and thus this is a great way to control the brightness of an LED!

LED

An LED is a light emitting diode, and a diode only allows electricity to flow in one direction. This means that LEDs are also directional. There is generally one leg of an LED that is longer, which is used to indicate the positive side. The shorter leg is generally connected to ground, so electricity will flow in the positive leg, through the bulb (generating light) and through the negative leg to ground.

LEDs typically have an optimal current, which is typically about 20-30mA for a 5mm LED. To obtain this current, we use a resistor. In the interest of keeping this simple, we're simply providing a value of 220 ohm as a middle of the road recommendation. There's some good information at Evil Mad Scientist about how these resistor values can be chosen if you'd like to learn more. What's certain is that you should never plug an LED directly into the Vin or Vcc of the Oak; too much current will destroy it!

Circuit

We will build this circuit:

  • Start by inserting the 220 ohm resistor into two different rows on the breadboard
  • Insert the LED into the breadboard so that it's long leg is in the same row as the resistor, and the other leg in a different row
  • Use a jumper wire to connect pin 9 of the Oak to the unconnected side of the resistor
  • Use another jumper wire to connect a ground pin on the Oak to the row containing the short leg of the LED

You can double check your circuit against this real world example:

oak-1-led.jpg

Code

Using the same code from the blink tutorial with one change, we can blink our new LED bulb!

void setup()
{                

  // initialize digital pin 9 as an output.
  pinMode(9, OUTPUT); //LED on Oak

}


// the loop() routine runs over and over again
void loop()
{

  // turn pin 9 "on" by making the voltage HIGH)
  digitalWrite(9, HIGH);
  
  // wait a second (1000 milliseconds)
  delay(1000);
  
  // turn the LED off by making the voltage LOW
  digitalWrite(9, LOW);

  // wait another second
  delay(1000);

}

This code does just what the on-board blink sketch did: it sends a HIGH voltage to a pin (9 in this case instead of 1), waits a second, then turns off the power to that pin by sending a LOW signal, waiting for an additional second before repeating. By changing the pin, and connecting an LED to that pin, we've blinked our LED bulb.

Code: changing brightness

With the next code, we will switch to using analogWrite so that we can control the desired brightness:

void setup()
{                

  // initialize digital pin 9 as an output.
  // this stays the same for analogWrite()
  pinMode(9, OUTPUT); //LED on Oak

}


// the loop() routine runs over and over again
void loop()
{

  // start with pin 9 off by sending a 0
  analogWrite(9, 0);
  delay(500);

  // set pin 9 to 100/1023, or about 10% power
  analogWrite(9, 100);
  delay(500);
  
  // increase to about 25% power
  analogWrite(9, 250);
  delay(500);

  // 50% power
  analogWrite(9, 500);
  delay(500);

  // full power
  analogWrite(9, 1023);
  delay(500);

}

This code may look a lot longer and possibly intimidating, but we've simply used the same basic structure from above (do something, then wait) over and over. The analog functions and their corresponding delays have been grouped tighter to show that these are pairs of commands.

Since the Oak can send values from 0-1023, this sketch cycles through some various PWM values to show you the effect. Sending 100 means that the analogWrite signal is high 100/1023 or about 9.8% of the time, and sending a low signal the rest of the time. Sending 1023 means the pin is on for 100% of the time (full brightness). When you upload this sketch, you'll see a demonstration of your LED going from off to full brightness in steps:

Play around with the code above. Perhaps change the order (high to low), the timing between each step (altering the delay() value used), or the number of steps (what about a more gradual transition?).

Conclusion

Congratulations on taking another step with your Oak! You've now wired up an external LED, learned about LED polarity and the need for a resistor, and gotten started with analogWrite(). Please take a look at the advanced LED tutorial (multiple LEDs, using a for() loop, and an alternative to delay()) or some of the other tutorials for more!

oak/tutorials/leds.txt · Last modified: 2016/03/22 20:50 by jwhendy