2021-3-22 18:12:10 [显示全部楼层]
10978浏览
查看: 10978|回复: 2

[项目分享] 【Mind+ Python】使用matplotlib实现温度可视化监测

[复制链接]
本帖最后由 Ski 于 2021-3-22 18:47 编辑

可视化温度实时监测窗口

       Mind+ 1.70版本推出了期待已久的Python模式,不用再单独安装配置python环境,直接使用mind+软件就可以体验所有python功能。
而且python模式下,代码模式内提供库管理功能,一键加载常用库。   
       Mind+ Python模式使用教程大家可以到官方教程中查看:Mind+ Python模式教程 。   
       已经看到有大佬在用mind+玩pinpong库了,用Mind+玩转PinPong库 ,看了这个帖子,突发奇想python有许多好用的数据处理库,我们可以利用这些工具,结合pinpong库,将硬件传感器数据导出或形成图表,进行数据分析或者是实时监测数据。
       下面我们来试试做一个可视化温度实时监测窗口。

项目分析:        
        实现温度实时监测窗口,首先我们需要用到pinpong库,来控制硬件获取温度值;而将获取到的温度数值转为折线图,网上查了一下可以使用matplotlib库,matplotlib 是 Python 最常用的可视化工具,他可以被用来生成直方图、折线图、散点图等数据图表,非常强大,刚好符合我们想要的折线图效果。

准备工作:

1.打开mind+,从软件右上角切到Python模式,并且新建"temperature.py"文件。

【Mind+ Python】使用matplotlib实现温度可视化监测图4


2.选择“库管理”,加载安装pinpong库以及matplotlib库。


【Mind+ Python】使用matplotlib实现温度可视化监测图2【Mind+ Python】使用matplotlib实现温度可视化监测图3


程序分析:

首先先确定一下需要实现的效果:
  • 通过UNO主控板获取LM35温度传感器温度值
  • 将采集到的温度值,记录形成折线图
  • 要实现实时监测,数据呈现的折线图需要为滚动动图,且横轴坐标应为时间戳


获取温度值,这里使用UNO主控和LM35温度传感器,将LM35温度传感器接到UNO板A0接口,如下图:

   
【Mind+ Python】使用matplotlib实现温度可视化监测图6

程序部分使用pinpong库,获取A0口的模拟值:

   
【Mind+ Python】使用matplotlib实现温度可视化监测图5
数据处理:

        接着我们需要使用matplotlib库来处理数据,其中使用pyplot和animation两个方法,pyplot函数集类似于MATLAB,可以帮助我们绘图,animation可以实现动图效果,实现数据的实时更新。
   
【Mind+ Python】使用matplotlib实现温度可视化监测图7      

        前面我们提到,需要数据的实时更新,折线图的X轴坐标以时间戳的形式呈现,所以这里我们还需要加入datetime,用于调用时间值。
   
【Mind+ Python】使用matplotlib实现温度可视化监测图8

         导入各个库之后,创建画布,并且修改画布样式,这里我们创建两个列表,对应折线图的x和y轴坐标值。
   
【Mind+ Python】使用matplotlib实现温度可视化监测图9

         想要实现动图效果,这里我们使用FuncAnimation方法,首先我们先来了解一下FuncAnimation()函数:
   
FuncAnimation(fig,func,frames,init_func,interval,blit)
  • fig:表示绘制动图的画布名称
  • func:表示自定义动画函数
  • frames:表示动画长度,一次循环包含的帧数,在函数运行时,其值会传递给动画函数
  • init_func:表示自定义开始帧,即动画函数的初始化函数
  • interval:表示更新频率,ms计
  • blit:表示选择更新所有点,还是仅更新产生变化的点。基本选择位True
   
      大概知道了这个函数的用法,前面我们已经定义了画图fig,并且给予了配置样式,同时创建了两个列表对应折线图的横纵轴坐标,那么我们还需要定义一个动画函数。

