Vol.751 3.Aug.2018

Matplotlibを使ってグラフ表示 ラズパイ(14)〜ワンワイヤー温度センサ ラズパイゼロを無線LANルータ化

M ラズパイでMatplotlibを使ってグラフ表示

by fjk

ラズパイで測定したデータなどをグラフ表示したい時に便利なのが「matplotlib」である。本来、このpythonライブラリは科学技術計算用だが、2次元グラフのプロットが出来る。

1.インストール
sudo apt-get install python-matplotlib
2./home/piの下に(例えば)Graphディレクトリを作り、ここにデータを保存
@インポートとインスタンス生成
  import matplotlib.pyplot as plt
Asubplotsでグラフのインスタンス取得
  fig, ax1 = plt.subplots(nrow,ncol, sharex = True, sharrey = True, option)
  (figsizeオプションはグラフのサイズ)
Btwinxで2つめのインスタンス取得
  ax2 = ax1.twinx()
Cプロットの実行
  ax1.plot(x, y1, 'r')
  ax2.plot(x, y2, 'b')
Dタイトルやラベルを設定
  ax1.set_xlabel('Time')
Eグラフの表示
  fig.show()
Fグラフをファイルとして保存
  fig.savefig('filename')

testgraph.py  
#!/usr/bin/python
#-*- coding:utf-8 -*-
import matplotlib.pyplot as plt
import time
logpath  = '/home/pi/Graph/'
logfile   = 'logdate.log'
graphfile = 'graph.jpg'

#******* グラフを生成する関数 ***********
def makeGraph():
    x  = [1, 2, 3, 4]
    y1 = [5.5, 6.2, 9.6, 10.5]
    y2 = [4, 5, 6, 7]
    fig, ax1 = plt.subplots(1,1, sharex=True, figsize=(6, 4))
    ax2 = ax1.twinx()
  #グラフ描画
    ax1.plot(x, y1, 'r')    #color=red
    ax2.plot(x, y2, 'b')    #color=blue
  #ラベル類表示   
    ax1.set_xlabel('Time')
    ax1.set_ylabel('Data1', color='r')
    ax2.set_ylabel('Data2', color='b')
    ax1.set_title('Two Data View')
    fig.savefig(logpath+graphfile)
    fig.show()

#********** メイン関数 *******
def main():
    makeGraph()
    time.sleep(5)

#******* 起動 *****
if __name__ == '__main__':
    main()
 

testgraph.pyの実行例


R ラズベリーパイ(15) 〜温度の測定(ワンワイヤー接続)〜

by fjk

1.1-wireを使えるようにする
・メニュー/設定・Raspberrypi設定/インターフェースで1-wireのチェックを「On」にする。
・ワンワイヤーに使いたいピン番号を(例えばgpio23)/boot/config.txtの最後の1行に追加する(gpiopn指定が無いとgpio4となる)
   dtoverlay = w1-gpio, gpiopin = 23
・念のために再起動(sudo reboot)する
2.DS18B20を使って温度データを取得する
/sys/bus/w1/devices/の下に28で始まる28-xxxxxフォルダが出来ている。さらにこのフォルダの中のw1_slaveファイルを読み込むと温度データが得られる。得られたデータの最後の t=xxxxx が1000倍された温度データで、読み込む都度に更新される

ワンワイヤー温度測定の確認 DS18B20温度センサ
(プルアップ抵抗値は4.7kΩ)

w1therm.py 
import glob, time
 
base_dir = '/sys/bus/w1/devices/'
device_folder = glob.glob(base_dir + '28*')[0]
device_file = device_folder + '/w1_slave'
 
def read_temp_raw():
    f = open(device_file, 'r')
    lines = f.readlines()
    f.close()
    return lines
 
def read_temp():
    lines = read_temp_raw()
    while lines[0].strip()[-3:] != 'YES':
        time.sleep(0.2)
        lines = read_temp_raw()
    equals_pos = lines[1].find('t=')
    if equals_pos != -1:
        temp_string = lines[1][equals_pos+2:]
        temp_c = float(temp_string) / 1000.0
        return temp_c
	
try:
    while True:
        print('temp=%2.1f' % read_temp())
        time.sleep(1)
except KeyboardInterrupt:
    pass
配線図






w1therm.pyの実行例

●温度データCSVファイル作成しグラフ表示
温度データのCSVファイル作成にはdatetimeとcsv、グラフ化にはcsvとmatplotlibモジュールを利用した。ファイルのオープンにはwith文を用い、close文を省略した。また、温度の測定間隔はsleep文を利用したのでアバウト(今後の課題)。
@CSVファイルの作成
時刻を文字列に変換しCSVデータに
  now = datetime.now()
  time = now.strftime(dtFormat)
