树莓派控制LED闪烁和呼吸

  • 发布时间:2016年7月21日 14:29
  • 作者:杨仕航
  • 分类标签: 硬件
  • 阅读(12779)
  • 评论(0)

这里所谓的LED指的是发光二极管。树莓派控制发光二极管是GPIO编程的入门级程度,相当于Hello World。

我尝试了两种控制LED的方式:闪烁和呼吸灯。


一、闪烁

闪烁的原理很简单,就是控制LED的开关,打开LED一段时间和关闭LED一段时间。反复操作就形成闪烁的现象。

接线也很简单,发光二极管的正极接在GPIO的输出引脚(这里我接在12号引脚),负极接在零极即可。

接线比较简单,可以不用面包板,用两条母对母的杜邦线也行。

接线之后,写脚本控制LED闪烁:

#coding:utf-8
#Python 2.7
from RPi import GPIO as g
import time
import sys

def flash(port=12, step=1):
    g.setmode(g.BOARD)
    g.setup(port, g.OUT) #设置引脚输出模式
    
    try:
        while(True):
            g.output(port, 1) #亮灯
            time.sleep(step)  #休息一下
            g.output(port, 0) #灭灯
            time.sleep(step)
    except KeyboardInterrupt:
        #按下Ctrl+C退出循环
        g.cleanup()

if __name__ == '__main__':
    flash()

保存文件名为led_flash.py,在终端找到对应的位置,输入python led_flash.py运行脚本。就可以看到效果:

因为写的是死循环,会一直闪烁下去。按Ctrl+C就可以退出。


二、呼吸灯

单单只是闪烁,满足不了我开发的欲望。查了一下,树莓派还可以实现呼吸灯的效果。参考了一段代码,修改如下:

#coding:utf-8
#Python 2.7
from RPi import GPIO as g
import time

def breathe(port=12, step=3):
    g.setmode(g.BOARD)
    g.setup(port, g.OUT) #设置引脚输出模式
    
    #PWM模拟信号输出,这个大家可以自行搜索一下
    pwm = g.PWM(port, 50)
    pwm.start(0)
    
    try:
        while(True):
            #从最低到最高
            for i in range(0, 101, 2):
                pwm.ChangeDutyCycle(i)
                #把3秒分成100份,即每3秒完成一次最低到最亮的过程
                time.sleep(step/100.)
                
            #从最高到最低
            for i in range(100, -1, -2):
                pwm.ChangeDutyCycle(i)
                time.sleep(step/100.)
                
    except KeyboardInterrupt:
        #按下Ctrl+C退出循环
        pwm.stop()
        g.cleanup()

if __name__ == '__main__':
    breathe()

保存文件名为led_breathe.py,同样打开终端,找到该脚本的位置,执行命令python led_breathe.py。可以看到效果如下:

虽然LED可以由暗到明,再由亮到灭,不过这个亮度变换比较生硬,呈线性变化。画个图容易理解:

这种方式没有呼吸的感觉。呼吸应该有那种淡入淡出的感觉。我不由的想到三角函数sin和cos。这两个函数是周期性的,有淡入淡出的效果。

这两个函数效果都一样。它们的值是在[-1,1]之间变化,需要稍作调整,令其在[0,100]之间变化。

下图是 y=(sin(x/pi/7-0.5*pi)/2+0.5)*100 的图像,7是控制速度的,这里可以自行调整。

调整好函数之后,就修改代码:

#coding:utf-8
#Python 2.7
__author__ = u'杨仕航'

from RPi import GPIO as g
from math import sin, pi
import time

def breathe(port=12, step=5, speed=7):
    g.setmode(g.BOARD)
    g.setup(port, g.OUT) #设置引脚输出模式
    
    #PWM模拟信号输出
    pwm = g.PWM(port, 50)
    pwm.start(0)
    
    try:
        while(True):
            for i in range(speed*100):
                value = int((sin(i/pi/speed - 0.5*pi)/2 + 0.5)*100)
                pwm.ChangeDutyCycle(value)
                time.sleep(step/100.)
                
    except KeyboardInterrupt:
        #按下Ctrl+C退出循环
        pwm.stop()
        g.cleanup()

if __name__ == '__main__':
    breathe()

保存文件名为led_breathe_ex.py,同样执行一下,就可以看到呼吸的效果。

(由于手机拍不出效果,这里就不贴图了。有兴趣可以自己试一下 ^_^)

上一篇:我的网站搭建(第23天) 第三方登录:QQ

下一篇:vb/vba抽取不重复随机数

评论列表

智慧如你,不想发表一下意见吗?

新的评论

清空