【Mind+ Python】使用matplotlib实现温度可视化监测图10
   
     在动画函数中,我们需要确定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()绘制画布。

完整代码如下:

   
  1. from matplotlib import pyplot as plt
  2. from matplotlib.animation import FuncAnimation
  3. import matplotlib.animation as animation
  4. import datetime as dt
  5. import time
  6. from pinpong.board import Board,Pin,ADC  #导入ADC类实现模拟输入
  7. Board("uno").begin()  #初始化,选择板型和端口号,不输入端口号则进行自动识别
  8. #Board("uno","COM36").begin()   #windows下指定端口初始化
  9. #Board("uno","/dev/ttyACM0").begin()   #linux下指定端口初始化
  10. #Board("uno","/dev/cu.usbmodem14101").begin()   #mac下指定端口初始化
  11. adc0 = ADC(Pin(Pin.A0)) #将Pin传入ADC中实现模拟输入
  12. plt.style.use('seaborn-pastel')#   修改图标样式,可以使用print(plt.style.available) 打印样式列表
  13. fig = plt.figure()  #创建图像fig
  14. ax = fig.add_subplot(1, 1, 1) #增加1x1子图
  15. #创建两个列表对应折线图的x、y轴数据
  16. xs = []
  17. ys = []
  18. #定义动画函数
  19. def animate(i, xs, ys):
  20.     temp_c = round(adc0.read()*(5/10.24), 2)#将A0模拟值转化为温度值并保留2位小数
  21.     # 将x、y轴坐标数据添加到xs、ys列表中
  22.     xs.append(dt.datetime.now().strftime('%H:%M:%S'))#x轴显示时间戳,时分秒
  23.     ys.append(temp_c)#y轴显示温度值
  24.     # 限定xs和ys列表数据范围
  25.     xs = xs[-20:]
  26.     ys = ys[-20:]
  27.     # 根据xs,ys绘制折线
  28.     ax.clear()
  29.     ax.plot(xs, ys)
  30.     # 图像格式
  31.     plt.xticks(rotation=45, ha='right')#坐标数值倾斜45°,数据沿x轴正无穷方向偏移
  32.     plt.subplots_adjust(bottom=0.30)#限制图标的区域边界
  33.     plt.title('temperature monitoring')#图标标题
  34.     plt.ylabel('temperature ')#y轴坐标
  35. #调用animation方法,对象:画布fig,动画函数:animate,函数调用数值:(xs, ys),数据更新频率interval=1000 ms
  36. ani = animation.FuncAnimation(fig, animate, fargs=(xs, ys), interval=1000)
  37. #画布显示
  38. plt.show()
复制代码

完成效果如下:(其中修改了图表样式,效果更好看)


【Mind+ Python】使用matplotlib实现温度可视化监测图1
























评分

参与人数 1贡献 +5 经验值 +5 创造力 +5 收起 理由
Storm + 5 + 5 + 5

查看全部评分

glwz007  初级技匠

发表于 2021-9-8 10:27:55

大神您好,非常感谢您的教程,有两个问题向您请教一下:
1.animate函数中第一个参数i是什么作用,貌似函数中没有用到。
2.我在项目中需要同时显示两个传感器的值,网上看到有关于matplotlib可以使用双y轴的用法,但是都是静态图,如何在动图中使用双坐标轴,请指导一下。
谢谢!
回复

使用道具 举报

Ski  初级技匠
 楼主|

发表于 2021-10-25 16:48:55

glwz007 发表于 2021-9-8 10:27
大神您好,非常感谢您的教程,有两个问题向您请教一下:
1.animate函数中第一个参数i是什么作用,貌似函数 ...

第1个问题:i是帧数,FuncAnimation调用函数时帧数自动增加。
第2个问题:如果是同一个坐标轴中新增一个y数据,在程序中再新加一个ys2数组,并且在下面animate函数中新增ys2数值,就是上面程序中在xs、ys的地方,新增ys2即可
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail