大数跨境
0
0

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

【Mind+ Python】使用matplotlib实现温度可视化监测 蘑菇云创造
2021-03-23
2
导读:DF创客社区精华项目

点击上方“蘑菇云创造”可以关注我们哦


Mind+ 1.70版本推出了期待已久的Python模式,不用再单独安装配置python环境,直接使用mind+软件就可以体验所有python功能。


而且python模式下,代码模式内提供库管理功能,一键加载常用库。  


Mind+ Python模式使用教程大家可以到官方教程中查看:

https://mindplus.dfrobot.com.cn/Python


已经看到有大佬在用mind+玩pinpong库了,用Mind+玩转PinPong库:https://mc.dfrobot.com.cn/thread-308207-1-1.html ,看了这个帖子,突发奇想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()

复制代码






成效果如下


其中修改了图表样式,效果更好看




本文来自:DF创客社区
作者:Ski
微信编辑:木子





蘑菇云创造

微信号 : mgystem

扫码关注,了解更多



推荐阅读:




点击“阅读原文”,了解更多!

【声明】内容源于网络
0
0
蘑菇云创造
蘑菇云是DFRobot旗下专注于AI人工智能、创客、STEAM、劳动教育的科技创新教育品牌;以为中国培养下一代科技创新人才为使命,为学校提供k12全龄段科技创新教育解决方案。
内容 969
粉丝 0
蘑菇云创造 蘑菇云是DFRobot旗下专注于AI人工智能、创客、STEAM、劳动教育的科技创新教育品牌;以为中国培养下一代科技创新人才为使命,为学校提供k12全龄段科技创新教育解决方案。
总阅读2.1k
粉丝0
内容969