PyQt Lab’ : Port Série : en réception : Réception de 6 valeurs numériques sur le port série, dans 6 QwtThermo, le widget d’affichage analogique « vu-mètre », conversion mesure/unité et affichage dans 12 widgets LCD.
Par X. HINAULT – Juin 2013

Ce que l’on va faire ici
- Dans ce code PyQt, une interface permettant la réception de 6 valeurs numériques sur le port série, dans 6 QwtThermo, le widget d’affichage analogique « vu-mètre », conversion mesure/unité et affichage dans 12 widgets LCD.
Pré-requis
- python 2.7
- pyqt4.x
- modules :
- python-serial
- python-qwt5-qt4
Téléchargement :
- L’archive des codes est disponible ici :
Le fichier d’interface *.py
- Fichier obtenu automatiquement avec l’utilitaire pyuic4 à partir du fichier *.ui créé avec QtDesigner :
# Form implementation generated from reading ui file
#
# Created: Sun Feb 3 13:59:39 2013
# by: PyQt4 UI code generator 4.9.1
#
# WARNING! All changes made in this file will be lost!
from PyQt4 import QtCore, QtGui
from PyQt4.Qwt5 import * # module Qwt
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
_fromUtf8 = lambda s: s
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName(_fromUtf8(« Form »))
Form.resize(883, 655)
self.labelDebit = QtGui.QLabel(Form)
self.labelDebit.setGeometry(QtCore.QRect(10, 45, 111, 16))
self.labelDebit.setObjectName(_fromUtf8(« labelDebit »))
self.comboBoxPort = QtGui.QComboBox(Form)
self.comboBoxPort.setGeometry(QtCore.QRect(5, 20, 151, 24))
self.comboBoxPort.setEditable(True)
self.comboBoxPort.setObjectName(_fromUtf8(« comboBoxPort »))
self.comboBoxPort.addItem(_fromUtf8(« »))
self.comboBoxPort.addItem(_fromUtf8(« »))
self.comboBoxPort.addItem(_fromUtf8(« »))
self.comboBoxPort.addItem(_fromUtf8(« »))
self.labelReception = QtGui.QLabel(Form)
self.labelReception.setGeometry(QtCore.QRect(5, 235, 156, 16))
self.labelReception.setObjectName(_fromUtf8(« labelReception »))
self.textEditReception = QtGui.QTextEdit(Form)
self.textEditReception.setGeometry(QtCore.QRect(5, 255, 156, 86))
self.textEditReception.setLineWrapMode(QtGui.QTextEdit.NoWrap)
self.textEditReception.setObjectName(_fromUtf8(« textEditReception »))
self.pushButtonInitSerial = QtGui.QPushButton(Form)
self.pushButtonInitSerial.setGeometry(QtCore.QRect(5, 95, 101, 31))
self.pushButtonInitSerial.setObjectName(_fromUtf8(« pushButtonInitSerial »))
self.comboBoxDebit = QtGui.QComboBox(Form)
self.comboBoxDebit.setGeometry(QtCore.QRect(5, 60, 111, 24))
self.comboBoxDebit.setObjectName(_fromUtf8(« comboBoxDebit »))
self.comboBoxDebit.addItem(_fromUtf8(« »))
self.comboBoxDebit.addItem(_fromUtf8(« »))
self.comboBoxDebit.addItem(_fromUtf8(« »))
self.comboBoxDebit.addItem(_fromUtf8(« »))
self.comboBoxDebit.addItem(_fromUtf8(« »))
self.comboBoxDebit.addItem(_fromUtf8(« »))
self.comboBoxDebit.addItem(_fromUtf8(« »))
self.comboBoxDebit.addItem(_fromUtf8(« »))
self.labelPort = QtGui.QLabel(Form)
self.labelPort.setGeometry(QtCore.QRect(10, 5, 101, 16))
self.labelPort.setObjectName(_fromUtf8(« labelPort »))
self.line = QtGui.QFrame(Form)
self.line.setGeometry(QtCore.QRect(160, 5, 16, 646))
self.line.setFrameShape(QtGui.QFrame.VLine)
self.line.setFrameShadow(QtGui.QFrame.Sunken)
self.line.setObjectName(_fromUtf8(« line »))
self.pushButtonStop = QtGui.QPushButton(Form)
self.pushButtonStop.setGeometry(QtCore.QRect(115, 85, 41, 41))
self.pushButtonStop.setObjectName(_fromUtf8(« pushButtonStop »))
self.line_5 = QtGui.QFrame(Form)
self.line_5.setGeometry(QtCore.QRect(5, 380, 156, 16))
self.line_5.setFrameShape(QtGui.QFrame.HLine)
self.line_5.setFrameShadow(QtGui.QFrame.Sunken)
self.line_5.setObjectName(_fromUtf8(« line_5 »))
self.textEditTraceEnvoiSerie = QtGui.QTextEdit(Form)
self.textEditTraceEnvoiSerie.setGeometry(QtCore.QRect(5, 580, 156, 71))
self.textEditTraceEnvoiSerie.setStyleSheet(_fromUtf8(« color: rgb(0, 0, 255);\n«
« background-color: rgb(170, 255, 255); »))
self.textEditTraceEnvoiSerie.setLineWrapMode(QtGui.QTextEdit.NoWrap)
self.textEditTraceEnvoiSerie.setObjectName(_fromUtf8(« textEditTraceEnvoiSerie »))
self.labelTraceEnvoiSerie = QtGui.QLabel(Form)
self.labelTraceEnvoiSerie.setGeometry(QtCore.QRect(5, 565, 156, 16))
self.labelTraceEnvoiSerie.setObjectName(_fromUtf8(« labelTraceEnvoiSerie »))
self.labelRacineChaine = QtGui.QLabel(Form)
self.labelRacineChaine.setGeometry(QtCore.QRect(5, 345, 141, 16))
self.labelRacineChaine.setObjectName(_fromUtf8(« labelRacineChaine »))
self.labelTraceAnalyseChaine = QtGui.QLabel(Form)
self.labelTraceAnalyseChaine.setGeometry(QtCore.QRect(5, 395, 166, 16))
self.labelTraceAnalyseChaine.setObjectName(_fromUtf8(« labelTraceAnalyseChaine »))
self.lineEditRacineChaine = QtGui.QLineEdit(Form)
self.lineEditRacineChaine.setGeometry(QtCore.QRect(5, 360, 136, 23))
self.lineEditRacineChaine.setObjectName(_fromUtf8(« lineEditRacineChaine »))
self.line_4 = QtGui.QFrame(Form)
self.line_4.setGeometry(QtCore.QRect(5, 555, 156, 16))
self.line_4.setFrameShape(QtGui.QFrame.HLine)
self.line_4.setFrameShadow(QtGui.QFrame.Sunken)
self.line_4.setObjectName(_fromUtf8(« line_4 »))
self.textEditTraceAnalyseChaine = QtGui.QTextEdit(Form)
self.textEditTraceAnalyseChaine.setGeometry(QtCore.QRect(5, 410, 156, 151))
self.textEditTraceAnalyseChaine.setStyleSheet(_fromUtf8(« color: rgb(0, 170, 0);\n«
« background-color: rgb(188, 255, 193);\n«
« »))
self.textEditTraceAnalyseChaine.setLineWrapMode(QtGui.QTextEdit.NoWrap)
self.textEditTraceAnalyseChaine.setObjectName(_fromUtf8(« textEditTraceAnalyseChaine »))
self.labelFinLigne = QtGui.QLabel(Form)
self.labelFinLigne.setGeometry(QtCore.QRect(0, 180, 71, 16))
self.labelFinLigne.setObjectName(_fromUtf8(« labelFinLigne »))
self.labelChaineEnvoi = QtGui.QLabel(Form)
self.labelChaineEnvoi.setGeometry(QtCore.QRect(0, 140, 121, 16))
self.labelChaineEnvoi.setObjectName(_fromUtf8(« labelChaineEnvoi »))
self.pushButtonEnvoi = QtGui.QPushButton(Form)
self.pushButtonEnvoi.setGeometry(QtCore.QRect(125, 180, 41, 41))
self.pushButtonEnvoi.setObjectName(_fromUtf8(« pushButtonEnvoi »))
self.line_2 = QtGui.QFrame(Form)
self.line_2.setGeometry(QtCore.QRect(0, 125, 166, 16))
self.line_2.setFrameShape(QtGui.QFrame.HLine)
self.line_2.setFrameShadow(QtGui.QFrame.Sunken)
self.line_2.setObjectName(_fromUtf8(« line_2 »))
self.lineEditChaineEnvoi = QtGui.QLineEdit(Form)
self.lineEditChaineEnvoi.setGeometry(QtCore.QRect(0, 155, 166, 23))
self.lineEditChaineEnvoi.setObjectName(_fromUtf8(« lineEditChaineEnvoi »))
self.comboBoxFinLigne = QtGui.QComboBox(Form)
self.comboBoxFinLigne.setGeometry(QtCore.QRect(0, 195, 121, 24))
self.comboBoxFinLigne.setObjectName(_fromUtf8(« comboBoxFinLigne »))
self.comboBoxFinLigne.addItem(_fromUtf8(« »))
self.comboBoxFinLigne.addItem(_fromUtf8(« »))
self.comboBoxFinLigne.addItem(_fromUtf8(« »))
self.comboBoxFinLigne.addItem(_fromUtf8(« »))
self.line_3 = QtGui.QFrame(Form)
self.line_3.setGeometry(QtCore.QRect(0, 220, 166, 16))
self.line_3.setFrameShape(QtGui.QFrame.HLine)
self.line_3.setFrameShadow(QtGui.QFrame.Sunken)
self.line_3.setObjectName(_fromUtf8(« line_3 »))
self.qwtThermo_A0 = QwtThermo(Form)
self.qwtThermo_A0.setGeometry(QtCore.QRect(175, 50, 103, 244))
self.qwtThermo_A0.setAutoFillBackground(True)
self.qwtThermo_A0.setAlarmEnabled(True)
self.qwtThermo_A0.setAlarmLevel(512.0)
self.qwtThermo_A0.setMaxValue(1023.0)
self.qwtThermo_A0.setPipeWidth(50)
self.qwtThermo_A0.setProperty(« value », 0.0)
self.qwtThermo_A0.setObjectName(_fromUtf8(« qwtThermo_A0 »))
self.labelVoie_A1 = QtGui.QLabel(Form)
self.labelVoie_A1.setGeometry(QtCore.QRect(525, 150, 121, 16))
self.labelVoie_A1.setObjectName(_fromUtf8(« labelVoie_A1 »))
self.labelUnite_A2 = QtGui.QLabel(Form)
self.labelUnite_A2.setGeometry(QtCore.QRect(830, 215, 51, 13))
self.labelUnite_A2.setObjectName(_fromUtf8(« labelUnite_A2 »))
self.lineEditUnite_A0 = QtGui.QLineEdit(Form)
self.lineEditUnite_A0.setGeometry(QtCore.QRect(830, 120, 41, 23))
self.lineEditUnite_A0.setObjectName(_fromUtf8(« lineEditUnite_A0 »))
self.lcdNumber_A1 = QtGui.QLCDNumber(Form)
self.lcdNumber_A1.setGeometry(QtCore.QRect(525, 165, 106, 40))
self.lcdNumber_A1.setStyleSheet(_fromUtf8(« background-color: rgb(170, 255, 127);\n«
« color: rgb(85, 170, 0); »))
self.lcdNumber_A1.setFrameShape(QtGui.QFrame.Box)
self.lcdNumber_A1.setFrameShadow(QtGui.QFrame.Sunken)
self.lcdNumber_A1.setSegmentStyle(QtGui.QLCDNumber.Filled)
self.lcdNumber_A1.setObjectName(_fromUtf8(« lcdNumber_A1 »))
self.lcdNumberValeurCalc_A1 = QtGui.QLCDNumber(Form)
self.lcdNumberValeurCalc_A1.setGeometry(QtCore.QRect(705, 155, 121, 51))
self.lcdNumberValeurCalc_A1.setStyleSheet(_fromUtf8(« background-color: rgb(255, 255, 0);\n«
« color: rgb(255, 0, 0); »))
self.lcdNumberValeurCalc_A1.setSmallDecimalPoint(True)
self.lcdNumberValeurCalc_A1.setMode(QtGui.QLCDNumber.Dec)
self.lcdNumberValeurCalc_A1.setObjectName(_fromUtf8(« lcdNumberValeurCalc_A1 »))
self.lcdNumber_A0 = QtGui.QLCDNumber(Form)
self.lcdNumber_A0.setGeometry(QtCore.QRect(525, 110, 106, 40))
self.lcdNumber_A0.setStyleSheet(_fromUtf8(« background-color: rgb(170, 255, 127);\n«
« color: rgb(85, 170, 0); »))
self.lcdNumber_A0.setFrameShape(QtGui.QFrame.Box)
self.lcdNumber_A0.setFrameShadow(QtGui.QFrame.Sunken)
self.lcdNumber_A0.setSegmentStyle(QtGui.QLCDNumber.Filled)
self.lcdNumber_A0.setObjectName(_fromUtf8(« lcdNumber_A0 »))
self.labelValeurMaxMin_A2 = QtGui.QLabel(Form)
self.labelValeurMaxMin_A2.setGeometry(QtCore.QRect(635, 210, 71, 16))
self.labelValeurMaxMin_A2.setStyleSheet(_fromUtf8(« font: 6pt \ »DejaVu Sans\ »; »))
self.labelValeurMaxMin_A2.setObjectName(_fromUtf8(« labelValeurMaxMin_A2 »))
self.labelUnite_A1 = QtGui.QLabel(Form)
self.labelUnite_A1.setGeometry(QtCore.QRect(830, 160, 51, 13))
self.labelUnite_A1.setObjectName(_fromUtf8(« labelUnite_A1 »))
self.labelVoie_A0 = QtGui.QLabel(Form)
self.labelVoie_A0.setGeometry(QtCore.QRect(525, 95, 121, 16))
self.labelVoie_A0.setObjectName(_fromUtf8(« labelVoie_A0 »))
self.lineEditValeurMin_A2 = QtGui.QLineEdit(Form)
self.lineEditValeurMin_A2.setGeometry(QtCore.QRect(635, 245, 66, 16))
self.lineEditValeurMin_A2.setObjectName(_fromUtf8(« lineEditValeurMin_A2 »))
self.lcdNumberValeurCalc_A2 = QtGui.QLCDNumber(Form)
self.lcdNumberValeurCalc_A2.setGeometry(QtCore.QRect(705, 210, 121, 51))
self.lcdNumberValeurCalc_A2.setStyleSheet(_fromUtf8(« background-color: rgb(255, 255, 0);\n«
« color: rgb(255, 0, 0); »))
self.lcdNumberValeurCalc_A2.setSmallDecimalPoint(True)
self.lcdNumberValeurCalc_A2.setMode(QtGui.QLCDNumber.Dec)
self.lcdNumberValeurCalc_A2.setObjectName(_fromUtf8(« lcdNumberValeurCalc_A2 »))
self.lineEditValeurMax_A0 = QtGui.QLineEdit(Form)
self.lineEditValeurMax_A0.setGeometry(QtCore.QRect(635, 115, 66, 16))
self.lineEditValeurMax_A0.setObjectName(_fromUtf8(« lineEditValeurMax_A0 »))
self.lineEditValeurMin_A1 = QtGui.QLineEdit(Form)
self.lineEditValeurMin_A1.setGeometry(QtCore.QRect(635, 190, 66, 16))
self.lineEditValeurMin_A1.setObjectName(_fromUtf8(« lineEditValeurMin_A1 »))
self.labelVoie_A2 = QtGui.QLabel(Form)
self.labelVoie_A2.setGeometry(QtCore.QRect(525, 205, 121, 16))
self.labelVoie_A2.setObjectName(_fromUtf8(« labelVoie_A2 »))
self.lineEditUnite_A2 = QtGui.QLineEdit(Form)
self.lineEditUnite_A2.setGeometry(QtCore.QRect(830, 230, 41, 23))
self.lineEditUnite_A2.setObjectName(_fromUtf8(« lineEditUnite_A2 »))
self.lcdNumber_A2 = QtGui.QLCDNumber(Form)
self.lcdNumber_A2.setGeometry(QtCore.QRect(525, 220, 106, 40))
self.lcdNumber_A2.setStyleSheet(_fromUtf8(« background-color: rgb(170, 255, 127);\n«
« color: rgb(85, 170, 0); »))
self.lcdNumber_A2.setFrameShape(QtGui.QFrame.Box)
self.lcdNumber_A2.setFrameShadow(QtGui.QFrame.Sunken)
self.lcdNumber_A2.setSegmentStyle(QtGui.QLCDNumber.Filled)
self.lcdNumber_A2.setObjectName(_fromUtf8(« lcdNumber_A2 »))
self.lineEditValeurMin_A0 = QtGui.QLineEdit(Form)
self.lineEditValeurMin_A0.setGeometry(QtCore.QRect(635, 135, 66, 16))
self.lineEditValeurMin_A0.setObjectName(_fromUtf8(« lineEditValeurMin_A0 »))
self.lcdNumberValeurCalc_A0 = QtGui.QLCDNumber(Form)
self.lcdNumberValeurCalc_A0.setGeometry(QtCore.QRect(705, 100, 121, 51))
self.lcdNumberValeurCalc_A0.setStyleSheet(_fromUtf8(« background-color: rgb(255, 255, 0);\n«
« color: rgb(255, 0, 0); »))
self.lcdNumberValeurCalc_A0.setSmallDecimalPoint(True)
self.lcdNumberValeurCalc_A0.setMode(QtGui.QLCDNumber.Dec)
self.lcdNumberValeurCalc_A0.setObjectName(_fromUtf8(« lcdNumberValeurCalc_A0 »))
self.lineEditValeurMax_A1 = QtGui.QLineEdit(Form)
self.lineEditValeurMax_A1.setGeometry(QtCore.QRect(635, 170, 66, 16))
self.lineEditValeurMax_A1.setObjectName(_fromUtf8(« lineEditValeurMax_A1 »))
self.lineEditUnite_A1 = QtGui.QLineEdit(Form)
self.lineEditUnite_A1.setGeometry(QtCore.QRect(830, 175, 41, 23))
self.lineEditUnite_A1.setObjectName(_fromUtf8(« lineEditUnite_A1 »))
self.lineEditValeurMax_A2 = QtGui.QLineEdit(Form)
self.lineEditValeurMax_A2.setGeometry(QtCore.QRect(635, 225, 66, 16))
self.lineEditValeurMax_A2.setObjectName(_fromUtf8(« lineEditValeurMax_A2 »))
self.labelValeurMaxMin_A0 = QtGui.QLabel(Form)
self.labelValeurMaxMin_A0.setGeometry(QtCore.QRect(635, 100, 71, 16))
self.labelValeurMaxMin_A0.setStyleSheet(_fromUtf8(« font: 6pt \ »DejaVu Sans\ »; »))
self.labelValeurMaxMin_A0.setObjectName(_fromUtf8(« labelValeurMaxMin_A0 »))
self.labelValeurMaxMin_A1 = QtGui.QLabel(Form)
self.labelValeurMaxMin_A1.setGeometry(QtCore.QRect(635, 155, 71, 16))
self.labelValeurMaxMin_A1.setStyleSheet(_fromUtf8(« font: 6pt \ »DejaVu Sans\ »; »))
self.labelValeurMaxMin_A1.setObjectName(_fromUtf8(« labelValeurMaxMin_A1 »))
self.labelUnite_A0 = QtGui.QLabel(Form)
self.labelUnite_A0.setGeometry(QtCore.QRect(830, 105, 51, 13))
self.labelUnite_A0.setObjectName(_fromUtf8(« labelUnite_A0 »))
self.qwtThermo_A1 = QwtThermo(Form)
self.qwtThermo_A1.setGeometry(QtCore.QRect(290, 50, 103, 244))
self.qwtThermo_A1.setAutoFillBackground(True)
self.qwtThermo_A1.setAlarmEnabled(True)
self.qwtThermo_A1.setAlarmLevel(512.0)
self.qwtThermo_A1.setMaxValue(1023.0)
self.qwtThermo_A1.setPipeWidth(50)
self.qwtThermo_A1.setProperty(« value », 0.0)
self.qwtThermo_A1.setObjectName(_fromUtf8(« qwtThermo_A1 »))
self.qwtThermo_A2 = QwtThermo(Form)
self.qwtThermo_A2.setGeometry(QtCore.QRect(405, 50, 103, 244))
self.qwtThermo_A2.setAutoFillBackground(True)
self.qwtThermo_A2.setAlarmEnabled(True)
self.qwtThermo_A2.setAlarmLevel(512.0)
self.qwtThermo_A2.setMaxValue(1023.0)
self.qwtThermo_A2.setPipeWidth(50)
self.qwtThermo_A2.setProperty(« value », 0.0)
self.qwtThermo_A2.setObjectName(_fromUtf8(« qwtThermo_A2 »))
self.lineEditValeurMax_A3 = QtGui.QLineEdit(Form)
self.lineEditValeurMax_A3.setGeometry(QtCore.QRect(635, 445, 66, 16))
self.lineEditValeurMax_A3.setObjectName(_fromUtf8(« lineEditValeurMax_A3 »))
self.labelUnite_A4 = QtGui.QLabel(Form)
self.labelUnite_A4.setGeometry(QtCore.QRect(830, 490, 51, 13))
self.labelUnite_A4.setObjectName(_fromUtf8(« labelUnite_A4 »))
self.lineEditValeurMax_A5 = QtGui.QLineEdit(Form)
self.lineEditValeurMax_A5.setGeometry(QtCore.QRect(635, 555, 66, 16))
self.lineEditValeurMax_A5.setObjectName(_fromUtf8(« lineEditValeurMax_A5 »))
self.labelValeurMaxMin_A3 = QtGui.QLabel(Form)
self.labelValeurMaxMin_A3.setGeometry(QtCore.QRect(635, 430, 71, 16))
self.labelValeurMaxMin_A3.setStyleSheet(_fromUtf8(« font: 6pt \ »DejaVu Sans\ »; »))
self.labelValeurMaxMin_A3.setObjectName(_fromUtf8(« labelValeurMaxMin_A3 »))
self.lcdNumberValeurCalc_A3 = QtGui.QLCDNumber(Form)
self.lcdNumberValeurCalc_A3.setGeometry(QtCore.QRect(705, 430, 121, 51))
self.lcdNumberValeurCalc_A3.setStyleSheet(_fromUtf8(« background-color: rgb(255, 255, 0);\n«
« color: rgb(255, 0, 0); »))
self.lcdNumberValeurCalc_A3.setSmallDecimalPoint(True)
self.lcdNumberValeurCalc_A3.setMode(QtGui.QLCDNumber.Dec)
self.lcdNumberValeurCalc_A3.setObjectName(_fromUtf8(« lcdNumberValeurCalc_A3 »))
self.labelUnite_A3 = QtGui.QLabel(Form)
self.labelUnite_A3.setGeometry(QtCore.QRect(830, 435, 51, 13))
self.labelUnite_A3.setObjectName(_fromUtf8(« labelUnite_A3 »))
self.lcdNumber_A3 = QtGui.QLCDNumber(Form)
self.lcdNumber_A3.setGeometry(QtCore.QRect(525, 440, 106, 40))
self.lcdNumber_A3.setStyleSheet(_fromUtf8(« background-color: rgb(170, 255, 127);\n«
« color: rgb(85, 170, 0); »))
self.lcdNumber_A3.setFrameShape(QtGui.QFrame.Box)
self.lcdNumber_A3.setFrameShadow(QtGui.QFrame.Sunken)
self.lcdNumber_A3.setSegmentStyle(QtGui.QLCDNumber.Filled)
self.lcdNumber_A3.setObjectName(_fromUtf8(« lcdNumber_A3 »))
self.lineEditValeurMin_A4 = QtGui.QLineEdit(Form)
self.lineEditValeurMin_A4.setGeometry(QtCore.QRect(635, 520, 66, 16))
self.lineEditValeurMin_A4.setObjectName(_fromUtf8(« lineEditValeurMin_A4 »))
self.lineEditUnite_A3 = QtGui.QLineEdit(Form)
self.lineEditUnite_A3.setGeometry(QtCore.QRect(830, 450, 41, 23))
self.lineEditUnite_A3.setObjectName(_fromUtf8(« lineEditUnite_A3 »))
self.lcdNumberValeurCalc_A4 = QtGui.QLCDNumber(Form)
self.lcdNumberValeurCalc_A4.setGeometry(QtCore.QRect(705, 485, 121, 51))
self.lcdNumberValeurCalc_A4.setStyleSheet(_fromUtf8(« background-color: rgb(255, 255, 0);\n«
« color: rgb(255, 0, 0); »))
self.lcdNumberValeurCalc_A4.setSmallDecimalPoint(True)
self.lcdNumberValeurCalc_A4.setMode(QtGui.QLCDNumber.Dec)
self.lcdNumberValeurCalc_A4.setObjectName(_fromUtf8(« lcdNumberValeurCalc_A4 »))
self.labelValeurMaxMin_A5 = QtGui.QLabel(Form)
self.labelValeurMaxMin_A5.setGeometry(QtCore.QRect(635, 540, 71, 16))
self.labelValeurMaxMin_A5.setStyleSheet(_fromUtf8(« font: 6pt \ »DejaVu Sans\ »; »))
self.labelValeurMaxMin_A5.setObjectName(_fromUtf8(« labelValeurMaxMin_A5 »))
self.labelVoie_A3 = QtGui.QLabel(Form)
self.labelVoie_A3.setGeometry(QtCore.QRect(525, 425, 121, 16))
self.labelVoie_A3.setObjectName(_fromUtf8(« labelVoie_A3 »))
self.lcdNumber_A4 = QtGui.QLCDNumber(Form)
self.lcdNumber_A4.setGeometry(QtCore.QRect(525, 495, 106, 40))
self.lcdNumber_A4.setStyleSheet(_fromUtf8(« background-color: rgb(170, 255, 127);\n«
« color: rgb(85, 170, 0); »))
self.lcdNumber_A4.setFrameShape(QtGui.QFrame.Box)
self.lcdNumber_A4.setFrameShadow(QtGui.QFrame.Sunken)
self.lcdNumber_A4.setSegmentStyle(QtGui.QLCDNumber.Filled)
self.lcdNumber_A4.setObjectName(_fromUtf8(« lcdNumber_A4 »))
self.labelValeurMaxMin_A4 = QtGui.QLabel(Form)
self.labelValeurMaxMin_A4.setGeometry(QtCore.QRect(635, 485, 71, 16))
self.labelValeurMaxMin_A4.setStyleSheet(_fromUtf8(« font: 6pt \ »DejaVu Sans\ »; »))
self.labelValeurMaxMin_A4.setObjectName(_fromUtf8(« labelValeurMaxMin_A4 »))
self.lineEditValeurMax_A4 = QtGui.QLineEdit(Form)
self.lineEditValeurMax_A4.setGeometry(QtCore.QRect(635, 500, 66, 16))
self.lineEditValeurMax_A4.setObjectName(_fromUtf8(« lineEditValeurMax_A4 »))
self.labelVoie_A4 = QtGui.QLabel(Form)
self.labelVoie_A4.setGeometry(QtCore.QRect(525, 480, 121, 16))
self.labelVoie_A4.setObjectName(_fromUtf8(« labelVoie_A4 »))
self.lineEditUnite_A5 = QtGui.QLineEdit(Form)
self.lineEditUnite_A5.setGeometry(QtCore.QRect(830, 560, 41, 23))
self.lineEditUnite_A5.setObjectName(_fromUtf8(« lineEditUnite_A5 »))
self.lineEditUnite_A4 = QtGui.QLineEdit(Form)
self.lineEditUnite_A4.setGeometry(QtCore.QRect(830, 505, 41, 23))
self.lineEditUnite_A4.setObjectName(_fromUtf8(« lineEditUnite_A4 »))
self.lineEditValeurMin_A5 = QtGui.QLineEdit(Form)
self.lineEditValeurMin_A5.setGeometry(QtCore.QRect(635, 575, 66, 16))
self.lineEditValeurMin_A5.setObjectName(_fromUtf8(« lineEditValeurMin_A5 »))
self.lineEditValeurMin_A3 = QtGui.QLineEdit(Form)
self.lineEditValeurMin_A3.setGeometry(QtCore.QRect(635, 465, 66, 16))
self.lineEditValeurMin_A3.setObjectName(_fromUtf8(« lineEditValeurMin_A3 »))
self.lcdNumberValeurCalc_A5 = QtGui.QLCDNumber(Form)
self.lcdNumberValeurCalc_A5.setGeometry(QtCore.QRect(705, 540, 121, 51))
self.lcdNumberValeurCalc_A5.setStyleSheet(_fromUtf8(« background-color: rgb(255, 255, 0);\n«
« color: rgb(255, 0, 0); »))
self.lcdNumberValeurCalc_A5.setSmallDecimalPoint(True)
self.lcdNumberValeurCalc_A5.setMode(QtGui.QLCDNumber.Dec)
self.lcdNumberValeurCalc_A5.setObjectName(_fromUtf8(« lcdNumberValeurCalc_A5 »))
self.labelUnite_A5 = QtGui.QLabel(Form)
self.labelUnite_A5.setGeometry(QtCore.QRect(830, 545, 51, 13))
self.labelUnite_A5.setObjectName(_fromUtf8(« labelUnite_A5 »))
self.labelVoie_A5 = QtGui.QLabel(Form)
self.labelVoie_A5.setGeometry(QtCore.QRect(525, 535, 121, 16))
self.labelVoie_A5.setObjectName(_fromUtf8(« labelVoie_A5 »))
self.lcdNumber_A5 = QtGui.QLCDNumber(Form)
self.lcdNumber_A5.setGeometry(QtCore.QRect(525, 550, 106, 40))
self.lcdNumber_A5.setStyleSheet(_fromUtf8(« background-color: rgb(170, 255, 127);\n«
« color: rgb(85, 170, 0); »))
self.lcdNumber_A5.setFrameShape(QtGui.QFrame.Box)
self.lcdNumber_A5.setFrameShadow(QtGui.QFrame.Sunken)
self.lcdNumber_A5.setSegmentStyle(QtGui.QLCDNumber.Filled)
self.lcdNumber_A5.setObjectName(_fromUtf8(« lcdNumber_A5 »))
self.qwtThermo_A3 = QwtThermo(Form)
self.qwtThermo_A3.setGeometry(QtCore.QRect(175, 365, 103, 244))
self.qwtThermo_A3.setAutoFillBackground(True)
self.qwtThermo_A3.setAlarmEnabled(True)
self.qwtThermo_A3.setAlarmLevel(512.0)
self.qwtThermo_A3.setMaxValue(1023.0)
self.qwtThermo_A3.setPipeWidth(50)
self.qwtThermo_A3.setProperty(« value », 0.0)
self.qwtThermo_A3.setObjectName(_fromUtf8(« qwtThermo_A3 »))
self.qwtThermo_A4 = QwtThermo(Form)
self.qwtThermo_A4.setGeometry(QtCore.QRect(290, 365, 103, 244))
self.qwtThermo_A4.setAutoFillBackground(True)
self.qwtThermo_A4.setAlarmEnabled(True)
self.qwtThermo_A4.setAlarmLevel(512.0)
self.qwtThermo_A4.setMaxValue(1023.0)
self.qwtThermo_A4.setPipeWidth(50)
self.qwtThermo_A4.setProperty(« value », 0.0)
self.qwtThermo_A4.setObjectName(_fromUtf8(« qwtThermo_A4 »))
self.qwtThermo_A5 = QwtThermo(Form)
self.qwtThermo_A5.setGeometry(QtCore.QRect(405, 365, 103, 244))
self.qwtThermo_A5.setAutoFillBackground(True)
self.qwtThermo_A5.setAlarmEnabled(True)
self.qwtThermo_A5.setAlarmLevel(512.0)
self.qwtThermo_A5.setMaxValue(1023.0)
self.qwtThermo_A5.setPipeWidth(50)
self.qwtThermo_A5.setProperty(« value », 0.0)
self.qwtThermo_A5.setObjectName(_fromUtf8(« qwtThermo_A5 »))
self.labelThermo_A0 = QtGui.QLabel(Form)
self.labelThermo_A0.setGeometry(QtCore.QRect(225, 300, 51, 13))
self.labelThermo_A0.setObjectName(_fromUtf8(« labelThermo_A0 »))
self.labelThermo_A1 = QtGui.QLabel(Form)
self.labelThermo_A1.setGeometry(QtCore.QRect(340, 300, 51, 13))
self.labelThermo_A1.setObjectName(_fromUtf8(« labelThermo_A1 »))
self.labelThermo_A2 = QtGui.QLabel(Form)
self.labelThermo_A2.setGeometry(QtCore.QRect(455, 300, 51, 13))
self.labelThermo_A2.setObjectName(_fromUtf8(« labelThermo_A2 »))
self.labelThermo_A2_2 = QtGui.QLabel(Form)
self.labelThermo_A2_2.setGeometry(QtCore.QRect(460, 615, 51, 13))
self.labelThermo_A2_2.setObjectName(_fromUtf8(« labelThermo_A2_2 »))
self.labelThermo_A4 = QtGui.QLabel(Form)
self.labelThermo_A4.setGeometry(QtCore.QRect(345, 615, 51, 13))
self.labelThermo_A4.setObjectName(_fromUtf8(« labelThermo_A4 »))
self.labelThermo_A3 = QtGui.QLabel(Form)
self.labelThermo_A3.setGeometry(QtCore.QRect(230, 615, 51, 13))
self.labelThermo_A3.setObjectName(_fromUtf8(« labelThermo_A3 »))
self.retranslateUi(Form)
self.comboBoxFinLigne.setCurrentIndex(1)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
Form.setWindowTitle(QtGui.QApplication.translate(« Form », « PyQt + PyQwt +PySerial : QwtThermo x6 affiche can brute (0-1023) convertie en unité voulue. « , None, QtGui.QApplication.UnicodeUTF8))
self.labelDebit.setText(QtGui.QApplication.translate(« Form », « Débit Série (bauds) : », None, QtGui.QApplication.UnicodeUTF8))
self.comboBoxPort.setItemText(0, QtGui.QApplication.translate(« Form », « /dev/ttyACM0 », None, QtGui.QApplication.UnicodeUTF8))
self.comboBoxPort.setItemText(1, QtGui.QApplication.translate(« Form », « /dev/ttyACM1 », None, QtGui.QApplication.UnicodeUTF8))
self.comboBoxPort.setItemText(2, QtGui.QApplication.translate(« Form », « /dev/ttyUSB0 », None, QtGui.QApplication.UnicodeUTF8))
self.comboBoxPort.setItemText(3, QtGui.QApplication.translate(« Form », « /dev/ttyUSB1 », None, QtGui.QApplication.UnicodeUTF8))
self.labelReception.setText(QtGui.QApplication.translate(« Form », « Réception sur le port série : « , None, QtGui.QApplication.UnicodeUTF8))
self.pushButtonInitSerial.setText(QtGui.QApplication.translate(« Form », « Initialiser », None, QtGui.QApplication.UnicodeUTF8))
self.comboBoxDebit.setItemText(0, QtGui.QApplication.translate(« Form », « 115200 », None, QtGui.QApplication.UnicodeUTF8))
self.comboBoxDebit.setItemText(1, QtGui.QApplication.translate(« Form », « 57600 », None, QtGui.QApplication.UnicodeUTF8))
self.comboBoxDebit.setItemText(2, QtGui.QApplication.translate(« Form », « 38400 », None, QtGui.QApplication.UnicodeUTF8))
self.comboBoxDebit.setItemText(3, QtGui.QApplication.translate(« Form », « 28800 », None, QtGui.QApplication.UnicodeUTF8))
self.comboBoxDebit.setItemText(4, QtGui.QApplication.translate(« Form », « 19200 », None, QtGui.QApplication.UnicodeUTF8))
self.comboBoxDebit.setItemText(5, QtGui.QApplication.translate(« Form », « 14400 », None, QtGui.QApplication.UnicodeUTF8))
self.comboBoxDebit.setItemText(6, QtGui.QApplication.translate(« Form », « 9600 », None, QtGui.QApplication.UnicodeUTF8))
self.comboBoxDebit.setItemText(7, QtGui.QApplication.translate(« Form », « 4800 », None, QtGui.QApplication.UnicodeUTF8))
self.labelPort.setText(QtGui.QApplication.translate(« Form », « Port Série : », None, QtGui.QApplication.UnicodeUTF8))
self.pushButtonStop.setText(QtGui.QApplication.translate(« Form », « Stop », None, QtGui.QApplication.UnicodeUTF8))
self.labelTraceEnvoiSerie.setText(QtGui.QApplication.translate(« Form », « Envoi sur le port série : « , None, QtGui.QApplication.UnicodeUTF8))
self.labelRacineChaine.setText(QtGui.QApplication.translate(« Form », « Racine à utiliser », None, QtGui.QApplication.UnicodeUTF8))
self.labelTraceAnalyseChaine.setText(QtGui.QApplication.translate(« Form », « Analyse de la chaine recue : « , None, QtGui.QApplication.UnicodeUTF8))
self.lineEditRacineChaine.setText(QtGui.QApplication.translate(« Form », « CAN », None, QtGui.QApplication.UnicodeUTF8))
self.labelFinLigne.setText(QtGui.QApplication.translate(« Form », « Fin de ligne : », None, QtGui.QApplication.UnicodeUTF8))
self.labelChaineEnvoi.setText(QtGui.QApplication.translate(« Form », « Chaîne à envoyer : », None, QtGui.QApplication.UnicodeUTF8))
self.pushButtonEnvoi.setText(QtGui.QApplication.translate(« Form », « Envoi », None, QtGui.QApplication.UnicodeUTF8))
self.lineEditChaineEnvoi.setText(QtGui.QApplication.translate(« Form », « CAN(12,23,45) », None, QtGui.QApplication.UnicodeUTF8))
self.comboBoxFinLigne.setItemText(0, QtGui.QApplication.translate(« Form », « Rien », None, QtGui.QApplication.UnicodeUTF8))
self.comboBoxFinLigne.setItemText(1, QtGui.QApplication.translate(« Form », « Saut de ligne (\\n = LF) », None, QtGui.QApplication.UnicodeUTF8))
self.comboBoxFinLigne.setItemText(2, QtGui.QApplication.translate(« Form », « Retour Chariot (\\r = CR) », None, QtGui.QApplication.UnicodeUTF8))
self.comboBoxFinLigne.setItemText(3, QtGui.QApplication.translate(« Form », « Les 2 (LF + CR) », None, QtGui.QApplication.UnicodeUTF8))
self.labelVoie_A1.setText(QtGui.QApplication.translate(« Form », « Voie analogique A1 : », None, QtGui.QApplication.UnicodeUTF8))
self.labelUnite_A2.setText(QtGui.QApplication.translate(« Form », « Unité : », None, QtGui.QApplication.UnicodeUTF8))
self.lineEditUnite_A0.setText(QtGui.QApplication.translate(« Form », « mV », None, QtGui.QApplication.UnicodeUTF8))
self.labelValeurMaxMin_A2.setText(QtGui.QApplication.translate(« Form », « Valeurs max/min », None, QtGui.QApplication.UnicodeUTF8))
self.labelUnite_A1.setText(QtGui.QApplication.translate(« Form », « Unité : », None, QtGui.QApplication.UnicodeUTF8))
self.labelVoie_A0.setText(QtGui.QApplication.translate(« Form », « Voie analogique A0 : », None, QtGui.QApplication.UnicodeUTF8))
self.lineEditValeurMin_A2.setText(QtGui.QApplication.translate(« Form », « 0 », None, QtGui.QApplication.UnicodeUTF8))
self.lineEditValeurMax_A0.setText(QtGui.QApplication.translate(« Form », « 5000 », None, QtGui.QApplication.UnicodeUTF8))
self.lineEditValeurMin_A1.setText(QtGui.QApplication.translate(« Form », « 0 », None, QtGui.QApplication.UnicodeUTF8))
self.labelVoie_A2.setText(QtGui.QApplication.translate(« Form », « Voie analogique A2 : », None, QtGui.QApplication.UnicodeUTF8))
self.lineEditUnite_A2.setText(QtGui.QApplication.translate(« Form », « mV », None, QtGui.QApplication.UnicodeUTF8))
self.lineEditValeurMin_A0.setText(QtGui.QApplication.translate(« Form », « 0 », None, QtGui.QApplication.UnicodeUTF8))
self.lineEditValeurMax_A1.setText(QtGui.QApplication.translate(« Form », « 5000 », None, QtGui.QApplication.UnicodeUTF8))
self.lineEditUnite_A1.setText(QtGui.QApplication.translate(« Form », « mV », None, QtGui.QApplication.UnicodeUTF8))
self.lineEditValeurMax_A2.setText(QtGui.QApplication.translate(« Form », « 5000 », None, QtGui.QApplication.UnicodeUTF8))
self.labelValeurMaxMin_A0.setText(QtGui.QApplication.translate(« Form », « Valeurs max/min », None, QtGui.QApplication.UnicodeUTF8))
self.labelValeurMaxMin_A1.setText(QtGui.QApplication.translate(« Form », « Valeurs max/min », None, QtGui.QApplication.UnicodeUTF8))
self.labelUnite_A0.setText(QtGui.QApplication.translate(« Form », « Unité : », None, QtGui.QApplication.UnicodeUTF8))
self.lineEditValeurMax_A3.setText(QtGui.QApplication.translate(« Form », « 5000 », None, QtGui.QApplication.UnicodeUTF8))
self.labelUnite_A4.setText(QtGui.QApplication.translate(« Form », « Unité : », None, QtGui.QApplication.UnicodeUTF8))
self.lineEditValeurMax_A5.setText(QtGui.QApplication.translate(« Form », « 5000 », None, QtGui.QApplication.UnicodeUTF8))
self.labelValeurMaxMin_A3.setText(QtGui.QApplication.translate(« Form », « Valeurs max/min », None, QtGui.QApplication.UnicodeUTF8))
self.labelUnite_A3.setText(QtGui.QApplication.translate(« Form », « Unité : », None, QtGui.QApplication.UnicodeUTF8))
self.lineEditValeurMin_A4.setText(QtGui.QApplication.translate(« Form », « 0 », None, QtGui.QApplication.UnicodeUTF8))
self.lineEditUnite_A3.setText(QtGui.QApplication.translate(« Form », « mV », None, QtGui.QApplication.UnicodeUTF8))
self.labelValeurMaxMin_A5.setText(QtGui.QApplication.translate(« Form », « Valeurs max/min », None, QtGui.QApplication.UnicodeUTF8))
self.labelVoie_A3.setText(QtGui.QApplication.translate(« Form », « Voie analogique A3 : », None, QtGui.QApplication.UnicodeUTF8))
self.labelValeurMaxMin_A4.setText(QtGui.QApplication.translate(« Form », « Valeurs max/min », None, QtGui.QApplication.UnicodeUTF8))
self.lineEditValeurMax_A4.setText(QtGui.QApplication.translate(« Form », « 5000 », None, QtGui.QApplication.UnicodeUTF8))
self.labelVoie_A4.setText(QtGui.QApplication.translate(« Form », « Voie analogique A4 : », None, QtGui.QApplication.UnicodeUTF8))
self.lineEditUnite_A5.setText(QtGui.QApplication.translate(« Form », « mV », None, QtGui.QApplication.UnicodeUTF8))
self.lineEditUnite_A4.setText(QtGui.QApplication.translate(« Form », « mV », None, QtGui.QApplication.UnicodeUTF8))
self.lineEditValeurMin_A5.setText(QtGui.QApplication.translate(« Form », « 0 », None, QtGui.QApplication.UnicodeUTF8))
self.lineEditValeurMin_A3.setText(QtGui.QApplication.translate(« Form », « 0 », None, QtGui.QApplication.UnicodeUTF8))
self.labelUnite_A5.setText(QtGui.QApplication.translate(« Form », « Unité : », None, QtGui.QApplication.UnicodeUTF8))
self.labelVoie_A5.setText(QtGui.QApplication.translate(« Form », « Voie analogique A5 : », None, QtGui.QApplication.UnicodeUTF8))
self.labelThermo_A0.setText(QtGui.QApplication.translate(« Form », « Voie A0 », None, QtGui.QApplication.UnicodeUTF8))
self.labelThermo_A1.setText(QtGui.QApplication.translate(« Form », « Voie A1 », None, QtGui.QApplication.UnicodeUTF8))
self.labelThermo_A2.setText(QtGui.QApplication.translate(« Form », « Voie A2 », None, QtGui.QApplication.UnicodeUTF8))
self.labelThermo_A2_2.setText(QtGui.QApplication.translate(« Form », « Voie A5 », None, QtGui.QApplication.UnicodeUTF8))
self.labelThermo_A4.setText(QtGui.QApplication.translate(« Form », « Voie A4 », None, QtGui.QApplication.UnicodeUTF8))
self.labelThermo_A3.setText(QtGui.QApplication.translate(« Form », « Voie A3 », None, QtGui.QApplication.UnicodeUTF8))
if __name__ == « __main__ »:
import sys
app = QtGui.QApplication(sys.argv)
Form = QtGui.QWidget()
ui = Ui_Form()
ui.setupUi(Form)
Form.show()
sys.exit(app.exec_())
Le fichier d’application *Main.py
# -*- coding: utf-8 -*-
# Par X. HINAULT – Tous droits réservés – GPLv3
# Jan 2013 – www.mon-club-elec.fr
# — importation des modules utiles —
from PyQt4.QtGui import *
from PyQt4.QtCore import * # inclut Qtimer..
import os,sys
import serial # communication serie
from PyQt4.Qwt5 import * # module Qwt
import re # module pour analyse de chaîne avec expressions régulières
from PyQt4.Qwt5.anynumpy import * # pour les fonctions math..
from numpy import interp # pour équivalent map
# — importation du fichier de description GUI —
from tuto_pyqt_pyqwt_pyserial_qwtthermo_can_brutex6_lineedit import *
# classe principale contenant le code actif
class myApp(QWidget, Ui_Form): # la classe reçoit le Qwidget principal ET la classe définie dans test.py obtenu avec pyuic4
# Note : ici self représente la classe
def __init__(self, parent=None):
QWidget.__init__(self) # initialise le Qwidget principal
self.setupUi(parent) # Obligatoire
# —— code actif initial ——
#Réalisez les connexions supplémentaires entre signaux et slots
self.connect(self.pushButtonInitSerial, SIGNAL(« clicked() »), self.pushButtonInitSerialClicked)
self.connect(self.pushButtonEnvoi, SIGNAL(« clicked() »), self.pushButtonEnvoiClicked)
self.connect(self.pushButtonStop, SIGNAL(« clicked() »), self.pushButtonStopClicked)
#===== Initialisation QwtThermo A0 – à mettre avant QTimer ++ ========
self.qwtThermo_A0.setFillColor(QColor(0,255,0)) # fixe la couleur de remplissage sous niveau alarme
self.qwtThermo_A0.setAlarmColor(QColor(255,0,0)) # fixe couleur remplissage au dessus niveau alarme
#===== Initialisation QwtThermo A1 – à mettre avant QTimer ++ ========
self.qwtThermo_A1.setFillColor(QColor(0,255,0)) # fixe la couleur de remplissage sous niveau alarme
self.qwtThermo_A1.setAlarmColor(QColor(255,0,0)) # fixe couleur remplissage au dessus niveau alarme
#===== Initialisation QwtThermo A2 – à mettre avant QTimer ++ ========
self.qwtThermo_A2.setFillColor(QColor(0,255,0)) # fixe la couleur de remplissage sous niveau alarme
self.qwtThermo_A2.setAlarmColor(QColor(255,0,0)) # fixe couleur remplissage au dessus niveau alarme
#===== Initialisation QwtThermo A3 – à mettre avant QTimer ++ ========
self.qwtThermo_A3.setFillColor(QColor(0,255,0)) # fixe la couleur de remplissage sous niveau alarme
self.qwtThermo_A3.setAlarmColor(QColor(255,0,0)) # fixe couleur remplissage au dessus niveau alarme
#===== Initialisation QwtThermo A4 – à mettre avant QTimer ++ ========
self.qwtThermo_A4.setFillColor(QColor(0,255,0)) # fixe la couleur de remplissage sous niveau alarme
self.qwtThermo_A4.setAlarmColor(QColor(255,0,0)) # fixe couleur remplissage au dessus niveau alarme
#===== Initialisation QwtThermo A5 – à mettre avant QTimer ++ ========
self.qwtThermo_A5.setFillColor(QColor(0,255,0)) # fixe la couleur de remplissage sous niveau alarme
self.qwtThermo_A5.setAlarmColor(QColor(255,0,0)) # fixe couleur remplissage au dessus niveau alarme
#initialisation Timer
self.timer=QTimer() # déclare un timer Qt
self.connect(self.timer, SIGNAL(« timeout() »), self.timerEvent) # connecte le signal timeOut de l’objet timer à l’appel de la fonction voulue
#— déclaration utiles —
self.serialPort=None # déclaration initiale
self.chaineIn=« » # variable pour réception
#— les fonctions appelées, utilisées par les signaux
def pushButtonInitSerialClicked(self):
print(« Bouton Init cliqué »)
if self.serialPort: # si le port existe déjà
self.serialPort.close() # ferme le port si existe
# — initialise paramètres initialisation
if self.comboBoxPort.currentText()==« » : # si le champ d’initialisation Port est vide = initialisation par défaut
strPortInit=« /dev/ttyACM0 » # port par défaut
else :
strPortInit=str(self.comboBoxPort.currentText()) #sinon utilise paramètre champ texte pour le port
strDebitInit=str(self.comboBoxDebit.currentText()) # paramètre champ texte pour debit
#— initialisation série avec gestion erreur —
try: # essaie d’exécuter les instructions
# initialise port serie avec délai attente en réception en sec
self.serialPort=serial.Serial(strPortInit, strDebitInit, serial.EIGHTBITS, serial.PARITY_NONE, serial.STOPBITS_ONE, 0.100)
#self.serialPort=serial.Serial(strPortInit, strDebitInit) # initialise port serie forme réduite
self.serialPort.flushInput() # vide la file d’attente série
print(« Initialisation Port Série : « + strPortInit + » @ « + strDebitInit + » = OK « ) # affiche debug
#– change aspect bouton init
self.pushButtonInitSerial.setStyleSheet(QString.fromUtf8(« background-color: rgb(0, 255, 0); »)) # bouton en vert
self.pushButtonInitSerial.setText(« Connexion OK ») # change titre bouton
except: # si erreur initialisation
print(« Erreur initialisation Série »)
#– change aspect bouton init
self.pushButtonInitSerial.setStyleSheet(QString.fromUtf8(« background-color: rgb(255, 127, 0); »)) # bouton en orange
self.pushButtonInitSerial.setText(QString.fromUtf8(« Non connecté »)) # change titre bouton
self.timer.start(100) # lance le timer avec délai en ms – 10 pour réception rapide
# pour optimiser la réception d’une chaîne envoyée à répétition, utiliser une valeur similaire à la valeur d’émission sur le port série
#– bouton envoi
def pushButtonEnvoiClicked(self): # lors appui bouton envoi série du champ du Terminal Série
print(« Bouton ENVOI appuyé »)
self.envoiChaineSerie(str(self.lineEditChaineEnvoi.text())) # envoi le contenu du champ texte sur le port série
#—– fonction de classe commune d’envoi d’une chaîne sur le port série —-
def envoiChaineSerie(self, chaineIn): # la fonction reçoit un objet chaîne Str
if self.serialPort: # seulement si le port série existe – n’existe pas (=None) tant que pas initialisé
self.timer.stop() # stoppe le timer le temps d’envoyer message sur le port série
# combobox avec index 0 = rien, 1=saut de ligne (LF), 2=retour chariot (CR), 3= les 2 LF+CR
if self.comboBoxFinLigne.currentIndex()==0: # si rien sélectionné
# self.serialPort.write(str(self.lineEditChaineEnvoi.text())+’\n’ ) # envoie la chaine sur le port serie
self.serialPort.write(chaineIn) # envoie la chaine sur le port serie – variante ascii
print(« Envoi Série : « + chaineIn )
self.textEditTraceEnvoiSerie.append(chaineIn) # ajoute texteEdit de visualisation
if self.comboBoxFinLigne.currentIndex()==1: # si saut de ligne sélectionné
self.serialPort.write(chaineIn +chr(10) ) # envoie la chaine sur le port serie – variante ascii
print(« Envoi Série : « + chaineIn + ‘\n‘)
self.textEditTraceEnvoiSerie.append(chaineIn) # ajoute texteEdit de visualisation
if self.comboBoxFinLigne.currentIndex()==2: # si retour chariot sélectionné
self.serialPort.write(chaineIn+chr(13) ) # envoie la chaine sur le port serie – variante ascii
print(« Envoi Série : « + chaineIn + ‘\r‘)
self.textEditTraceEnvoiSerie.append(chaineIn) # ajoute texteEdit de visualisation
if self.comboBoxFinLigne.currentIndex()==3: # si saut de ligne + retour chariot sélectionné
self.serialPort.write(chaineIn+chr(10)+chr(13) ) # envoie la chaine sur le port serie – variante ascii
print(« Envoi Série : « + chaineIn + ‘\n‘+‘\r‘)
self.textEditTraceEnvoiSerie.append(chaineIn) # ajoute texteEdit de visualisation
self.timer.start() # redémarre le timer – laisse délai pour réception en réinitialisation Timer à 0
# car sinon l’appui survient n’importe quand et si survient peu de temps avant fin délai
# la réception est hachée
#— fin envoiChaineSerie
#– bouton stop
def pushButtonStopClicked(self):
print(« Bouton Stop cliqué »)
#– stoppe la réception série —
if self.serialPort: # si le port existe déjà
self.serialPort.close() # ferme le port si existe
self.timer.stop() # stoppe le timer
#– change aspect bouton init
self.pushButtonInitSerial.setStyleSheet(QString.fromUtf8(« background-color: rgb(255, 127, 0); »)) # bouton en orange
self.pushButtonInitSerial.setText(QString.fromUtf8(« Non connecté »)) # change titre bouton
#—– fonction de gestion du signal timeout du QTimer
def timerEvent(self): # fonction appelée lors de la survenue d’un évènement Timer – nom fonction indiférrent
#– variables de réception —
self.chaineIn=« »;
self.char=« »;
# lecture des données reçues
if self.serialPort: # seulement si le port série existe
self.timer.stop() # stoppe le timer le temps de lire les caractères et éviter « réentrée »
while (self.serialPort.inWaiting()): # tant que au moins un caractère en réception
self.char=self.serialPort.read() # on lit le caractère
#self.chaineIn=self.chaineIn+self.char # forme minimale…
if self.char==‘\n‘: # si saut de ligne, on sort du while
print(« saut ligne reçu ») # debug
break # sort du while
else: #tant que c’est pas le saut de ligne, on l’ajoute à la chaine
self.chaineIn=self.chaineIn+self.char
if len(self.chaineIn)>0: # … pour ne pas avoir d’affichage si « »
print(self.chaineIn) # affiche la chaîne
self.textEditReception.append(self.chaineIn[:-1]) # ajoute le texte au textEdit en enlevant le dernier caractère (saut de ligne)
valeursCan=self.analyseChaine(self.chaineIn[:-1], str(self.lineEditRacineChaine.text())) # appelle la fonction d’analyse de chaine – renvoie liste Arguments
# l’utilisation de :-1 couplé à l’utilisation de )$ ci-dessous impose une fin de chaîne par ) une fois le saut de ligne enlevé
# — affiche les valeurs dans les LCDNumbers —
if valeursCan!=None: # si la liste des arguments n’est pas vide
for i in range(0,len(valeursCan)): # défile indice args – attention range c’est valeur de départ, nombre de valeur donc range(0,3) défile de 0 à 2 !
valeur=int(valeursCan[i])
if i==0 :
self.lcdNumber_A0.display(valeur) # affiche la valeur dans le LCDNumber voulu
self.qwtThermo_A0.setValue(valeur) # fixe la valeur du qwtDial à partir de la valeur reçue sur port série
# équiv map : interp(256,[1,512],[5,10]) (package numpy)
valeurCalc=interp(valeur, [0,1023],[float(self.lineEditValeurMin_A0.text()),float(self.lineEditValeurMax_A0.text())]) # équiv map
self.lcdNumberValeurCalc_A0.display(valeurCalc)
if i==1 :
self.lcdNumber_A1.display(valeur) # affiche la valeur dans le LCDNumber voulu
self.qwtThermo_A1.setValue(valeur) # fixe la valeur du qwtDial à partir de la valeur reçue sur port série
# équiv map : interp(256,[1,512],[5,10]) (package numpy)
valeurCalc=interp(valeur, [0,1023],[float(self.lineEditValeurMin_A1.text()),float(self.lineEditValeurMax_A1.text())]) # équiv map
self.lcdNumberValeurCalc_A1.display(valeurCalc)
if i==2 :
self.lcdNumber_A2.display(valeur) # affiche la valeur dans le LCDNumber voulu
self.qwtThermo_A2.setValue(valeur) # fixe la valeur du qwtDial à partir de la valeur reçue sur port série
# équiv map : interp(256,[1,512],[5,10]) (package numpy)
valeurCalc=interp(valeur, [0,1023],[float(self.lineEditValeurMin_A2.text()),float(self.lineEditValeurMax_A2.text())]) # équiv map
self.lcdNumberValeurCalc_A2.display(valeurCalc)
if i==3 :
self.lcdNumber_A3.display(valeur) # affiche la valeur dans le LCDNumber voulu
self.qwtThermo_A3.setValue(valeur) # fixe la valeur du qwtDial à partir de la valeur reçue sur port série
# équiv map : interp(256,[1,512],[5,10]) (package numpy)
valeurCalc=interp(valeur, [0,1023],[float(self.lineEditValeurMin_A3.text()),float(self.lineEditValeurMax_A3.text())]) # équiv map
self.lcdNumberValeurCalc_A3.display(valeurCalc)
if i==4 :
self.lcdNumber_A4.display(valeur) # affiche la valeur dans le LCDNumber voulu
self.qwtThermo_A4.setValue(valeur) # fixe la valeur du qwtDial à partir de la valeur reçue sur port série
# équiv map : interp(256,[1,512],[5,10]) (package numpy)
valeurCalc=interp(valeur, [0,1023],[float(self.lineEditValeurMin_A4.text()),float(self.lineEditValeurMax_A4.text())]) # équiv map
self.lcdNumberValeurCalc_A4.display(valeurCalc)
if i==5 :
self.lcdNumber_A5.display(valeur) # affiche la valeur dans le LCDNumber voulu
self.qwtThermo_A5.setValue(valeur) # fixe la valeur du qwtDial à partir de la valeur reçue sur port série
# équiv map : interp(256,[1,512],[5,10]) (package numpy)
valeurCalc=interp(valeur, [0,1023],[float(self.lineEditValeurMin_A5.text()),float(self.lineEditValeurMax_A5.text())]) # équiv map
self.lcdNumberValeurCalc_A5.display(valeurCalc)
# fin for
# fin if valeursCan!= None
self.timer.start() # redémarre le timer
#—- fin timerEvent
#—- fonction analyse de chaine —
def analyseChaine(self, chaineIn, chaineRacineIn): # fonction reçoit chaine à analyser et la racine à utiliser – reconnaît fonction racine(**,**, ..,**)
args=None # valeur par défaut de args
flagRacine=False # drapeau racine OK
self.textEditTraceAnalyseChaine.setText(QString.fromUtf8(« Chaine à analyser : « + chaineIn)) # trace analyse chaine
#result=re.findall(r’^.*\((.*)\).*$’,chaineIn) # extrait ** de la chaine au format –(**) si la chaîne est au format valide
result=re.findall(r‘^.*\((.*)\)$’,chaineIn) # extrait ** de la chaine au format –(**) si la chaîne est au format valide
self.textEditTraceAnalyseChaine.append(str(len(result)) + QString.fromUtf8( » chaine valide »)) # trace analyse chaine
#racine=re.findall(r’^(.*)\(.*\).*$’,chaineIn) # extrait ** de la chaine au format **(–) si la chaîne est au format valide
racine=re.findall(r‘^(.*)\(.*\)‘,chaineIn) # extrait ** de la chaine au format **(–) si la chaîne est au format valide
self.textEditTraceAnalyseChaine.append(str(len(racine)) + QString.fromUtf8( » racine valide »)) # trace analyse chaine
#– analyse racine —
if len(racine)==1:
self.textEditTraceAnalyseChaine.append(QString.fromUtf8(« Racine reçue : « )+ racine[0]) # trace analyse chaine
if racine[0] == str(chaineRacineIn):
self.textEditTraceAnalyseChaine.append(QString.fromUtf8(« Racine reçue conforme »))# trace analyse chaine
flagRacine=True # flag racine OK
else:
self.textEditTraceAnalyseChaine.append(QString.fromUtf8(« Racine reçue non conforme »))# trace analyse chaine
# fin else
# fin if
if len(result)==1 and flagRacine: # si une seule chaine valide détectée et que la racine OK
#self.textEditTraceAnalyseChaine.append(QString.fromUtf8(result[0])) # trace analyse chaine : affiche la chaine des arguments
self.textEditTraceAnalyseChaine.append(QString.fromUtf8(« Paramètres reçus : »)) # trace analyse chaine : affiche la chaine des arguments
args=result[0].split(‘,’) # récupère la liste des arguments séparés par une parenthèse
self.textEditTraceAnalyseChaine.append(QString.fromUtf8(str(args))) # trace analyse chaine : affiche la liste des arguments
# boucle sans l’indice
#for valeur in args: # défile les arguments de la liste
#self.textEditTraceAnalyseChaine.append(QString.fromUtf8(str(valeur))) # trace analyse chaine : affiche la liste des arguments
# boucle avec indice
for i in range(0,len(args)): # défile indice args – attention range c’est valeur de départ, nombre de valeur donc range(0,3) défile de 0 à 2 !
valeur=int(args[i])
self.textEditTraceAnalyseChaine.append(QString.fromUtf8(str(valeur))) # trace analyse chaine : affiche la liste des valeurs int des arguments
return args # renvoie la liste des arguments – None si pas d’arguments
# pour tester en Terminal Python
# analyse de la chaine
#chaine= »CAN(123,122,121) »
# result=re.findall(r’^.*\((.*)\)’,chaine) # extrait –(**)
# result=re.findall(r’^.*\((.*,.*,.*)\)’,chaine) # extrait –(*,*,*) = 3 paramètres
# sub=result[0].split(‘,’)
# print sub
# => 123, 122, 121
# print len(sub)
# => 3
# print int(sub[0])
# => 123
# fonction principale exécutant l’application Qt
def main(args):
a=QApplication(args) # crée l’objet application
f=QWidget() # crée le QWidget racine
c=myApp(f) # appelle la classe contenant le code de l’application
f.show() # affiche la fenêtre QWidget
r=a.exec_() # lance l’exécution de l’application
return r
# pour rendre le fichier *.py exécutable
if __name__==« __main__ »: # pour rendre le code exécutable
main(sys.argv) # appelle la fonction main
Code Arduino d’exemple
const int RVar=0; //declaration constante de broche analogique
// — Déclaration des variables globales —
int mesureBrute=0;// Variable pour acquisition résultat brut de conversion analogique numérique
//**************** FONCTION SETUP = Code d’initialisation *****
void setup() { // debut de la fonction setup()
Serial.begin(115200); // initialise connexion série à 115200 bauds
// IMPORTANT : régler le terminal côté PC avec la même valeur de transmission
} // fin de la fonction setup()
//***** FONCTION LOOP = Boucle sans fin *****
void loop(){ // debut de la fonction loop()
// acquisition conversion analogique-numerique (CAN) sur la voie analogique
mesureBrute=analogRead(RVar);
// affiche valeur numerique entière ou à virgule au format décimal
Serial.println(mesureBrute);
delay(500);
} // fin de la fonction loop() – le programme recommence au début de la fonction loop sans fin
Utilisation
- Les 2 fichiers suivants sont à enregistrer dans un même répertoire, l’un en nom.py et l’autre en nomMain.py.
- Puis lancer l’application depuis Geany ou équivalent, en exécutant le fichier nomMain.py
- Les qwtThermo affichent la valeur de la mesure de chaque voie les champs la conversion d’unité associée.
Articles Liés
- PyQt Lab' : Port Série : en réception : Réception de 6 valeurs numériques sur le port série, dans 6 QwtDial, le widget d'affichage analogique « à aiguille », conversion mesure/unité et affichage dans 12 widgets LCD.
PyQt Lab est un outil puissant qui permet aux utilisateurs de créer des applications graphiques…
- PyQt Lab' : Port Série : en réception : Recevoir de façon asynchrone des paramètres numériques par réception de chaines spécifiques avec paramètre numérique reçue sur le port série (= décodage de "fonctions" différentes avec un seul paramètre numérique reçues sur le port série - affichage dans lcdNumber)
PyQt Lab' : Port Série : en réception : Recevoir de façon asynchrone des paramètres…
- PyQt Lab' : Graphiques Math : Pyqtgraph + Pyserial : Afficher une courbe à partir de valeurs reçues sur le port série, avec widgets de paramétrage des axes
PyQt Lab est un outil puissant qui permet aux utilisateurs de créer des graphiques mathématiques…