利用RGB彩灯实现CPU和内存使用率量化显示

Dec 14,2018   2096 words   8 min

Tags: RaspberryPi

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使用频率与内存的命令的学习。

本文作者原创,未经许可不得转载,谢谢配合

返回顶部