用树莓派3搞一个信号灯输出

通过一个python脚本跑一个监控 cpu 的交通信号灯,运行环境是官方的系统 Raspbian

执行脚本

有编程基础的同学就直接上手好了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#! /usr/bin/env python
# to use with Pi Traffic Light

import RPi.GPIO as GPIO
import psutil

GREEN = 13
YELLOW = 19
RED = 26

# Pin Setup:
GPIO.setmode(GPIO.BCM) # Broadcom pin-numbering scheme.
GPIO.setwarnings(False)
GPIO.setup(GREEN, GPIO.OUT)
GPIO.setup(YELLOW, GPIO.OUT)
GPIO.setup(RED, GPIO.OUT)

try:
while (1):
cpu_pc = psutil.cpu_percent(interval=2)
print 'CPU: %d%%' % (cpu_pc)
if cpu_pc <= 50:
GPIO.output(RED, False)
GPIO.output(YELLOW, False)
GPIO.output(GREEN, True)
if 50 < cpu_pc < 90:
GPIO.output(GREEN, False)
GPIO.output(RED, False)
GPIO.output(YELLOW, True)
if cpu_pc >=90 :
GPIO.output(GREEN, False)
GPIO.output(YELLOW, False)
GPIO.output(RED, True)
except KeyboardInterrupt:
print "Good bye"
GPIO.output(GREEN, False)
GPIO.output(YELLOW, False)
GPIO.output(RED, False)
GPIO.cleanup()
  • 如果出现提示****line 5, in <module> import psutil***** 提示缺少psutil模块,就按照下面的
    方法安装:

    代码原文

    1
    2
    3
    wget https://pypi.python.org/packages/source/p/psutil/psutil-3.2.2.tar.gz
    cd psutil-3.2.2
    python setup.py install

如果报错检查 gcc,python-devel 是否安装(官方系统的话会把这些环境默认安装好,不用管的)

针脚怎么插?

软件方面的搞定了,接下来需要搞明白怎么配置硬件了,这是树莓派系列的针脚图(咱们这是3代,最右边的那个):
树莓派针脚
我又从网上找的一张实物图
树莓派实物图
这是我淘来的信号灯
信号灯
这两个都是针脚型的,但是我有一个40针脚的扁平线可以用来对接,按照信号灯指定的端口插就行

插好以后就直接运行脚本就行比如这个脚本叫做 traffic.py,就运行

1
$ python ./traffic.py

就能看到效果

代码都做了什么?

  1. 引入需要用到的模块, RPi.GPIO针脚输出,psutil用于系统监控

    1
    2
    3
    4
    5
    #! /usr/bin/env python
    # to use with Pi Traffic Light

    import RPi.GPIO as GPIO
    import psutil
  2. 定义三个灯输出的针脚

    1
    2
    3
    GREEN = 13
    YELLOW = 19
    RED = 26
  3. 对指定的针脚进行设置

    1
    2
    3
    4
    5
    6
    # Pin Setup:
    GPIO.setmode(GPIO.BCM)
    GPIO.setwarnings(False)
    GPIO.setup(GREEN, GPIO.OUT)
    GPIO.setup(YELLOW, GPIO.OUT)
    GPIO.setup(RED, GPIO.OUT)
    • 这里的 GPIO.setmode(GPIO.BCM)就是指定了输出模式为按照信道编号,就是上图中的GPIO2,GPIO3...这类
      如果GPIO.setmode(GPIO.BOARD)就是Pin No.1 => GPIO1,使用物理针脚的编号作为输出信道
    • GPIO.setwarnings(False) 关闭warning 提示
    • GPIO.setup(GREEN, GPIO.OUT) 将对应的信道设置为输出信道
  4. 通过 while 循环检索 cpu 的使用情况并输出,且根据所占百分比显示相应的灯

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    while (1):
    cpu_pc = psutil.cpu_percent(interval=2)
    print 'CPU: %d%%' % (cpu_pc)
    if cpu_pc <= 50:
    GPIO.output(RED, False)
    GPIO.output(YELLOW, False)
    GPIO.output(GREEN, True)
    if 50 < cpu_pc < 90:
    GPIO.output(GREEN, False)
    GPIO.output(RED, False)
    GPIO.output(YELLOW, True)
    if cpu_pc >=90 :
    GPIO.output(GREEN, False)
    GPIO.output(YELLOW, False)
    GPIO.output(RED, True)
    • GPIO.output(GREEN, False)GPIO.output(GREEN, True)猜都能猜到是控制输出的啦
  5. 对于程序退出的操作:把灯全关了,再调用GPIO.cleanup()释放资源

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    try:

    // some code....

    except KeyboardInterrupt:
    print "Good bye"
    GPIO.output(GREEN, False)
    GPIO.output(YELLOW, False)
    GPIO.output(RED, False)
    GPIO.cleanup()

总结

这个 demo 只是对 GPIO 的输出进行展示,还没涉及到信号输入,接下来如果有空的话我会做一个输入的 demo

相关-极客大讲堂:手把手教你用树莓派控制红绿灯

这个博客有个赞赏功能,不试一下吗?