温度采集数据可视化

这篇具有很好参考价值的文章主要介绍了温度采集数据可视化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

实现功能:

  • 实时显示近3分钟温度随时间的变化曲线
  • 实时显示当前温度、温度均值、温度波动
  • 根据温度数据实时调整纵坐标轴范围

使用的工具:

  • 硬件使用树莓派4B,烧录的是Raspberry Pi OS系统
  • 使用Qt Creator软件中UI Designer工具设计界面
  • 使用python语言编写逻辑,主要使用python中的pyqt5包以及其中的pyqtchart模块

程序原理:

  • 下位机每0.1秒采集1次温度并实时上传
  • 上位机创建0.1秒周期的定时器,定时检查收到的数据并处理,添加到显示序列后更新曲线
  • 同时进行3分钟温度均值与波动的计算并显示。

下载QT creator,使用里面的UI designer工具创建界面,如下图:
温度采集数据可视化
温度采集数据可视化
下位机数据格式,ADC值加回车换行
温度采集数据可视化
使用pyqt自带工具将.ui文件转换为.py文件,转化后的py文件如下:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'widget.ui'
#
# Created by: PyQt5 UI code generator 5.15.7
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_TemperatureDispaly(object):
    def setupUi(self, TemperatureDispaly):
        TemperatureDispaly.setObjectName("TemperatureDispaly")
        TemperatureDispaly.resize(1024, 600)
        self.gridLayout = QtWidgets.QGridLayout(TemperatureDispaly)
        self.gridLayout.setObjectName("gridLayout")
        self.verticalLayout_2 = QtWidgets.QVBoxLayout()
        self.verticalLayout_2.setObjectName("verticalLayout_2")
        self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
        self.pushButton = QtWidgets.QPushButton(TemperatureDispaly)
        font = QtGui.QFont()
        font.setPointSize(41)
        self.pushButton.setFont(font)
        self.pushButton.setObjectName("pushButton")
        self.horizontalLayout_3.addWidget(self.pushButton)
        self.TEMP = QtWidgets.QLineEdit(TemperatureDispaly)
        font = QtGui.QFont()
        font.setPointSize(44)
        font.setBold(False)
        self.TEMP.setFont(font)
        self.TEMP.setObjectName("TEMP")
        self.horizontalLayout_3.addWidget(self.TEMP)
        spacerItem = QtWidgets.QSpacerItem(200, 100, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_3.addItem(spacerItem)
        self.verticalLayout = QtWidgets.QVBoxLayout()
        self.verticalLayout.setObjectName("verticalLayout")
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.Average_label = QtWidgets.QLabel(TemperatureDispaly)
        font = QtGui.QFont()
        font.setPointSize(16)
        font.setBold(False)
        font.setKerning(True)
        self.Average_label.setFont(font)
        self.Average_label.setAutoFillBackground(False)
        self.Average_label.setObjectName("Average_label")
        self.horizontalLayout.addWidget(self.Average_label)
        self.Average_lineEdit = QtWidgets.QLineEdit(TemperatureDispaly)
        font = QtGui.QFont()
        font.setPointSize(17)
        self.Average_lineEdit.setFont(font)
        self.Average_lineEdit.setObjectName("Average_lineEdit")
        self.horizontalLayout.addWidget(self.Average_lineEdit)
        spacerItem1 = QtWidgets.QSpacerItem(150, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout.addItem(spacerItem1)
        self.verticalLayout.addLayout(self.horizontalLayout)
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.Fluctuate_label = QtWidgets.QLabel(TemperatureDispaly)
        font = QtGui.QFont()
        font.setPointSize(16)
        self.Fluctuate_label.setFont(font)
        self.Fluctuate_label.setObjectName("Fluctuate_label")
        self.horizontalLayout_2.addWidget(self.Fluctuate_label)
        self.Fluctuate_lineEdit = QtWidgets.QLineEdit(TemperatureDispaly)
        font = QtGui.QFont()
        font.setPointSize(17)
        self.Fluctuate_lineEdit.setFont(font)
        self.Fluctuate_lineEdit.setObjectName("Fluctuate_lineEdit")
        self.horizontalLayout_2.addWidget(self.Fluctuate_lineEdit)
        spacerItem2 = QtWidgets.QSpacerItem(150, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_2.addItem(spacerItem2)
        self.verticalLayout.addLayout(self.horizontalLayout_2)
        self.horizontalLayout_3.addLayout(self.verticalLayout)
        self.verticalLayout_2.addLayout(self.horizontalLayout_3)
        self.frame = QtWidgets.QFrame(TemperatureDispaly)
        self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame.setObjectName("frame")
        self.gridLayout_2 = QtWidgets.QGridLayout(self.frame)
        self.gridLayout_2.setObjectName("gridLayout_2")
        self.QgraphicsView = QChartView(self.frame)
        self.QgraphicsView.setObjectName("QgraphicsView")
        self.gridLayout_2.addWidget(self.QgraphicsView, 0, 0, 1, 1)
        self.verticalLayout_2.addWidget(self.frame)
        self.gridLayout.addLayout(self.verticalLayout_2, 0, 0, 1, 1)

        self.retranslateUi(TemperatureDispaly)
        self.pushButton.clicked.connect(TemperatureDispaly.close) # type: ignore
        QtCore.QMetaObject.connectSlotsByName(TemperatureDispaly)

    def retranslateUi(self, TemperatureDispaly):
        _translate = QtCore.QCoreApplication.translate
        TemperatureDispaly.setWindowTitle(_translate("TemperatureDispaly", "IKKEM-温度曲线"))
        self.pushButton.setText(_translate("TemperatureDispaly", "退出"))
        self.Average_label.setText(_translate("TemperatureDispaly", "3分钟温度均值"))
        self.Fluctuate_label.setText(_translate("TemperatureDispaly", "3分钟温度波动"))
from PyQt5.QtChart import QChartView

编写逻辑代码如下:

#温度可视化展示


import sys, math, random
import numpy as np
import serial
from PyQt5.QtWidgets import  QWidget, QApplication
from PyQt5.QtChart import QChart, QLineSeries, QValueAxis,QChartView
from PyQt5 import QtGui, QtWidgets
from ui_widget import Ui_TemperatureDispaly
from PyQt5.QtGui import QPainter,QPen
from PyQt5.QtCore import Qt
from PyQt5.QtCore import QTimer


class QmyWidget(QWidget):
    def __init__(self, parent=None):
      super().__init__(parent)   #调用父类构造函数,创建QWidget窗口

      self.ui = Ui_TemperatureDispaly()  # 创建UI对象
      self.ui.setupUi(self)  # 构造UI界面

      self.timer = QTimer()  # 初始化定时器
      self.timer.timeout.connect(self.my_timer_cb)#将定时器连接到回调函数

      self.chart = None  # 图表
      self.axisY = QValueAxis()
      self.counter=0
      self.createChart()#调用创建图标方法
      self.timer.start(100)#定时器开始,400ms回调一次
      self.ser = serial.Serial("/dev/ttyAMA0", 9600)  # 打开串口,波特率9600

    def createChart(self):
       self.chart = QChart()
       self.chart.legend().hide()
       self.ui.QgraphicsView.setChart(self.chart)
       self.ui.QgraphicsView.setRenderHint(QPainter.Antialiasing)
       self.ui.QgraphicsView.setRubberBand(QChartView.RectangleRubberBand)

       font1 = QtGui.QFont()  # 创建字体对象font,用QFont类
       font1.setPointSize(50)  # 设置字体大小
       font1.setBold(True)  # 设置为粗体
       self.ui.TEMP.setFont(font1)
       self.ui.TEMP.setStyleSheet("color:blue")

       self.ui.TEMP.setAlignment(Qt.AlignCenter)
       self.ui.Average_lineEdit.setAlignment(Qt.AlignCenter)
       self.ui.Fluctuate_lineEdit.setAlignment(Qt.AlignCenter)#居中对其

       op = QtWidgets.QGraphicsOpacityEffect()
       # 设置透明度的值,0.0到1.0,最小值0是透明,1是不透明
       op.setOpacity(0)
       self.ui.pushButton.setGraphicsEffect(op)#设置退出按钮透明

       series = QLineSeries()
       series.setUseOpenGL(True)
       self.chart.addSeries(series)
       pen = QPen(Qt.red)
       pen.setStyle(Qt.SolidLine)  # SolidLine, DashLine, DotLine, DashDotLine
       pen.setWidth(2)
       series.setPen(pen)  # 序列的线条设置

       font2 = QtGui.QFont()  # 创建字体对象font,用QFont类
       font2.setPointSize(11)  # 设置字体大小
       font2.setBold(True)  # 设置为粗体

       axisX = QValueAxis()
       axisX.setRange(0, 3)
       axisX.setLabelFormat("%.1f")  # 标签格式
       axisX.setLabelsFont(font2)
       axisX.setTickCount(7)  # 主分隔个数
       axisX.setMinorTickCount(1)
       axisX.setGridLineVisible(True)
       axisX.setMinorGridLineVisible(True)


       self.axisY.setLabelFormat("%.3f")  # 标签格式
       self.axisY.setLabelsFont(font2)
       self.axisY.setTickCount(8)
       self.axisY.setGridLineVisible(True)
       self.axisY.setMinorGridLineVisible(False)

       self.chart.addAxis(axisX, Qt.AlignBottom)  # 坐标轴添加到图表,并指定方向
       self.chart.addAxis(self.axisY, Qt.AlignLeft)

       series.attachAxis(axisX)  # 序列 series坐标轴
       series.attachAxis(self.axisY)

    def my_timer_cb(self, temp_average=None):
      chart = self.ui.QgraphicsView.chart()  # 获取chartView中的QChart对象
      series = chart.series()[0]  # 获取第1个序列,QLineSeries
      received_data = self.ser.read()  # 读取串口端口
      data_left = self.ser.inWaiting()  # 检查串口数据
      received_data += self.ser.read(data_left)#将串口数据添加到变量里
      if len(received_data)>9:#这里处理两个数据连接在一起的情况
          re_data = int(received_data[-9:-1:1])
      else:
          re_data = int(received_data)
      #标定后修改下一句代码
      re_data = round((re_data * 4000 / 8388607-1000)/3.85, 4)#将AD值处理成温度
      self.ui.TEMP.setText('%.4f' % re_data+"℃") #改变当前温度窗口数据

      if self.counter < 3:
          series.append(self.counter, re_data)
          self.counter+=3/1800
      else:
          points = series.pointsVector()
          for i in range(1800):
              points[i].setY(points[i + 1].y())
          points[-1].setY(re_data)
          series.replace(points)

      num=[]
      p = series.pointsVector()
      y_min = min(p, key=lambda point: point.y()).y()
      y_max = max(p, key=lambda point: point.y()).y()
      for i in range(len(p)):
          num.append(p[i].y())
      temp_average = np.average(num)

      self.ui.Average_lineEdit.setText('%.4f' % temp_average)
      self.ui.Fluctuate_lineEdit.setText('%.4f' % (y_max-y_min))
      self.axisY.setRange(y_min, y_max)

if  __name__ == "__main__":        #用于当前窗体测试

    app = QApplication(sys.argv)    #创建GUI应用程序
    form=QmyWidget()            #创建窗体
    form.showFullScreen()       #全屏展示
    form.show()
    sys.exit(app.exec_())

实现功能:
温度采集数据可视化

温度采集数据可视化文章来源地址https://www.toymoban.com/news/detail-466985.html

到了这里,关于温度采集数据可视化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用JavaScript实现复杂功能:动态数据可视化的构建

    在前端开发中,JavaScript无疑是最核心的技术之一。它能够处理各种交互逻辑,实现复杂的功能。本文将通过一个动态数据可视化的案例,展示如何使用JavaScript实现复杂功能。动态数据可视化能够将大量数据以直观、生动的方式呈现,帮助用户更好地理解和分析数据。 准备工

    2024年02月20日
    浏览(61)
  • 大数据毕业设计:基于python商品数据采集分析可视化系统 淘宝数据采集 大数据 大屏可视化(附源码+论文)✅

    博主介绍:✌全网粉丝10W+,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久,选择我们就是选择放心、选择安心毕业✌感兴趣的可以先收藏起来,点赞、关注不迷路✌ 毕业设计:2023-2024年计算机专业毕业设计选题汇总(建议

    2024年02月03日
    浏览(54)
  • 基于python商品数据采集分析可视化系统 淘宝数据采集 大数据 大屏可视化(附源码+论文)大数据毕业设计✅

    毕业设计:2023-2024年计算机专业毕业设计选题汇总(建议收藏) 毕业设计:2023-2024年最新最全计算机专业毕设选题推荐汇总 🍅 感兴趣的可以先收藏起来,点赞、关注不迷路,大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助同学们顺利毕业 。

    2024年02月02日
    浏览(58)
  • 前端开发攻略---根据音频节奏实时绘制不断变化的波形图。深入剖析如何通过代码实现音频数据的可视化。

    逐行解析 JavaScript 代码块: 这几行代码首先获取了  audio  和  canvas  元素的引用,并使用  getContext(\\\'2d\\\')  方法获取了 Canvas 2D 上下文对象,以便后续在画布上进行绘图操作。 initCvs  函数用于初始化画布的尺寸。它将画布的宽度设置为窗口宽度的倍数,高度设置为窗口高度

    2024年04月15日
    浏览(59)
  • Flink日志采集-ELK可视化实现

    组件 版本 Flink 1.16.1 kafka 2.0.0 Logstash 6.5.4 Elasticseach 6.3.1 Kibana 6.3.1   针对按照⽇志⽂件⼤⼩滚动⽣成⽂件的⽅式,可能因为某个错误的问题,需要看好多个⽇志⽂件,还有Flink on Yarn模式提交Flink任务,在任务执行完毕或者任务报错后container会被回收从而导致日志丢失,为了

    2024年02月05日
    浏览(37)
  • springboot集成elk实现日志采集可视化

    一、安装ELK 安装ELK组件请参考我这篇博客:windows下安装ELK(踩坑记录)_windows上安装elk教程-CSDN博客 这里不再重复赘述。  二、编写logstash配置 ELK组件均安装好并成功启动,进入到logstash组件下的config文件夹,创建logstash.conf配置文件 logstash.conf的配置如下 input{    tcp{        

    2024年02月20日
    浏览(39)
  • Python采集天气数据,做可视化分析【附源码】

    动态数据抓包 requests发送请求 结构化+非结构化数据解析 python 3.8 运行代码 pycharm 2021.2 辅助敲代码 requests 如果安装python第三方模块: win + R 输入 cmd 点击确定, 输入安装命令 pip install 模块名 (pip install requests)回车 在pycharm中点击Terminal(终端) 输入安装命令 发送请求 获取数据 解析

    2024年02月09日
    浏览(40)
  • Python 数据采集、清洗、整理、分析以及可视化实战

    大概可以分为下面这几个步骤: 数据采集; 原始数据完整性检查; 数据清洗、整理; 从不同角度对数据进行分析; 数据可视化; 总结; 主要使用 Python 来进行分析: 数据采集: 主要涉及的 python 库包括 requests,BeautifulSoup,csv,以及一些其他常用工具。 数据完整性检查: 包

    2024年02月09日
    浏览(56)
  • Python爬虫:批量采集58同城数据,进行可视化分析!

    哈喽大家好,今天我们来获取一下某个生活平台网站数据,进行可视化分析。 采集58的数据可以使用Python的requests库和beautifulsoup库,数据可视化分析可以使用matplotlib库和seaborn库。下面是一个简单的例子: 1、首先导入需要使用的模块   2、设置请求头,模拟浏览器请求。  

    2024年02月06日
    浏览(51)
  • 用Python采集电商平台商品数据进行可视化分析

    前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 环境使用: python 3.8 解释器 pycharm 编辑器 模块使用: 第三方模块 需要安装 requests — 发送 HTTP请求 内置模块 不需要安装 csv — 数据处理中经常会用到的一种文件格式 第三方模块安装: win + R 输入cmd 输入安装命令 pip install 模块名 (如果你

    2024年02月17日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包