【Mind+ Python】使用matplotlib实现温度可视化监测
本帖最后由 Ski 于 2021-3-22 18:47 编辑可视化温度实时监测窗口
Mind+ 1.70版本推出了期待已久的Python模式,不用再单独安装配置python环境,直接使用mind+软件就可以体验所有python功能。而且python模式下,代码模式内提供库管理功能,一键加载常用库。{:6_209:} Mind+ Python模式使用教程大家可以到官方教程中查看:Mind+ Python模式教程 。 已经看到有大佬在用mind+玩pinpong库了,用Mind+玩转PinPong库 ,看了这个帖子,突发奇想python有许多好用的数据处理库,我们可以利用这些工具,结合pinpong库,将硬件传感器数据导出或形成图表,进行数据分析或者是实时监测数据。 下面我们来试试做一个可视化温度实时监测窗口。
项目分析:
实现温度实时监测窗口,首先我们需要用到pinpong库,来控制硬件获取温度值;而将获取到的温度数值转为折线图,网上查了一下可以使用matplotlib库,matplotlib 是 Python 最常用的可视化工具,他可以被用来生成直方图、折线图、散点图等数据图表,非常强大,刚好符合我们想要的折线图效果。
准备工作:
1.打开mind+,从软件右上角切到Python模式,并且新建"temperature.py"文件。
2.选择“库管理”,加载安装pinpong库以及matplotlib库。
程序分析:
首先先确定一下需要实现的效果:
[*]通过UNO主控板获取LM35温度传感器温度值
[*]将采集到的温度值,记录形成折线图
[*]要实现实时监测,数据呈现的折线图需要为滚动动图,且横轴坐标应为时间戳
获取温度值,这里使用UNO主控和LM35温度传感器,将LM35温度传感器接到UNO板A0接口,如下图:
程序部分使用pinpong库,获取A0口的模拟值:
数据处理:
接着我们需要使用matplotlib库来处理数据,其中使用pyplot和animation两个方法,pyplot函数集类似于MATLAB,可以帮助我们绘图,animation可以实现动图效果,实现数据的实时更新。
前面我们提到,需要数据的实时更新,折线图的X轴坐标以时间戳的形式呈现,所以这里我们还需要加入datetime,用于调用时间值。
导入各个库之后,创建画布,并且修改画布样式,这里我们创建两个列表,对应折线图的x和y轴坐标值。
想要实现动图效果,这里我们使用FuncAnimation方法,首先我们先来了解一下FuncAnimation()函数:
FuncAnimation(fig,func,frames,init_func,interval,blit)
[*]fig:表示绘制动图的画布名称
[*]func:表示自定义动画函数
[*]frames:表示动画长度,一次循环包含的帧数,在函数运行时,其值会传递给动画函数
[*]init_func:表示自定义开始帧,即动画函数的初始化函数
[*]interval:表示更新频率,ms计
[*]blit:表示选择更新所有点,还是仅更新产生变化的点。基本选择位True
大概知道了这个函数的用法,前面我们已经定义了画图fig,并且给予了配置样式,同时创建了两个列表对应折线图的横纵轴坐标,那么我们还需要定义一个动画函数。
在动画函数中,我们需要确定x和y轴的数值,y轴在这里是我们需要的温度值,通过公式转化后,添加到ys列表中:ys.append(temp_c)
x轴使用时间值,调用datetime,以时间戳的形式添加进xs列表中:xs.append(dt.datetime.now().strftime('%H:%M:%S'))
在得到x和y轴数据后,调用plot绘制图形:ax.plot(xs, ys)
函数最后,我们还需要设置一下图像的格式,设置图标标题及坐标名称等。
动画函数完成后,调用FuncAnimation,填入画布名称及动画函数等等参数后,使用plt.show()绘制画布。
完整代码如下:
from matplotlib import pyplot as plt
from matplotlib.animation import FuncAnimation
import matplotlib.animation as animation
import datetime as dt
import time
from pinpong.board import Board,Pin,ADC#导入ADC类实现模拟输入
Board("uno").begin()#初始化,选择板型和端口号,不输入端口号则进行自动识别
#Board("uno","COM36").begin() #windows下指定端口初始化
#Board("uno","/dev/ttyACM0").begin() #linux下指定端口初始化
#Board("uno","/dev/cu.usbmodem14101").begin() #mac下指定端口初始化
adc0 = ADC(Pin(Pin.A0)) #将Pin传入ADC中实现模拟输入
plt.style.use('seaborn-pastel')# 修改图标样式,可以使用print(plt.style.available) 打印样式列表
fig = plt.figure()#创建图像fig
ax = fig.add_subplot(1, 1, 1) #增加1x1子图
#创建两个列表对应折线图的x、y轴数据
xs = []
ys = []
#定义动画函数
def animate(i, xs, ys):
temp_c = round(adc0.read()*(5/10.24), 2)#将A0模拟值转化为温度值并保留2位小数
# 将x、y轴坐标数据添加到xs、ys列表中
xs.append(dt.datetime.now().strftime('%H:%M:%S'))#x轴显示时间戳,时分秒
ys.append(temp_c)#y轴显示温度值
# 限定xs和ys列表数据范围
xs = xs[-20:]
ys = ys[-20:]
# 根据xs,ys绘制折线
ax.clear()
ax.plot(xs, ys)
# 图像格式
plt.xticks(rotation=45, ha='right')#坐标数值倾斜45°,数据沿x轴正无穷方向偏移
plt.subplots_adjust(bottom=0.30)#限制图标的区域边界
plt.title('temperature monitoring')#图标标题
plt.ylabel('temperature ')#y轴坐标
#调用animation方法,对象:画布fig,动画函数:animate,函数调用数值:(xs, ys),数据更新频率interval=1000 ms
ani = animation.FuncAnimation(fig, animate, fargs=(xs, ys), interval=1000)
#画布显示
plt.show()
完成效果如下:(其中修改了图表样式,效果更好看)
大神您好,非常感谢您的教程,有两个问题向您请教一下:
1.animate函数中第一个参数i是什么作用,貌似函数中没有用到。
2.我在项目中需要同时显示两个传感器的值,网上看到有关于matplotlib可以使用双y轴的用法,但是都是静态图,如何在动图中使用双坐标轴,请指导一下。
谢谢! glwz007 发表于 2021-9-8 10:27
大神您好,非常感谢您的教程,有两个问题向您请教一下:
1.animate函数中第一个参数i是什么作用,貌似函数 ...
第1个问题:i是帧数,FuncAnimation调用函数时帧数自动增加。
第2个问题:如果是同一个坐标轴中新增一个y数据,在程序中再新加一个ys2数组,并且在下面animate函数中新增ys2数值,就是上面程序中在xs、ys的地方,新增ys2即可
页:
[1]