csvオブジェクトを使って書込
  writer=csv.writer(f)
  writer.writerow(row)
Aプロットデータの変換
時刻を文字列に変換し、appendメソッドで各データ配列を作成
  trstime = dt.strptime(row[0], dtFormat)
  time.append(trstime)
  temp.append(float(row[1]))
X軸の表示書式を指定
  myFmt = DateFormatter("%H:%M")
  ax.xaxis.set_major_formatter(myFmt)
  fig.autofmt_xdate()

tmp18b20.py>(CSVファイルを作成) tmpplot.py>(CSVファイルをプロット)
from datetime import datetime
from time import sleep
import csv
import glob

base_dir = '/sys/bus/w1/devices/'
device_folder = glob.glob(base_dir + '28*')[0]
device_file = device_folder + '/w1_slave'
dtFormat =  '%Y-%m-%d %H:%M:%S'

def read_temp_raw():
  with open(device_file, 'r') as tf
    lines = tf.readlines()
  return lines
 
def read_temp():
  lines = read_temp_raw()
  while lines[0].strip()[-3:] != 'YES':
    time.sleep(0.2)
    lines = read_temp_raw()
  temp_pos = lines[1].find('t=')
  if temp_pos != -1:
    temp_string = lines[1][temp_pos+2:]
    temp_c = float(temp_string) / 1000.0
    return "%2.1f" % (temp_c)

#main
print('save tempdata.csv start')
try:
  while True:
    with open('tempdata.csv','a') as f:
      now = datetime.now()
      time = now.strftime(dtFormat)
      tcel = read_temp()
      row = [time, tcel]
      writer=csv.writer(f)
      writer.writerow(row)
    print(row)
    sleep(60)

except KeyboardInterrupt:
  print("end")
  pass
 
import csv
from datetime import datetime as dt
import matplotlib.pyplot as plt
from matplotlib.dates import DateFormatter

dtFormat =  '%Y-%m-%d %H:%M:%S'
time=[]
temp=[]

with open('tempdata.csv','r') as f:
  rd = csv.reader(f)
  for row in rd:
    print(row)
    trstime = dt.strptime(row[0], dtFormat)
    time.append(trstime)
    temp.append(float(row[1]))

fig, ax = plt.subplots()
ax.plot(time, temp, color="red")
plt.title("Termperatur Plot Test")
plt.xlabel('time')
plt.ylabel('tmp(c)'))

myFmt = DateFormatter("%H:%M")
ax.xaxis.set_major_formatter(myFmt)
fig.autofmt_xdate()
plt.show()
 

グラフ表示例
(標準画面にデータリストも表示)


R RaspberryPi-ZERO(2) 〜無線LANルータ化〜

by fjk

【有線LANの接続】
 ラズパイZEROのwifiをAP化するとインターネットに接続できなくなるため、まず、ラズパイZeroで有線LANが使えるように、USB-LANアダプター(LUA3-U2-ATX、バッファロー)を接続したところ、別途ドライバーソフトが不要で、ネットに接続し、SSHも問題なく使えた。
 次に、abc744abc746を参考にWiFiサーバーとルータ設定を行ったところ、wifiでAP接続が使えるようになった。ところが、eth0に接続できない。”ifconfigで”で確認すると、DHCPアドレスが取得できていない。そこで、”/etc/network/interface”ファイルの一部を”dhcp”に変更すると、ネットに接続することが出来た。
  #iface eth0 inet manual
  iface eth0 inet dhcp

【webサーバー、PHPのインストール】
webサーバーとしてnginxをインストールする。abc747ではphp5をインストールしたが、ここでは2018.6現在で最新のphp7をインストールした。
  sudo apt-get install nginx php7.0 php7.0-fpm
インストール後、次のファイルの一部を変更(abc741参照)、
  (/etc/nginx.sites-available/defaultと/etc/php/7.0/fpm/php.ini)
以下を実行すると、nginxとphpが使える状態になった
  sudo service php7.0-fpm restart

ifconfig(eth0、wlano共正常動作) phpinfoの出力例(php7.0)
test.phpの実行画面(有線LAN接続) 有線LANアダプタ(左下)とラズパイZERO


Matplotlibを使ってグラフ表示 ラズパイ(14)〜ワンワイヤー温度センサ ラズパイゼロを無線LANルータ化