We control LED brightness to make lights dimmer or brighter smoothly. This helps save energy and create nice lighting effects.
LED brightness control in 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.
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
ChangeDutyCycle to change LED brightness while running.pwm.ChangeDutyCycle(75) # Change brightness to 75%
pwm.stop() GPIO.cleanup()
This program slowly increases LED brightness from 0% to 100%, then back down to 0%, printing the brightness level each step.
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()
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.
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
Solution
Step 1: Understand PWM meaning
PWM is a technique used to control power by switching it on and off quickly.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.Final Answer:
Pulse Width Modulation -> Option DQuick Check:
PWM = Pulse Width Modulation [OK]
- Confusing PWM with power management
- Thinking PWM is a wiring method
- Mixing up acronyms
Solution
Step 1: Check PWM constructor parameters
RPi.GPIO PWM takes pin number first, then frequency in Hz.Step 2: Verify start method usage
start() takes initial duty cycle (0-100), so start(0) is correct for off initially.Final Answer:
pwm = GPIO.PWM(18, 1000); pwm.start(0) -> Option AQuick Check:
GPIO.PWM(pin, freq) then start(duty) [OK]
- Swapping frequency and pin
- Starting PWM with frequency instead of duty
- Using zero frequency
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)
Solution
Step 1: Understand duty cycle effect
Duty cycle 75 means LED receives power 75% of the time, so brightness is 75%.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.Final Answer:
LED will be at 75% brightness -> Option CQuick Check:
ChangeDutyCycle(75) = 75% brightness [OK]
- Confusing duty cycle with frequency
- Thinking 0 means full brightness
- Forgetting to start PWM before changing duty
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()
Solution
Step 1: Check PWM start and ChangeDutyCycle order
ChangeDutyCycle must be called after pwm.start(), not before.Step 2: Correct the order
Swap lines so pwm.start(50) comes before pwm.ChangeDutyCycle(50).Final Answer:
ChangeDutyCycle called before start; swap their order -> Option BQuick Check:
start() must come before ChangeDutyCycle() [OK]
- Calling ChangeDutyCycle before start
- Cleaning up GPIO too early
- Incorrect frequency assumptions
Solution
Step 1: Calculate total steps and delay
To increase from 0 to 100 in 5 seconds smoothly, small steps with short delay are needed.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.Final Answer:
import time for dc in range(0, 101): pwm.ChangeDutyCycle(dc) time.sleep(0.05) -> Option AQuick Check:
101 steps * 0.05s = ~5 seconds smooth ramp [OK]
- Using too few steps causing jumps
- Incorrect total time calculation
- Multiplying duty cycle incorrectly
Ready to prove it?
Pass the test and this pattern moves unknown
