Bird
Raised Fist0
Raspberry Piprogramming~5 mins

LED brightness control in Raspberry Pi

Choose your learning style10 modes available
Introduction

We control LED brightness to make lights dimmer or brighter smoothly. This helps save energy and create nice lighting effects.

When you want to make a night light that gets dimmer over time.
To create mood lighting that changes brightness slowly.
When building a project that needs different light levels, like a lamp.
To show visual feedback by changing LED brightness based on sensor input.
Syntax
Raspberry Pi
import RPi.GPIO as GPIO
import time

led_pin = 18
frequency = 1000
duty_cycle = 50

GPIO.setmode(GPIO.BCM)
GPIO.setup(led_pin, GPIO.OUT)
pwm = GPIO.PWM(led_pin, frequency)
pwm.start(duty_cycle)

Use GPIO.PWM(pin, frequency) to create a PWM object controlling the LED.

duty_cycle is a number from 0 (off) to 100 (fully on) controlling brightness.

Examples
This sets up an LED on pin 18 with half brightness.
Raspberry Pi
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM)
GPIO.setup(18, GPIO.OUT)
pwm = GPIO.PWM(18, 1000)  # 1000 Hz frequency
pwm.start(50)  # 50% brightness
Use ChangeDutyCycle to change LED brightness while running.
Raspberry Pi
pwm.ChangeDutyCycle(75)  # Change brightness to 75%
Stop PWM and clean up GPIO pins when done.
Raspberry Pi
pwm.stop()
GPIO.cleanup()
Sample Program

This program slowly increases LED brightness from 0% to 100%, then back down to 0%, printing the brightness level each step.

Raspberry Pi
import RPi.GPIO as GPIO
import time

led_pin = 18
GPIO.setmode(GPIO.BCM)
GPIO.setup(led_pin, GPIO.OUT)

pwm = GPIO.PWM(led_pin, 1000)  # 1000 Hz frequency
pwm.start(0)  # start with LED off

try:
    for brightness in range(0, 101, 10):
        pwm.ChangeDutyCycle(brightness)
        print(f"LED brightness: {brightness}%")
        time.sleep(0.5)
    for brightness in range(100, -1, -10):
        pwm.ChangeDutyCycle(brightness)
        print(f"LED brightness: {brightness}%")
        time.sleep(0.5)
finally:
    pwm.stop()
    GPIO.cleanup()
OutputSuccess
Important Notes

Make sure to connect the LED with a resistor to avoid damage.

Use GPIO.cleanup() to reset pins after your program ends.

Frequency controls how fast the LED turns on and off; 1000 Hz is smooth for eyes.

Summary

LED brightness is controlled by changing PWM duty cycle from 0 to 100%.

Use RPi.GPIO library to set up PWM on Raspberry Pi pins.

Always clean up GPIO pins after use to avoid issues.

Practice

(1/5)
1. What does PWM stand for in the context of controlling LED brightness on a Raspberry Pi?
easy
A. Pulse Wire Mode
B. Power Wave Management
C. Pin Wiring Method
D. Pulse Width Modulation

Solution

  1. Step 1: Understand PWM meaning

    PWM is a technique used to control power by switching it on and off quickly.
  2. Step 2: Match PWM to full form

    Pulse Width Modulation means changing the width of the pulse to control power, which fits LED brightness control.
  3. Final Answer:

    Pulse Width Modulation -> Option D
  4. Quick Check:

    PWM = Pulse Width Modulation [OK]
Hint: PWM controls brightness by changing pulse width [OK]
Common Mistakes:
  • Confusing PWM with power management
  • Thinking PWM is a wiring method
  • Mixing up acronyms
2. Which of the following is the correct way to start PWM on GPIO pin 18 with a frequency of 1000 Hz using RPi.GPIO?
easy
A. pwm = GPIO.PWM(18, 1000); pwm.start(0)
B. pwm = GPIO.PWM(18); pwm.start(1000)
C. pwm = GPIO.PWM(1000, 18); pwm.start(0)
D. pwm = GPIO.PWM(18, 0); pwm.start(1000)

