機械稼働状況のグラフ更新を実現したい
ラズベリーパイに光センサーを繋ぎ、工場の加工設備のシグナルタワーの点灯パターンにより、機械稼働状況を計測しています。
時間帯によっての機械稼働状況をリアルタイムに可視化したいのでグラフをリアルタイムに更新したいのですが、以下の問題が発生しました。
発生している問題:過去のグラフデータがクリアされずに、新しいグラフが増え続けてしまう
関係ないかと思いますが以下のようなエラーメッセージが出ています
エラーメッセージ /usr/lib/python3/dist-packages/matplotlib/axes/_base.py:3215: MatplotlibDeprecationWarning: The `xmin` argument was deprecated in Matplotlib 3.0 and will be removed in 3.2. Use `left` instead. alternative='`left`', obj_type='argument') /usr/lib/python3/dist-packages/matplotlib/axes/_base.py:3221: MatplotlibDeprecationWarning: The `xmax` argument was deprecated in Matplotlib 3.0 and will be removed in 3.2. Use `right` instead. alternative='`right`', obj_type='argument')
使用している該当のソースコード
python
1import time 2import japanize_matplotlib 3import RPi.GPIO as GPIO 4import datetime 5import pandas as pd 6import matplotlib.pyplot as plt 7import matplotlib.dates as mdates 8from io import StringIO 9from time import sleep 10 11dissolution=1 #計測分解能[s] 12time1=0 #0秒 13rate=0 14# MCP3208からSPI通信で12ビットのデジタル値を取得。0から7の8チャンネル使用可 15def readadc(adcnum,clockpin,mosipin,misopin,cspin): 16 if adcnum> 7 or adcnum<0: 17 return -1 18 19 GPIO.output(cspin,GPIO.HIGH) # I/Oが起きないようにCSを1にする 20 GPIO.output(clockpin,GPIO.LOW)# CLK を0に設定しておく 21 GPIO.output(cspin,GPIO.LOW)# I/Oを始めるためにCSを0にする 22 23 commandout=adcnum# adcnum は 0 (CH0)なので、commandout は 00000000 24 commandout |=0x18 # スタートビット+シングルエンドビット# 0x18 は 00011000 なので、commandout は 00011000 になる。 25 commandout<<=3 # commandout は 11000000 になる。この上位5ビットを使い、制御信号の 11000 を送る。 26 27 for i in range(5): 28 if commandout & 0x80: 29 GPIO.output(mosipin,GPIO.HIGH) 30 else: 31 GPIO.output(mosipin,GPIO.LOW) 32 commandout<<=1 33 GPIO.output(clockpin,GPIO.HIGH) 34 GPIO.output(clockpin,GPIO.LOW) 35 36 adcout=0 # データ保存変数 adcout の初期化 37 38 for i in range(13):# 13ビット読む(ヌルビット+12ビットデータ) 39 GPIO.output(clockpin,GPIO.HIGH) 40 GPIO.output(clockpin,GPIO.LOW) 41 adcout<<=1 42 if i>0 and GPIO.input(misopin)==GPIO.HIGH: 43 adcout |=0x1 44 GPIO.output(cspin,GPIO.HIGH) 45 return adcout 46 47#GPIOへアクセスする番号をBCMの番号で指定することを宣言 48GPIO.setmode(GPIO.BCM) 49 50# ピンの名前を変数として定義# Raspberry Pi のモードとして、GPIOの番号を物理番号ではなく役割番号で指定する 51SPICS=8 52SPIMISO=9 53SPIMOSI=10 54SPICLK=11 55# SPI通信用の入出力を定義 出力ピンなのか入力ピンなのか指定する 56GPIO.setup(SPICLK,GPIO.OUT) 57GPIO.setup(SPIMOSI,GPIO.OUT) 58GPIO.setup(SPIMISO,GPIO.IN) 59GPIO.setup(SPICS,GPIO.OUT) 60 61start=time.time() 62 63def plot_operation(fig, ax): 64 data=pd.read_csv('mydata'+nowday+'.csv', header=None, names=[0,1], index_col=0, parse_dates=True) 65 x=data.index 66 y=data.iloc[:,0] 67 d_today = datetime.date.today() 68 dt_start = datetime.datetime(d_today.year, d_today.month, d_today.day, 7, 0) 69 df_start = pd.DataFrame([[0, 0]], index=[dt_start]) 70 d_tomorrow = d_today + datetime.timedelta(days=1) 71 dt_end = datetime.datetime(d_tomorrow.year, d_tomorrow.month, d_tomorrow.day) 72 df_end = pd.DataFrame([[0, 0]], index=[dt_end]) 73 data = df_start.append([data, df_end]) 74 data = data.asfreq('min', fill_value=0) 75 76 plt.figure(figsize=(12.8, 4.8)) 77 plt.xlabel("時刻") 78 plt.ylabel("1=稼働,0=停止") 79 plt.bar(x,y,width=0.0007) 80 plt.gca().xaxis.set_major_locator(mdates.HourLocator(interval=1)) 81 plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%H:%M')) 82 plt.gca().set_xlim(xmin=datetime.datetime(d_today.year, d_today.month, d_today.day, 7, 0),xmax=dt_end) 83 plt.gca().set_yticks([0, 1]) 84 plt.tight_layout() 85 plt.draw() 86 plt.pause(1) 87 88fig = plt.figure(figsize=(12.8, 4.8)) 89ax = fig.add_subplot() 90now=datetime.datetime.now() 91now6=now-datetime.timedelta(hours=6)#24時〜30時を前日分として保存 92nowday='{0:%Y%m%d}'.format(now6)#日付でcsv保存するため 93 94while True: 95 try: 96 inputVal0=readadc(0,SPICLK,SPIMOSI,SPIMISO,SPICS)# CH0の信号を取得する プログラム運転(緑) 97 inputVal1=readadc(1,SPICLK,SPIMOSI,SPIMISO,SPICS)#アラーム(赤) 98 if inputVal0 > 2000 or inputVal1 > 2000:#on/offを判断する光量を変更(緑) 99 #print(inputVal0) 100 time1=time1+1 101 print('稼働中') 102 print(now.strftime('%H:%M')) 103 if time1==1: 104 plot_operation(fig, ax) 105 time1=0 106 107 else: 108 print('停止') 109 print(now.strftime('%H:%M')) 110 111 elapsed_time=time.time()-start #(処理時間)=(処理が終わった時間)ー(処理を始めた時間) 112 a=dissolution - elapsed_time 113 sleep(1) 114 start=time.time() 115 116 except FileNotFoundError: 117 continue 118 finally: 119 sleep(1) 120 121 122 123 124 125
読み取っているエクセルデータ
20:25 1 0
20:26 1 0
20:27 1 0
20:28 1 0
20:29 1 0
20:30 1 0
20:31 1 0
20:32 1 0
20:33 1 0
20:34 1 0
20:35 1 0
20:36 1 0
20:37 1 0
20:38 1 0
20:39 1 0
20:41 1 0
20:42 1 0
20:43 1 0
20:44 1 0
20:45 1 0
20:46 1 0
20:47 1 0
20:48 1 0
20:49 1 0
20:50 1 0
20:51 1 0
20:52 1 0
20:53 1 0
20:54 1 0
20:55 1 0
20:56 1 0
20:57 1 0
20:58 1 0
20:59 1 0
21:00 1 0
21:01 1 0
21:02 1 0
21:03 1 0
21:04 1 0
21:05 1 0
21:06 1 0
21:07 1 0
21:08 1 0
21:09 1 0
21:10 1 0
21:11 1 0
21:12 1 0
21:13 1 0
21:14 1 0
21:15 1 0
21:16 1 0
21:17 1 0
21:18 1 0
21:19 1 0
21:20 1 0
21:21 1 0
21:22 1 0
21:23 1 0
21:24 1 0
21:25 1 0
21:26 1 0
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。