通过一个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
  1. 定义三个灯输出的针脚
1
2
3
GREEN = 13
YELLOW = 19
RED = 26
  1. 对指定的针脚进行设置
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) 将对应的信道设置为输出信道
  1. 通过 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)猜都能猜到是控制输出的啦
  1. 对于程序退出的操作:把灯全关了,再调用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

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