树莓派GUI-ADC测量-PySide/PyQT/QML/Python/Qt

本文介绍在树莓派上使用python和qt开发一个显示ADC数据的GUI程序。开发环境使用PyCharm进行python代码远程开发,然后使用QtCreator编写QML界面。

1、新建项目

1.1、新建工程

打开PyCharm,新建工程adcMeasure,如下:

[图片上传失败...(image-d6ce48-1630970377090)]

1.2、添加python主程序

adcMeasure.py 主程序如下:

import os
import sys
from pathlib import Path

from PySide2.QtCore import Qt, QObject, Slot
from PySide2.QtQml import QQmlApplicationEngine
from PySide2.QtWidgets import QApplication

from adc_mcp3424 import MCP3424


class Controler(QObject):
    def __init__(self):
        super().__init__()

        self.MCP3424 = MCP3424(6, address=0x68, rate=18)

    @Slot()
    def exit(self):
        sys.exit()

    @Slot(result=float)
    def get_adc1(self):
        adc1 = self.MCP3424.read_raw(1)
        adc1 = adc1/100.00
        # print("adc1:",adc1)
        return adc1
    
......


if __name__=='__main__':
    a = QApplication(sys.argv)
    a.setOverrideCursor(Qt.BlankCursor)

    engine = QQmlApplicationEngine()

    controler = Controler()
    context = engine.rootContext()
    context.setContextProperty("_Controler", controler)

    engine.load(os.fspath(Path(__file__).resolve().parent / "ui/adcMeasure.qml"))

    if not engine.rootObjects():
        sys.exit(-1)

    sys.exit(a.exec_())
  • 程序中新建一个Controler类,用于获取ADC数值,并将ADC值传递到GUI界面进行显示。
1.3、添加界面文件
  • 在项目中添加ui文件夹,并新建main.qml文件;
import QtQuick 2.11
import QtQuick.Window 2.4
import QtQuick.Controls 2.4
import QtQuick.Controls.Styles 1.4
import QtQuick.Extras 1.4
import QtGraphicalEffects 1.0
import QtCharts 2.2

ApplicationWindow{
    id:root
    width: 800
    height: 480
    visible: true
//    visibility: Window.FullScreen

    background: Rectangle{
        anchors.fill: parent
        color: "#101010"
    }

    Button{
        id:btnexit
        background: Rectangle{
            color: "#a01010"
            anchors.fill: parent
            radius:12
        }
        width: 48
        height: 48
        anchors{
            top: parent.top
            right: parent.right
            topMargin: 8
            rightMargin: 8
        }
        Text {
            text: qsTr("X")
            anchors.centerIn: parent
            font{
                pointSize: 32
            }
            color: "white"
        }
        onClicked: {
            _Controler.exit();
        }
    }

    Text {
        id: title
        text: qsTr("ADC Measure")
        anchors{
            top:  parent.top
            horizontalCenter: parent.horizontalCenter
            topMargin: 20
        }
        font{
            pointSize: 24
        }
        color: "#a0a0a0"
    }

    ChartView{
        id:cv
        width:600
        height:400

        anchors{
            top:title.bottom
            topMargin:10
            left:parent.left
            leftMargin:40
        }
        antialiasing: true
        theme: ChartView.ChartThemeDark

        property int  timcnt: 0
        property double  valueCH1: 0
        property double  valueCH2: 0
        property double  valueCH3: 0
        property double  valueCH4: 0

        ValueAxis{
            id:xAxis
            min: cv.timcnt < 10 ? 0 : cv.timcnt - 10
            max: cv.timcnt < 10 ? 10 : cv.timcnt + 1
            tickCount: 11
            labelFormat: "%d"
        }

        ValueAxis{
            id:yAxis
            min: 0
            max: 500
            tickCount: 1
            labelFormat: "%d"
        }

        LineSeries {
            name: "CH1"
            id:lines1
            axisX: xAxis
            axisY: yAxis
            width: 3
            color: "#1267D4"
        }

        LineSeries {
            name: "CH2"
            id:lines2
            axisX: xAxis
            axisY: yAxis
            width: 3
            color: "#8D7A1F"
        }

        LineSeries {
            name: "CH3"
            id:lines3
            axisX: xAxis
            axisY: yAxis
            width: 3
            color: "#8A1E1D"
        }

        LineSeries {
            name: "CH4"
            id:lines4
            axisX: xAxis
            axisY: yAxis
            width: 3
            color: "#C21FE4"
        }

        Timer{
            id:tm
            interval: 1000
            repeat: true
            running: true
            onTriggered: {
                cv.timcnt = cv.timcnt + 1
                cv.valueCH1 = _Controler.get_adc1()
                cv.valueCH2 = _Controler.get_adc2()
                cv.valueCH3 = _Controler.get_adc3()
                cv.valueCH4 = _Controler.get_adc4()

                lines1.append(cv.timcnt,cv.valueCH1)
                lines2.append(cv.timcnt,cv.valueCH2)
                lines3.append(cv.timcnt,cv.valueCH3)
                lines4.append(cv.timcnt,cv.valueCH4)

                console.log("--------------------")
                console.log("qml adc value1:",cv.valueCH1)
                console.log("qml adc value2:",cv.valueCH2)
                console.log("qml adc value3:",cv.valueCH3)
                console.log("qml adc value4:",cv.valueCH4)

            }
        }
    }
}

  • 使用 ChartView 模块进行ADC数值显示,建立一个 Timer 定时器,每秒获取一次ADC值,然后添加到曲线中进行显示。

2、执行程序

2.1、上传程序到树莓派

在工程上右键将这个项目文件上传到树莓派中:

image-20210905204036939.png
2.2、ADC硬件

树莓派连接一个I2C接口的ADC模块,这里使用的是MCP3424,它拥有四通道最大18位的精度。将四个可调变阻器连接到ADC四个通道上,这样通过调节电阻来测试变化的模拟值。

2.3、执行程序

上传后,在树莓派对应文件夹中,执行如下命令执行程序:

python3 adcMeasure.py

执行后可以看到显示如下:

image-20210905204223070.png

当调节电阻时候,可以看到其变化曲线:

[图片上传失败...(image-3c0855-1630970377090)]

完整代码:

github

  • 视频效果:

<iframe src="//player.bilibili.com/player.html?aid=932817084&bvid=BV1jM4y1G7dy&cid=404046944&page=1" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true" style="width: 100%; height: 500px; max-width: 100%;align:center; padding:20px 0;" > </iframe>

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,367评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,959评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,750评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,226评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,252评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,975评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,592评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,497评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,027评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,147评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,274评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,953评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,623评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,143评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,260评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,607评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,271评论 2 358

推荐阅读更多精彩内容