LED brightness values in the Serial Monitor are nice and good, but you probably want to control some actual hardware. So let’s go ahead – time to create a dimmer for your LED!
Your breadboard should now have both the LED with its current-limiting resistor and your potentiometer. If not, set them up quickly using this diagram that you already know from the previous lesson:
___STEADY_PAYWALL___
In the previous lesson, you saw how to use the potentiometer to generate values from 0 to 1023 on an analog pin.
You can use these values to directly “map” them to the LED’s brightness. This would mean that 0 represents an extinguished LED and 1023 represents maximum brightness.
However: There’s a small catch here. To control the LED’s brightness, we need an analog (variable) signal. This is created using pulse width modulation (PWM for short). Simply put, this allows you to simulate an analog signal through a digital pin. The signal strength or voltage is created by turning the pin on and off at a specific frequency.
This way, you can make the LED not just simply turn on or off (digitally), but you can make it “rotate” brighter or dimmer through higher or lower voltages.
However, when using PWM, only values from 0 to 255 are allowed. Your potentiometer “delivers” 0 to 1023. That’s why you need another new function: map();
How to bring the values together
The map function is extremely useful and will help you frequently in the future. Its principle is quite simple:
You take a specific value that lies in a range X. Then you determine what position this value would have in a different (larger or smaller) range Y.
In your sketch, it looks like this:
potiValue = analogRead(potiPin);
ledValue = map(potiValue, 0, 1023, 0, 255);
First, you read the current value of the potentiometer with the analogRead() function. The analog signal from the potentiometer is converted into a value from 0 to 1023 using the analog-to-digital converter.
The determined potiValue (potentiometer value) is the first parameter in the function, followed by the allowable range of the potentiometer, which is 0 to 1023.
Finally, there’s the range in which the corresponding potiValue should be found. This is the allowable range for PWM, which is 0 to 255. You then store the corresponding value in the ledValue variable.
Let the LED shine
Now you just need to send the ledValue to the LED. You do this with the analogWrite() function:
analogWrite(ledPin, ledValue);
This uses pulse width modulation and creates a signal that makes the LED light up with the desired brightness that you’ve set on the potentiometer.
Try it out right away! You can find the appropriate sketch in the Exercise Files for this lesson.