简体   繁体   中英

Serial data capture and real time plotting: Drawnow, matplotlib, python

I am new to programming and after a few weeks have made some programs to do simple things; like capture serial data from an arduino and save it to a text file. Now I want to combine a couple things. I want to use python to capture serial data, prompt for port and filename, take that data and plot it real time, then when the arudino is no longer connected, save and close file. Here is the code I have so far.

problem is the graph is not real time at all. The sensors show almost no change. I also sometimes get a matplotlib depreciation warning. I wondering if there is a quick fix or if I am missing something crucial. Thank you so much!

    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()

I also had a same problem.

It was solved by using set_data() like blow link.

Draw now and Matplotlib

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM