2017-07-11 1 views
-1

J'ai besoin de tracer en temps réel une série de nombres à virgule flottante à partir du port série. Ces valeurs sont sepparated par le caractère « \ n », de sorte que la séquence de données est quelque chose comme ceci: x1 x2 x3 ...Tracé en temps réel python en utilisant pyqtgraph

Comment voulez-vous tracer les données? J'utilise une carte Arduino, le débit de données est de 200 échantillons/s, et mon PC fonctionne sous Windows7 64 bits. Je pense qu'un bon choix est d'utiliser la bibliothèque pyqtgraph. J'ai commencé à utiliser l'exemple Plotting.py dans pyqtgraph, mais je ne sais pas comment adapter ce code à mes besoins (voir ci-dessous). Merci beaucoup d'avance.

from pyqtgraph.Qt import QtGui, QtCore 
import numpy as np 
import pyqtgraph as pg 

# Set graphical window, its title and size 
win = pg.GraphicsWindow(title="Sample process") 
win.resize(1000,600) 
win.setWindowTitle('pyqtgraph example') 

# Enable antialiasing for prettier plots 
pg.setConfigOptions(antialias=True) 

# Random data process 
p6 = win.addPlot(title="Updating plot") 
curve = p6.plot(pen='y') 
data = np.random.normal(size=(10,1000)) # If the Gaussian distribution shape is, (m, n, k), then m * n * k samples are drawn. 

# plot counter 
ptr = 0 

# Function for updating data display 
def update(): 
    global curve, data, ptr, p6 
    curve.setData(data[ptr%10]) 
    if ptr == 0: 
     p6.enableAutoRange('xy', False) ## stop auto-scaling after the first data set is plotted 
    ptr += 1 

# Update data display  
timer = QtCore.QTimer() 
timer.timeout.connect(update) 
timer.start(50) 


## Start Qt event loop unless running in interactive mode or using pyside. 
if __name__ == '__main__': 
    import sys 
    if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'): 
     QtGui.QApplication.instance().exec_() 
+0

Votre problème n'est pas assez bien défini. Le code que vous présente trace une liste de flottants contenus dans un objet nommé 'data'. C'est une partie de votre tâche, bien sûr, mais qu'en est-il du flux de données de l'Arduino? Comment est-il formaté et comment proposez-vous de l'analyser en nombres? Jusqu'à ce que vous répondiez à cela, il y a très peu de choses que n'importe qui peut dire. –

+0

Ma carte arduino transmet une série de valeurs flottantes suivies de caractères \ n ': x1 x2 x3 ... Je veux tracer ces valeurs en temps réel. Comment puis-je le faire, s'il vous plaît? Merci pour votre temps. – fmarengo

+0

Voici ce que je ferais: obtenir le paquet Python pour accéder aux ports série (PySerial). Installez-le. Écrivez un script pour ouvrir COM10 avec la vitesse de transmission correcte et d'autres paramètres de port. Dans une boucle serrée rassembler les données de l'Adruino. Convertissez chaque chaîne en float et imprimez-la sur la console. Assurez-vous qu'il n'y a pas d'erreurs. Ce n'est qu'après avoir travaillé que vous devriez aborder le problème du tracé en temps réel. Si vous avez besoin d'aide pour faire fonctionner cette boucle d'acquisition de données, postez une question différente ici sur SO et vous devriez obtenir l'aide dont vous avez besoin. –

Répondre

0

J'ai mis en temps réel tracé en pyqtgraph un certain temps. Vous pouvez utiliser ma mise en œuvre qui a par exemple ici: https://github.com/Jonksar/cowculator/blob/master/examples/plotting_example.py

Le code fait le travail est ici: https://github.com/Jonksar/cowculator/blob/master/cowculator/plotting.py

+0

Merci beaucoup, Joonatan, mais je suis un débutant en python. Comment puis-je adapter votre code aux données provenant du port série? – fmarengo

+0

Pouvez-vous lire à travers le port série? –

0

Voici le code qui fonctionne très bien. Le processus principal est contenu dans la fonction update(). Il lit la valeur d'entrée du port série, met à jour le tableau Xm (qui contient les valeurs d'entrée), puis met à jour sa courbe associée.

Ce code a été posté par souci de simplicité et fonctionne uniquement pour de faibles débits de données (moins de 100 échantillons/s). Pour les débits de données supérieurs, il doit être modifié dans la fonction update() comme suit. Un ensemble de valeurs (au lieu d'un seul) doit être lu à partir du port série. Ensuite, un tel ensemble doit être ajouté au tableau Xm

J'espère que cette réponse vous sera utile, et merci beaucoup pour votre aide!

# Import libraries 
from numpy import * 
from pyqtgraph.Qt import QtGui, QtCore 
import pyqtgraph as pg 
import serial 

# Create object serial port 
portName = "COM12"      # replace this port name by yours! 
baudrate = 9600 
ser = serial.Serial(portName,baudrate) 

### START QtApp ##### 
app = QtGui.QApplication([])   # you MUST do this once (initialize things) 
#################### 

win = pg.GraphicsWindow(title="Signal from serial port") # creates a window 
p = win.addPlot(title="Realtime plot") # creates empty space for the plot in the window 
curve = p.plot()      # create an empty "plot" (a curve to plot) 

windowWidth = 500      # width of the window displaying the curve 
Xm = linspace(0,0,windowWidth)   # create array that will contain the relevant time series  
ptr = -windowWidth      # set first x position 

# Realtime data plot. Each time this function is called, the data display is updated 
def update(): 
    global curve, ptr, Xm  
    Xm[:-1] = Xm[1:]      # shift data in the temporal mean 1 sample left 
    value = ser.readline()    # read line (single value) from the serial port 
    Xm[-1] = float(value)     # vector containing the instantaneous values  
    ptr += 1        # update x position for displaying the curve 
    curve.setData(Xm)      # set the curve with this data 
    curve.setPos(ptr,0)     # set x position in the graph to 0 
    QtGui.QApplication.processEvents() # you MUST process the plot now 

### MAIN PROGRAM #####  
# this is a brutal infinite loop calling your realtime data plot 
while True: update() 

### END QtApp #### 
pg.QtGui.QApplication.exec_() # you MUST put this at the end 
##################