1.目的与效果介绍
之前博客中介绍了树莓派如何使用RGB彩灯,点击查看。本篇博客就基于RGB彩灯实现CPU和内存使用率的彩色量化显示。实现效果如下。 上图即是5个量化等级所对应的彩灯效果,实际效果要比拍摄的好很多。下图是树莓派终端输出结果。
2.硬件准备
主要需要准备RGB彩灯一个,接口非常简单,按照之前博客接树莓派的GPIO口就可以了。3.3V和5V都可以,5V的会更亮一些。
3.代码编写
对于RGB彩灯颜色控制采用PWM实现,通过Linux相关命令分别获取CPU或内存的使用状态,代码相对简单。
# coding=utf-8
import os
import RPi.GPIO as GPIO
import time
import sys
# GPIO口序号与亮灯持续时间
R, G, B = 40, 38, 36
t = 2
def light(usage):
GPIO.setmode(GPIO.BOARD)
GPIO.setup(R, GPIO.OUT)
GPIO.setup(G, GPIO.OUT)
GPIO.setup(B, GPIO.OUT)
pwmR = GPIO.PWM(R, 70)
pwmG = GPIO.PWM(G, 70)
pwmB = GPIO.PWM(B, 70)
pwmR.start(0)
pwmG.start(0)
pwmB.start(0)
if 0 <= usage < 20:
# 青色
pwmR.ChangeDutyCycle(100)
pwmG.ChangeDutyCycle(0)
pwmB.ChangeDutyCycle(80)
time.sleep(t)
elif 20 <= usage < 40:
# 绿色
pwmR.ChangeDutyCycle(100)
pwmG.ChangeDutyCycle(0)
pwmB.ChangeDutyCycle(100)
time.sleep(t)
elif 40 <= usage < 60:
# 黄色
pwmR.ChangeDutyCycle(0)
pwmG.ChangeDutyCycle(40)
pwmB.ChangeDutyCycle(100)
time.sleep(t)
elif 60 <= usage < 80:
# 橙色
pwmR.ChangeDutyCycle(0)
pwmG.ChangeDutyCycle(80)
pwmB.ChangeDutyCycle(100)
time.sleep(t)
elif 80 <= usage < 100:
# 红色
pwmR.ChangeDutyCycle(0)
pwmG.ChangeDutyCycle(100)
pwmB.ChangeDutyCycle(100)
time.sleep(t)
pwmR.stop()
pwmG.stop()
pwmB.stop()
GPIO.cleanup()
def getRAMinfo():
p = os.popen('free')
i = 0
while 1:
i = i + 1
line = p.readline()
if i == 2:
RAM_stats = (line.split()[1:4])
RAM_total = round(int(RAM_stats[0]) / 1000, 1)
RAM_used = round(int(RAM_stats[1]) / 1000, 1)
RAM_free = round(int(RAM_stats[2]) / 1000, 1)
return (RAM_used / RAM_total) * 100
def getCPUuse():
time1 = os.popen('cat /proc/stat').readline().split()[1:5]
time.sleep(0.2)
time2 = os.popen('cat /proc/stat').readline().split()[1:5]
deltaUsed = int(time2[0]) - int(time1[0]) + int(time2[2]) - int(time1[2])
deltaTotal = deltaUsed + int(time2[3]) - int(time1[3])
cpuUsage = float(deltaUsed) / float(deltaTotal) * 100
return cpuUsage
try:
flag = sys.argv[1]
if flag == 'cpu':
while True:
res = getCPUuse()
print 'CPU usage:', res, "%"
light(res)
elif flag == 'ram':
while True:
res = getRAMinfo()
print 'RAM usage:', res, "%"
light(res)
else:
print "wrong type."
except KeyboardInterrupt:
GPIO.cleanup()
代码整体用try语句嵌套,捕获键盘中断异常,这样当我们在终端按Ctrl+C停止程序时,会执行except部分,这样就不会出现程序结束后GPIO口没有清理的情况。
5.总结
本篇博客实现的内容比较简单,主要是PWM的练习以及Linux下获取CPU使用频率与内存的命令的学习。
本文作者原创,未经许可不得转载,谢谢配合