완전..완전..생초보입니다!
제가 MFC라는 질량 유량계에서..1초마다 아두이노를 통해서 값을 받고 있는데요..
플로팅을 하기 위해서 파이썬으로 어찌어찌 코딩을 해서 1초마다 그 값을 텍스트 파일에 쓰게 해놨습니다.
근데 이게 문제가..실행시키고 한 20초가 지나니...elapsed time은 1초인데 체감 시간이 2초 정도로 계속 딜레이 되는겁니다..
텍스트 파일에 계속 데이터를 입력해서 용량이 커지니 얘가 열고 닫는 시간이 조금씩 느려지나 보다 생각했는데..
또 다음줄에 새로 덮어쓰기를 하면 1~19초 정도는 제대로 나오다가 20초 정도면 딜레이가 시작됩니다..
혹시 이런 현상을 해결할 수 있는 방법이 있을까요!?
코드는 다음과 같습니다..
-----------------------------------------------------
import serial
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.animation as anim
plt.close('all')
fig = plt.figure()
ax1 = fig.add_subplot(3,1,1)
ax2 = fig.add_subplot(3,1,2)
ax3 = fig.add_subplot(3,1,3)
serial_port = '/dev/cu.usbmodem1441';
baud_rate = 38400;
ser = serial.Serial(serial_port, baud_rate)
write_to_file_path = "data_2.txt";
lines = np.ones(100)
etime =[]
temp = []
RH = []
N2 = []
H2O = []
N2M = []
H2OM = []
def animate(i):
output_file = open(write_to_file_path, "a")
line = ser.readline()
line = line.decode("utf-8")
print(line)
output_file.write(line)
output_file.close()
newline = np.fromstring(line,dtype=float,sep=',')
for line in lines:
if len(newline) >1:
etimeC = newline[0]
etime.append(etimeC)
tempC = newline[7]
temp.append(tempC)
RHC = newline[8]
RH.append(RHC)
N2C = newline[5]*2000/255
N2MC = newline[9]*2000/1023
H2OC = newline[6]*2000/255
H2OMC = newline[10]*2000/1023
N2.append(N2C)
H2O.append(H2OC)
N2M.append(N2MC)
H2OM.append(H2OMC)
ax1.clear()
ax2.clear()
ax3.clear()
ax1.set_ylim(0,40)
ax2.set_ylim(0,100)
ax3.set_ylim(0,2000)
ax1.set_ylabel('Temp. (oC)')
ax2.set_ylabel('RH (%)')
ax3.set_xlabel('Time (s)')
ax3.set_ylabel('Flow rate (sccm)')
ax1.annotate(str(tempC)+'oC',xy=(10,10))
ax2.annotate(str(RHC)+'%',xy=(10,10))
ax3.annotate('N2 '+str(int(N2MC)),xy=(10,1800))
ax3.annotate('H2O '+str(int(H2OMC)),xy=(10,20))
ax1.plot(etime, temp, 'r-', label='temp')
ax2.plot(etime, RH, 'b-', label='RH')
ax3.plot(etime,N2,'m',etime,H2O,'g',etime,N2M,'m.',etime,H2OM,'g.')
plt.setp(ax1.get_xticklabels(), visible=False)
plt.setp(ax2.get_xticklabels(), visible=False)
ani = anim.FuncAnimation(fig,animate,interval=1000)
plt.show()
-----------------------------------------------------