Серийный сбор данных и построение графиков в реальном времени: Drawnow, matplotlib, python

Я новичок в программировании и через несколько недель сделал несколько программ, чтобы делать простые вещи; как захватить серийные данные из Arduino и сохранить его в текстовом файле. Теперь я хочу объединить пару вещей. Я хочу использовать python для захвата последовательных данных, запроса порта и имени файла, получения этих данных и отображения их в реальном времени, а затем, когда arudino больше не подключен, сохраните и закройте файл. Вот код, который у меня есть.

Проблема в том, что график вообще не в реальном времени. Датчики показывают почти без изменений. Я также иногда получаю предупреждение об износе matplotlib. Мне интересно, есть ли быстрое решение или я что-то упускаю. Спасибо вам большое!

    import numpy
    import matplotlib.pyplot as plt
    import math
    import time
    import pylab
    from drawnow import drawnow
    import csv
    import serial
    import os
    import glob
    import sys

    filename = raw_input("Save file as: ")
    saveFile = open(filename, 'w')

    print "Available ports: "

    def serial_port():
         if sys.platform.startswith('win'):
             ports = ['COM%s' % (i + 1) for i in range (256)]
        elif sys.platform.startswith('linux') or      sys.platform.startswith('cygwin'):
            ports = glob.glob('/dev/tty/[A-Za-z]*')
         elif sys.platform.startswith('darwin'):
            ports = glob.glob('/dev/tty.*')
        else:
            raise EnvironmentError('Unsupported Platform')

        result = []
        for port in ports:
            try:
        s = serial.Serial(port)
        s.close()
        result.append(port)

    except (OSError, serial.SerialException):
        pass
return result

    if __name__ == '__main__':
        print serial_port()

    serialport = raw_input("Enter Port: ")
    port1 = serialport

    print "Connecting to port...", port1

    arduino1 = serial.Serial(port1, 115200)

    print "Arduino Detected"


    #create arrays with the following names
    Time = []
    analog0 = []
    analog1 = []
    voltage0 = []
    voltage1 = []
    Temp = []
    RH = []

    #reading data from the serial port
    #telling Matplot.lib to plot live data
    plt.ion()

    #creates a function to make a plot we want
     def Fig1():
        plt.plot(analog0, 'r-')
        plt.title("Analog0 Data")
        plt.ylim(405, 425)
        plt.grid(True)
        plt.ylabel("analog")
        plt.xlabel("milliseconds")

    x = os.path.exists(port1)

    while x==0:
        arduinoString = arduino1.readline()
        saveFile.write(arduinoString)
        dataArray = arduinoString.split(',')
        time = float(dataArray[0])
        a0 = float(dataArray[1])
        a1 = float(dataArray[2])
        v0 = float(dataArray[3])
        v1 = float(dataArray[4])
        temp = float(dataArray[5])
        rh = float(dataArray[6])
          #filling our arrays with those new data values (floats)
        Time.append(time)
        analog0.append(a0)
        analog1.append(a1)
        voltage0.append(v0)
        voltage1.append(v1)
        Temp.append(temp)
        RH.append(rh)

        drawnow(Fig1)
        plt.pause(0.00010)

    else:
        saveFile.close()

0 ответов

У меня тоже была такая же проблема.

Это было решено с помощью set_data() вроде дуть ссылку.

Рисуем сейчас и Matplotlib

Другие вопросы по тегам