[ Arduino+Python ] 做一个串口屏,显示CPU使用率
Arduino 和 Python 虽然是不同的编程语言,但并不影响共同实现一个制作。(传统说法就是一个在上位机编程,一个给下位机编程)
只需要下图所示的两个常见零件 UNO 和 LCD 盾板( 2.4‘ TFT 驱动 ILI9341 ),如果你手里正好有,那么不妨用起来, Arduino Python 都熟悉的话,copy 一下代码,分分钟。
即插即用,不用面包板,不用杜邦线,不用嘉立创打板,不用焊接,你还等什么?
像 Lego 一样,LCD 和 UNO 都可以拆为他用,不损耗一丁点材料。
经过几天使用,不断完善,基本可以投入实用了。
串口命令里可以调整 字体和背景颜色,字号,具体用法看后面的python实例。
【 上篇 --- DIY一个 串口屏 】
刚入坑就有了一个 LCD 盾板,虽然有触摸屏,做完例程就一直在吃灰,因为TA把 UNO 的端口几乎占完了,就剩下串口,还不方便插其他串口模块。最近一直折腾 0.96’OLED,实在太小,于是又想起这块2.4‘的屏。因为端口的原因,可以做的有限,那就先做个串口屏。虽然市面也有成品 串口屏 ,不过自己做的控制命令定制方便。
首先,给 UNO 写入 arduino 代码:
#include <Adafruit_GFX.h> // Core graphics library
#include <Adafruit_TFTLCD.h> // Hardware-specific library
#include <string.h>
#define LCD_CS A3 // Chip Select goes to Analog 3
#define LCD_CD A2 // Command/Data goes to Analog 2
#define LCD_WR A1 // LCD Write goes to Analog 1
#define LCD_RD A0 // LCD Read goes to Analog 0
#define LCD_RESET A4 // Can alternately just connect to Arduino's reset pin
#define USE_ADAFRUIT_SHIELD_PINOUT
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFFAdafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
String str;
int background_color;void setup(void) {background_color=BLACK;Serial.begin(115200); uint16_t identifier = tft.readID(); // (16进制) 37697 =(10进制)9341tft.begin(identifier);Serial.print(identifier,HEX); // 以16进制打印Serial.print("TFT size is "); Serial.print(tft.width()); Serial.print("x"); Serial.println(tft.height());tft.fillScreen(background_color); // 假假来个欢迎界面tft.setRotation(3);tft.setCursor(0, 40);tft.setTextColor(CYAN); tft.setTextSize(5);tft.print("Hello T800"); tft.setCursor(0, 110);tft.setTextColor(MAGENTA); tft.setTextSize(3);tft.print("Feed me something");delay(2000);tft.fillScreen(background_color);tft.setCursor(0, 0);}void loop(void) { while (Serial.available() > 0) // 检查串口是否有数据,有就一个一个字符读出来,合并为字符串 str{ str += char(Serial.read());delay(2);}if (str.length() > 0) // 如字符串 str 非空,表示收到了些内容。显示之前先判断是否是设置命令。{ if(str == "cls"){ // 收到 cls 清屏命令 tft.fillScreen(background_color); // 清屏(就是全色填充,默认黑色)tft.setCursor(0, 0); // 光标返回左上角str = ""; // 命令无需显示} else if(str == "setback_white"){ // 设置背景 白色background_color = WHITE;str = "";}else if(str == "setback_black"){ // 设置背景 黑色background_color = BLACK;str = "";}else if(str == "setback_green"){ // 设置背景 绿色background_color = GREEN;str = "";}else if(str == "setback_red"){ // 设置背景 红色background_color = RED;str = "";}else if(str == "setback_blue"){ // 设置背景 蓝色background_color = BLUE;str = "";}else if(str == "setback_yellow"){ // 设置背景 黄色background_color = YELLOW;str = "";}else if(str == "setback_cyan"){ // 设置背景 青色background_color = CYAN; str = "";}else if(str == "setback_magenta"){ // 设置背景 洋红色background_color = MAGENTA;str = "";}else if(str == "setfont_1"){ // 设置字号1tft.setTextSize(1);str = "";}else if(str == "setfont_2"){ // 设置字号2tft.setTextSize(2);str = "";}else if(str == "setfont_3"){ // 设置字号3tft.setTextSize(3);str = "";}else if(str == "setfont_4"){ // 设置字号4tft.setTextSize(4);str = "";} else if(str == "setfont_5"){ // 设置字号5tft.setTextSize(5);str = "";}else if(str == "setfont_white"){ // 设置字体颜色 白tft.setTextColor(WHITE);str = "";}else if(str == "setfont_black"){ // 设置字体颜色 黑tft.setTextColor(BLACK);str = "";}else if(str == "setfont_green"){ // 设置字体颜色 绿tft.setTextColor(GREEN);str = "";}else if(str == "setfont_red"){ // 设置字体颜色 红tft.setTextColor(RED);str = "";} else if(str == "setfont_blue"){ // 设置字体颜色 蓝tft.setTextColor(BLUE);str = "";}else if(str == "setfont_yellow"){ // 设置字体颜色 黄 tft.setTextColor(YELLOW); str = "";} else if(str == "setfont_cyan"){ // 设置字体颜色 青 tft.setTextColor(CYAN); str = "";}else if(str == "setfont_magenta"){ // 设置字体颜色 洋红tft.setTextColor(MAGENTA); str = "";} else{ // 前面都是设置命令,执行完并不显示,下面才是把收到的字符串显示出来,显示后换行并清空变量,tft.println(str);Serial.println(str);str = "";}}
}
具体怎么操作,注意看程序里 str 后面的 绿色关键字 ,在串口调试工具里输入试试看,注意大小写。
在串口调试软件里面发送些测试文字,效果如下:
【 下篇 --- 串口屏 使用实例:显示CPU使用率 】
之前写过 python 获取硬件信息 的文章,那就用python好了。
先用 python 熟悉下串口操作:
import serial # 导入模块 ,没有 pip3 install pyserial
import timetry:portx="COM5"bps=9600timex=5ser=serial.Serial(portx,bps,timeout=timex)while True:ser.write("cls".encode("ascii"))time.sleep(0.12) # 没有延时和后面一波字符串连接一块了,不被识别ser.write("setfont_red".encode("ascii"))time.sleep(0.12)ser.write("1234567890ABCDEF".encode("ascii"))time.sleep(0.12)ser.write("setfont_green".encode("ascii"))time.sleep(0.12)ser.write("!@#$%^&*()_+=".encode("ascii"))time.sleep(0.12) ser.write("setfont_yellow".encode("ascii"))time.sleep(0.12)ser.write("when all the winds agains you".encode("ascii"))time.sleep(1) ser.close() #关闭串口except Exception as e:print("---异常---:",e)
接下来开始实战,实现显示CPU各核心的使用率
python 代码:
import serial
import time
import psutil
import re
import serial.tools.list_portscom_auto_detect = 'Null'port_list = list(serial.tools.list_ports.comports()) # print(port_list) 获得的列表不太容易看得懂if len(port_list) == 1: # 通常这里 ==0,表示列表空。不过我的笔记本扩展坞已有个硬件串口占用COM1.USB串口默认COM3开始,所以+1print('没有可用的USB串口设备')
else:for i in range(1,len(port_list)): # 从1开始,忽略0 即扩展坞 COM1 com_auto_detect = str(port_list[i])[0:4] # 转换为字符串,再截取其前5位print("找到可用的USB串口设备: ",com_auto_detect) # 循环完保留最后一个串口号,只有一个串口设备的情况下就是串口屏,至于怎么准确判断,还需要进一步考虑,比如发个设备名查询send_interval = 0.05 # 两次发送如没有间隔会和后面一波字符串连接一块。实测最低值 UNO=0.13 ESP8266=0.88(有些奇异,都是CH340芯片) try:ser=serial.Serial(com_auto_detect,115200,timeout=5) # 串口初始化, 手工指定 替换c om_auto_detect 为 COM5"while True:ser.write("cls".encode("ascii"))time.sleep(0.13) # 前两次需要间隔长些,原因不明 f = psutil.cpu_freq() # print(type(f)) # f 是个 类f = str(f) # 先转换为字符串,方便处理f = f.split(",",1)[0] # 取 逗号 前f = f.split("=",1)[1] # 再取 等号 后f = "Freq: " + f + " MHz"ser.write("setfont_magenta".encode("ascii")) # 前两次需要间隔长些,原因不明 time.sleep(0.13) ser.write("setfont_3".encode("ascii")) time.sleep(send_interval) ser.write(str(f).encode("ascii")) time.sleep(send_interval) ser.write("setfont_green".encode("ascii")) # CPU 总使用率time.sleep(send_interval)ser.write("setfont_5".encode("ascii"))time.sleep(send_interval)a = psutil.cpu_percent()a = "CPU:" + str(a) + "%" ser.write(str(a).encode("ascii")) time.sleep(send_interval) ser.write("setfont_cyan".encode("ascii")) # 各核心使用率time.sleep(send_interval)ser.write("setfont_2".encode("ascii"))time.sleep(send_interval)a = psutil.cpu_percent(percpu=True) for i in range(8): # 8核心 (4T8C)a[i] = " CPU"+ str(i) +": "+ str(a[i]) +"%" # 更直观显示a[i]ser.write(str(a[i]).encode("ascii"))time.sleep(send_interval) time.sleep(1.5) # cls 前保留时间ser.close() # 关闭串口except Exception as e:e = str(e).split(":",1)[0] print("遇到一点意外:",e)
下图是 AIDA64 压力测试,CPU 飙到 100
暂停测试 CPU 回落,刷新原因拍照没抓住全屏,意思到了就行。
下面是完善后的实图,比较符合我的预期了。
[ Arduino+Python ] 做一个串口屏,显示CPU使用率相关推荐
- 使用VGUS简单做一个串口屏
目录 界面设计 硬件连接 界面设计 新建项目先选择好对应的串口屏型号和分辨率,新建了项目以后文件夹底下.vt文件是直接的工程文件可以直接打开 导入图片格式必须是jpg,可以用wps直接转换,注意分辨率 ...
- 用 python 做一个动态可视化交互大屏
你可能经常会在公司前台.展会.路演时看到可视化数据的交互大屏.今天我们就来用 python 做一个动态可视化的交互大屏图. 一.项目背景 随着科技的飞速发展,数据呈现爆发式的增长,任何人都摆脱不了与数 ...
- python显示圆周率的值是多少_用python做一个有趣的实验,看你的生日是否出现在圆周率中...
原标题:用python做一个有趣的实验,看你的生日是否出现在圆周率中 前言: 看到圆周率这个词,突然冒出一个灵感怎么知道我的生日在不在圆周率的中又或者在第几位呢?带着这个想法去网上找了一堆数据,最后找 ...
- 【Python】如何用python做一个简单的输入输出交互界面?
看到知乎上有人在问,如何使用Python做一个简单的输入输出交互界面? 交互界面就涉及到GUI编程. Python有很多GUI框架,功能大同小异. 其中比较出名的有「PyQT」.**wxPython. ...
- python写520_用Python做一个520表白神器,值得收藏
本文最后给出了打包好的软件,无需安装Python环境和各种依赖,直接下载软件,解压后,双击exe文件即可使用. 先来看一下具体的效果. 运行程序. 用Python做一个520表白神器,值得收藏 点击「 ...
- python自己做个定时器_技术图文:如何利用 Python 做一个简单的定时器类?
原标题:技术图文:如何利用 Python 做一个简单的定时器类? 背景 今天在B站上看有关 Python 最火的一个教学视频 -- "零基础入门学习 Python",这也是我们 P ...
- python实战扫码下载_实例:用 Python 做一个扫码工具
原标题:实例:用 Python 做一个扫码工具 来自公众号: 新建文件夹X 链接:https://blog.csdn.net/ZackSock/article/details/108610957Pyt ...
- 利用Python做一个漂亮小姐姐词云跳舞视频
最近不少小伙伴在学 Python,想找个好玩的练手项目. 那今天分享一个,简单,适合新手的 Python 小项目. 以下是具体项目: 本文将以哔哩哔哩–乘风破浪视频为例,you-get下载视频. 同时 ...
- 名片管理系统python详解_详解Python做一个名片管理系统
详解Python做一个名片管理系统 来源:中文源码网 浏览: 次 日期:2019年11月5日 [下载文档: 详解Python做一个名片管理系统.txt ] (友情提示:右键点上行txt文 ...
最新文章
- Centos 7 让docker飞一会儿
- 笑岔气!一个程序员的水平能差到什么程度?
- 两种超级智能,哪一个对人类未来影响更为深远?
- 数据结构与算法 整理笔记---二叉搜索树
- linux目录名含义
- scrapy-redis
- 运行报错provider = models.ForeignKey(Provider, on_delete=True) TypeError(‘on_delete must be callable.‘)
- HTMl5 的新特性
- 自动获取关键词插件,双标题关键词插件
- c语言 t跳几个字节,int占几个字节(c语言)
- lammps教程:原子平动和振动的设置方法
- 【概率论与数理统计】1.2 概率的定义及其确定方法
- 三津谈保险系统建设:序言
- 通达信 移动平均算法_通达信擒龙攻防战法主图指标公式
- YOLOX训练代码分析3-损失函数
- 根据订单号查询并复制一行
- RNA-seq流程报告
- 推荐5款干净又实用的软件
- 2020年电商行业的前景
- 计算机d盘被锁,修复被“逻辑锁”锁住的硬盘几招 -电脑资料