Feb-07-2018, 11:38 AM
I'm monitoring and plotting temperature and pressure and would like to do so over the last 24 hours. I am getting the data from an Arduino sending the temp and pressure via the serial port in the following format "17.4 , 30.2". I can read and plot the data no problem but I can't figure out how to have the x axis show the current time on the right and the last 24 hours to the left. I have looked in the forums and some help files and have figured out how to get the hour and minutes but when I try to use either of those as my Xlim max it doesn't show the data. I think the problem is my data is not time stamped but goes by a sample count. I've tried a few things but am getting no where. I assume I'm not the first to do this, no sense reinventing the wheel.
What I would like is to have the current time on the far right of the graph, divided in 4 hour major ticks labeled with that time, minor ticks just showing no time attached. If the elapsed time goes past 12:00 midnight then the hours will show 8:00 of the previous day.
here's my code
John
What I would like is to have the current time on the far right of the graph, divided in 4 hour major ticks labeled with that time, minor ticks just showing no time attached. If the elapsed time goes past 12:00 midnight then the hours will show 8:00 of the previous day.
here's my code
# Graphing Temperature and Pressure import serial # Import Serial Library import numpy # Import numpy import matplotlib.pyplot as plt #import matplot lib from drawnow import * import time from datetime import datetime from matplotlib.dates import DateFormatter, AutoDateFormatter, AutoDateLocator tempArray = [] PressureArray = [] ArduinoData = serial.Serial('com8', 115200) # Read from Com8, that Mega is connect to at 115200 baud plt.ion() # tell matplotlib you want iteractive mode to plot live data count =0 # counts number of times loop runs # Read Current Time Current_time = time.localtime() #Gets current date and time hour = Current_time[3] #Current hour minute =Current_time[4] #Current minute def makePlot(): #create a function that makes our desired plot plt.ylim(0, 50) # sets min/max on y axis on graph plt.title('Live Temp and Pressure') # add title to graph plt.grid(True) # turn grid on plt.ylabel('Temp F') # Y axis label plt.plot(tempArray, 'ro-', label='Degrees F') # plots temp array as red with dots and connecting line plt.legend(loc='upper left') # puts Y axis line legend at top left of graph plt2=plt.twinx() # creates a second plot from first for pressure plt.ylim(27, 32) # set limit of 2nd Y axis plt2.plot(PressureArray, 'b^-', label = 'Pressure in "Hg') # plot Pressure with blue triangles and connecting line plt2.set_ylabel('Pressure "Hg') # adds label to second Y axis, have to use the set_label because of seconf plot plt2.ticklabel_format(useOffset=False) # use for when pressure is in Pascals keeps large number on 2nd Y axis scale plt2.legend(loc='upper right') # puts 2nd Y axis line legend at top right of graph while True: # forever while loop while (ArduinoData.inWaiting() == 0): # Wait for data in serial port pass # do nothing ArduinoString = ArduinoData.readline() # read data as a full string dataArray = ArduinoString.split(' , ') # split full string into parts separated by a , temp = float (dataArray[0]) # convert first element in array to a float Pressure = float (dataArray[1]) # convert second element in array to a float tempArray.append(temp) # load temperature Array PressureArray.append(Pressure) # load Pressure Array drawnow (makePlot) # Call drawnow to update the live graph plt.pause(0.00001) # short pause needed for drawnow count = count + 1 # increments loop counter if(count > 50): # test if loop counts are above 50, defines length of X axis tempArray.pop(0) # removes first element of temp array PressureArray.pop(0) # removes first element of Pressure arrayThanks
John