Solution

  1. Step 1: Check PWM constructor parameters

    RPi.GPIO PWM takes pin number first, then frequency in Hz.
  2. Step 2: Verify start method usage

    start() takes initial duty cycle (0-100), so start(0) is correct for off initially.
  3. Final Answer:

    pwm = GPIO.PWM(18, 1000); pwm.start(0) -> Option A
  4. Quick Check:

    GPIO.PWM(pin, freq) then start(duty) [OK]
Hint: PWM(pin, frequency) then start(duty cycle) [OK]
Common Mistakes:
  • Swapping frequency and pin
  • Starting PWM with frequency instead of duty
  • Using zero frequency
3. What will be the output brightness level of the LED after running this code snippet?
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(18, GPIO.OUT)
pwm = GPIO.PWM(18, 500)
pwm.start(0)
pwm.ChangeDutyCycle(75)
medium
A. LED will be at 25% brightness
B. LED will be off
C. LED will be at 75% brightness
D. Code will cause an error

Solution

  1. Step 1: Understand duty cycle effect

    Duty cycle 75 means LED receives power 75% of the time, so brightness is 75%.
  2. Step 2: Check code correctness

    Code sets up PWM on pin 18 at 500 Hz, starts at 0, then changes duty cycle to 75 correctly.
  3. Final Answer:

    LED will be at 75% brightness -> Option C
  4. Quick Check:

    ChangeDutyCycle(75) = 75% brightness [OK]
Hint: Duty cycle % equals brightness % [OK]
Common Mistakes:
  • Confusing duty cycle with frequency
  • Thinking 0 means full brightness
  • Forgetting to start PWM before changing duty
4. Identify the error in this code that controls LED brightness and fix it:
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(18, GPIO.OUT)
pwm = GPIO.PWM(18, 1000)
pwm.ChangeDutyCycle(50)
pwm.start(50)
GPIO.cleanup()
medium
A. Frequency 1000 is too high, use 100
B. ChangeDutyCycle called before start; swap their order
C. GPIO.cleanup() should be before pwm.start()
D. Missing GPIO.setwarnings(False)

Solution

  1. Step 1: Check PWM start and ChangeDutyCycle order

    ChangeDutyCycle must be called after pwm.start(), not before.
  2. Step 2: Correct the order

    Swap lines so pwm.start(50) comes before pwm.ChangeDutyCycle(50).
  3. Final Answer:

    ChangeDutyCycle called before start; swap their order -> Option B
  4. Quick Check:

    start() must come before ChangeDutyCycle() [OK]
Hint: Always start PWM before changing duty cycle [OK]
Common Mistakes:
  • Calling ChangeDutyCycle before start
  • Cleaning up GPIO too early
  • Incorrect frequency assumptions
5. You want to smoothly increase LED brightness from 0% to 100% over 5 seconds using PWM on pin 18. Which code snippet correctly implements this?
hard
A. import time for dc in range(0, 101): pwm.ChangeDutyCycle(dc) time.sleep(0.05)
B. import time for dc in range(0, 101, 10): pwm.ChangeDutyCycle(dc) time.sleep(0.5)
C. import time for dc in range(0, 101, 20): pwm.ChangeDutyCycle(dc) time.sleep(1)
D. import time for dc in range(0, 51): pwm.ChangeDutyCycle(dc*2) time.sleep(0.1)

Solution

  1. Step 1: Calculate total steps and delay

    To increase from 0 to 100 in 5 seconds smoothly, small steps with short delay are needed.
  2. Step 2: Analyze each option timing

    import time for dc in range(0, 101): pwm.ChangeDutyCycle(dc) time.sleep(0.05) uses 101 steps with 0.05s delay = 5.05s total, smooth increase.
  3. Final Answer:

    import time for dc in range(0, 101): pwm.ChangeDutyCycle(dc) time.sleep(0.05) -> Option A
  4. Quick Check:

    101 steps * 0.05s = ~5 seconds smooth ramp [OK]
Hint: Use small steps with short delay for smooth brightness [OK]
Common Mistakes:
  • Using too few steps causing jumps
  • Incorrect total time calculation
  • Multiplying duty cycle incorrectly
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard