Pi GPIO PWD LED: Difference between revisions
Andre Castro (talk | contribs) No edit summary |
|||
(4 intermediate revisions by 2 users not shown) | |||
Line 19: | Line 19: | ||
==Code== | ==Code== | ||
=== increasing / decreasing LED intensity == | === increasing / decreasing LED intensity === | ||
<source lang="python"> | <source lang="python"> | ||
#!/usr/bin/env python3 | #!/usr/bin/env python3 | ||
Line 27: | Line 27: | ||
LedPin = 12 | LedPin = 12 | ||
GPIO.setmode(GPIO.BOARD) # Numbers pins by physical location | GPIO.setmode(GPIO.BOARD) # Numbers pins by physical location ## or GPIO.BCM | ||
GPIO.setup(LedPin, GPIO.OUT) # Set pin mode as output | GPIO.setup(LedPin, GPIO.OUT) # Set pin mode as output | ||
GPIO.output(LedPin, GPIO.LOW) # Set pin initial value to low(0V) | GPIO.output(LedPin, GPIO.LOW) # Set pin initial value to low(0V) | ||
Line 53: | Line 53: | ||
</source> | </source> | ||
=== random LED intensity == | === random LED intensity === | ||
<source lang="python"> | <source lang="python"> | ||
#!/usr/bin/env python3 | #!/usr/bin/env python3 | ||
Line 61: | Line 61: | ||
LedPin = 12 | LedPin = 12 | ||
GPIO.setmode(GPIO.BOARD) # Numbers pins by physical location | GPIO.setmode(GPIO.BOARD) # Numbers pins by physical location ## or GPIO.BCM | ||
GPIO.setup(LedPin, GPIO.OUT) # Set pin mode as output | GPIO.setup(LedPin, GPIO.OUT) # Set pin mode as output | ||
GPIO.output(LedPin, GPIO.LOW) # Set pin initial value to low(0V) | GPIO.output(LedPin, GPIO.LOW) # Set pin initial value to low(0V) | ||
Line 93: | Line 93: | ||
GPIO.cleanup() # clean up resources | GPIO.cleanup() # clean up resources | ||
</source> | </source> | ||
[[Category:Cookbook]] | |||
[[Category:RaspberryPi]] |
Latest revision as of 16:12, 21 November 2018
How to change the brightness of an LED using the Pi's GPIO pins?
Based on: https://www.admfactory.com/breathing-light-led-on-raspberry-pi-using-python/
setup and testing
Start by following the basic setup and testing of the Pi's GPIO in RaspberryPi_GPIO
PWD
The way to change the brightness of an LED in digital electronics (only binary values are used 0v-5V or 0V-3.3V and no values in between), consists in creating a square waves that changes rapidly between 0V and 3.3V. By changing the portion of the time when the signal is on (3.3V) versus the time that the signal is off(0V) we can change the intensity of the LED. This technique is called Pulse Width Modulation (PWM), as we are modulating the "on" width of the wave.
Circuit
Connect the LED to pin 12, as in the following schematic. Taking care with the LED polarity
Code
increasing / decreasing LED intensity
#!/usr/bin/env python3
import RPi.GPIO as GPIO
import time
LedPin = 12
GPIO.setmode(GPIO.BOARD) # Numbers pins by physical location ## or GPIO.BCM
GPIO.setup(LedPin, GPIO.OUT) # Set pin mode as output
GPIO.output(LedPin, GPIO.LOW) # Set pin initial value to low(0V)
p = GPIO.PWM(LedPin, 1000) # set Frequece to 1KHz
p.start(0) # Start PWM output, Duty Cycle = 0
pwd_change_time = 0.1 # time it waits at every step of DutyCycle
try:
# loop indefinitly through 2 sub loops (increasing and decreasing duty cyle-brightness):
while True:
for dc in range(0, 101, 5): # Increase duty cycle: from 0 to 100, in steps of 5
p.ChangeDutyCycle(dc) # Change duty cycle
time.sleep( pwd_change_time ) # wait to get to next value
time.sleep(1)
for dc in range(100, -1, -5): # Decrease duty cycle: from 100 to 0, in steps of 5
p.ChangeDutyCycle(dc)
time.sleep( pwd_change_time )
time.sleep(1)
except KeyboardInterrupt: #Ctl-c will interrup
p.stop()
GPIO.output(LedPin, GPIO.LOW) # turn off led
GPIO.cleanup() # clean up resources
random LED intensity
#!/usr/bin/env python3
import RPi.GPIO as GPIO
import time
from random import randint
LedPin = 12
GPIO.setmode(GPIO.BOARD) # Numbers pins by physical location ## or GPIO.BCM
GPIO.setup(LedPin, GPIO.OUT) # Set pin mode as output
GPIO.output(LedPin, GPIO.LOW) # Set pin initial value to low(0V)
p = GPIO.PWM(LedPin, 1000) # set Frequece to 1KHz
p.start(0) # Start PWM output, Duty Cycle = 0
pwd_change_time = 0.1 # time it waits at every step of DutyCycle
dc_end=0
try:
# loop indefinitly:
while True:
dc_start = dc_end # start at value led was left of
dc_end = randint(0,100) # select random number between 0 and 100
if dc_start > dc_end: # if start value > end value: range step has to be negative
step = - 5
else:
step = 5
for dc in range(dc_start, dc_end, step):
p.ChangeDutyCycle(dc) # Change duty cycle
time.sleep(pwd_change_time )
time.sleep(1)
except KeyboardInterrupt: #Ctl-c will interrup
p.stop()
GPIO.output(LedPin, GPIO.LOW) # turn off led
GPIO.cleanup() # clean up resources