树莓派 SAKS 扩展板进阶例程 之 呼吸灯

20150323203240989-0

本文所介绍的内容基于树莓派瑞士军刀扩展板(SAKS),由于 SAKS 基于树莓派通用的 GPIO 设计,文中的原理和代码也适用于其他情况。

本文由树莓派实验室创作,遵循CC协议(署名-非商业性使用-禁止演绎-相同方式共享),欢迎树莓派爱好者们遵循协议内容转载传播。谢绝不遵守协议的转载和抄袭。

本节将介绍如何基于 PWM 来实现呼吸灯。当检测到后台有下载进程(wget)正在运行的时候,呼吸灯闪烁,而进程如果运行结束,则停止闪烁保持常亮状态。

本例程中涉及到的 SAKS 扩展板引脚编号如下:

功能

注释

BOARD
编码

BCM
编码

wiringPi
编码

LED排灯 LED-D6 第5个LED(绿) 27 0 30

先实现一个不用监控进程的呼吸灯效果,程序代码如下:


import RPi.GPIO as GPIO

import time



GPIO.setmode(GPIO.BCM)

GPIO.setup(0, GPIO.OUT)

pwm = GPIO.PWM(0, 50)

pwm.start(0)

pause_time = 0.01



try:

    while True:

        for i in xrange(0, 101, 1):

            pwm.ChangeDutyCycle(i)

            # off

            time.sleep(pause_time)



        time.sleep(1)



        for i in xrange(100, -1, -1):

            pwm.ChangeDutyCycle(i)

            # on

            time.sleep(pause_time)

            

except KeyboardInterrupt:

    # stop the white PWM output

    pwm.stop()

    # clean up GPIO on CTRL+C exit

    GPIO.cleanup()

保存为breathinglight.py,运行这段程序代码,将看到绿色的呼吸灯渐强渐弱,缓慢闪烁。其中 GPIO.PWM(0, 50) 表示在BCM编号为0的IO脚设置一个频率为50HZ的PWM实例。pwm.start(0)用来设定占空比,0表示没有波动。PWM的具体用法可以参考 ../../../nopathsource/fe9e9968c5df92f612fe55580cbf7e19.html2014/11/13/rpi-gpio-module-pwm-basic-function.html

sudo python breathinglight.py

下面将加入对下载进程的监控。首先要了解当系统进程中有 wget 命令在运行时,表示存在文件的下载。当然,任何进程都可能出现下载数据的可能,而我们只打算检测 wget 命令方式的下载。

读取系统进程列表,如果发现 wget 命令,则返回 TRUE。将这段逻辑加入上面呼吸灯的代码中。


import RPi.GPIO as GPIO

import time

import subprocess



GPIO.setmode(GPIO.BCM)

GPIO.setup(0, GPIO.OUT)

# 默认点亮LED表示正在检测进程

GPIO.output(0, GPIO.LOW)

pwm = GPIO.PWM(0, 50)

pwm.start(0)

pause_time = 0.01



def process_exist():

    proc = subprocess.Popen("ps aux | grep wget", stdout = subprocess.PIPE, stderr = subprocess.PIPE, shell = True)

    stdout = proc.communicate()

    for line in stdout:

        if line.count('http') > 0:

            print(line)

            return True



    return False



try:

    while True:

        if process_exist():

            for i in xrange(0, 101, 1):

                pwm.ChangeDutyCycle(i)

                # off

                time.sleep(pause_time)



            time.sleep(1)



            for i in xrange(100, -1, -1):

                pwm.ChangeDutyCycle(i)

                # on

                time.sleep(pause_time)

        else:

            time.sleep(pause_time * 10)



except KeyboardInterrupt:

    # stop the white PWM output

    pwm.stop()

    # clean up GPIO on CTRL+C exit

    GPIO.cleanup()

运行之后,如果系统中没有尚未执行完的 wget 进程,绿色 LED 将常亮。

screen sudo python breathinglight.py

再 Crtl-A 接着按下 D 键切换出终端,并手动运行一个 wget 命令,下载一个较大的文件测试下,此处的文件 URL 请自己替换。

wget http://xxx.xxx.xxx.xxx/test.exe

此时绿色的 LED 将开始闪烁。

这个功能将让你通过 SAKS 扩展板的 LED 了解对大文件的下载完成情况。也可以稍加改变,检测其他进程的运行情况。

我们后面将介绍更多基于 SAKS 扩展板的有趣的内容,欢迎持续关注!

本文属于《树莓派瑞士军刀扩展板(SAKS)DIY 教程》系列文章,查看系列文章目录,请访问:../../../nopathsource/fe9e9968c5df92f612fe55580cbf7e19.htmlswiss-army-knife-shield-for-raspberry-pi-diy-tutorials

这是一篇发布于 9年 前的文章,其中的信息可能已经有所发展或是发生改变,请了解。


1 Trackback / Pingback

  1. 树莓派GPIO入门:GPIO控制RGB彩色LED灯 – raspberry磨刀小试

发表评论

你的邮件地址不会公开


*