使用Pyserial根据Arduino Serial P的电压绘制时间

2024-10-06 12:38:14 发布

您现在位置:Python中文网/ 问答频道 /正文

正如标题所说,我正在使用一个沿着串行端口输出数据的Arduino。其输出如下:

120 1.23秒 170 2.54美元 210 2.32美元

左栏是以毫秒为单位的时间,右栏是0到5V之间的电压值。用空格隔开。编辑:看来stackoverflow不允许我以表格形式打印,所以为了清楚起见,我有120个空格1.23\newline 170个空格2.54,依此类推。 我使用的Arduino草图:

#include <eHealth.h>


unsigned long time;
// The setup routine runs once when you press reset:
void setup() {
  Serial.begin(9600);  
}

// The loop routine runs over and over again forever:
void loop() {

  float ECG = eHealth.getECG();
  time = millis();
  Serial.print(time);
  Serial.print(" ");
  Serial.print(ECG, 3); 
  Serial.println(""); 


  delay(50);    // wait for 50 millisecond
}

现在在python的最后,我尝试了一些不同的脚本来让它工作,但是到目前为止都没有成功。我想打印沿x轴(数据的左栏)相对于电压值(右栏)的时间(毫秒),并更新沿x轴的时间,以便它随输入的数据而变化。在

我遇到的一段代码是这段代码,但这似乎更适合在同一个图表上绘制两段数据,这不是我想要的:

^{pr2}$

理想情况下,我想要这样的输出:

http://2.bp.blogspot.com/-IoeJ2QN-3Y0/UqeA2ZTTe9I/AAAAAAAADZg/PEOAZaCnYj0/s1600/VID_20131210_211336.mp4


Tags: the数据timesetup时间serialrunsarduino
1条回答
网友
1楼 · 发布于 2024-10-06 12:38:14

这里有一个例子,告诉你如何做你想做的,但是首先要注意:

  1. 在注释行中,您可以了解如何从串行端口获取真实数据(因为我没有串行端口来测试它,所以您必须自己尝试……)
  2. 使用N可以控制最多要绘制多少个点
  3. 使用refreshMillis可以控制绘图的刷新率
  4. 您可以按原样运行代码并查看示例图

现在代码:

from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg
import matplotlib.figure as mfig
import PyQt4.QtGui as gui, PyQt4.QtCore as core
import collections
import time
import random

#import serial
#ser = serial.Serial('/dev/tty.usbmodem1411', 9600)
#def get_line():
#    return ser.readline()

def get_line():
    x = time.time()%10000
    y = random.random() * 5
    return "%d %.3f\n" % (x,y)

refreshMillis = 300
N = 10
xs = collections.deque(maxlen=N)
ys = collections.deque(maxlen=N)

app = gui.QApplication([])

fig = mfig.Figure()
canvas = FigureCanvasQTAgg(fig)

ax = fig.add_subplot(111)
ax.set_ylim([0,5])
line2D, = ax.plot(xs,ys)
canvas.show()

def process_line():
    line = get_line()
    data = map(float,line.split(' '))
    xs.append(data[0])
    ys.append(data[1])
    line2D.set_data(xs,ys)
    xmin, xmax = min(xs),max(xs)
    if xmin == xmax:
        ax.set_xlim([xmin,xmin+1])
    else:
        ax.set_xlim([xmin,xmax])
    canvas.draw()

timer = core.QTimer()
timer.timeout.connect(process_line)
timer.start(refreshMillis)

app.exec_()

#ser.flush()
#ser.close()

相关问题 更多 >