同步发布到个人公众号:电子技术攻城狮-树莓派ADC 本文介绍在树莓派上使用python和qt开发一个显示ADC数据的GUI程序。开发环境使用PyCharm进行python代码远程开发,然后使用QtCreator编写QML界面。

1、新建项目

1.1、新建工程

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

1.2、添加python主程序

adcMeasure.py 主程序如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
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文件;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
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、上传程序到树莓派

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

2.2、ADC硬件

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

2.3、执行程序

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

1
python3 adcMeasure.py

执行后可以看到显示如下: 当调节电阻时候,可以看到其变化曲线:

完整代码: github

  • 视频效果: