‪ラズパイと温度センサ(LM75B)で室温の推移をグラフ化する‬

結果

一分ごとに日時と室温をcsvにpushして、matplotlibでグラフ化する

環境

  • RaspberryPi 3B+ (Raspbian)
  • 温度センサモジュール(LM75B)
  • 配線はブレッドボード
  • 制御はPython3

以前アナログ温度センサーを買ったのですが、ラズパイではアナログ入力は対応しておらず、今回i2c対応の温度センサーを調達しました。

i2c有効化

設定を開いて、Interfacing optionのI2Cを有効化

raspi-config

i2c-toolsをインストール

sudo apt-get install -y i2c-tools

配線

温度センサ(LM75B)とピンヘッダをはんだ付けして、ブレッドボードにぶっ刺す。

接続は
VCC – PIN1(3.3V)
SDA – PIN3(SDA)
SCL – PIN5(SCL)
GND – PIN9(GND)

大体こんなかんじ。繋がればよし。

認識されたか確認する

i2cdetect -y 1

48に認識されたデバイスがあるはず。これが温度センサーです。認識されてなかったら設定やはんだの接触をチェックしてみてください。

     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- 48 -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 

プログラム

temp_input.py

1分ごとにtemp_data.csvに日時と温度を書き込みます。sleep60秒なので厳密には1分ごとではない(60秒+ループ一周の実行時間)です。Ctrl+zで終了できます。

import csv
import datetime as dt
import smbus
import time

while True:
    now = dt.datetime.now()

    now_date = "{0:%Y-%m-%d}".format(now)
    now_time = "{0:%H:%M}".format(now)

    # 取得
    i2c = smbus.SMBus(1)
    block = i2c.read_i2c_block_data(0x48, 0x00, 2)

    # 入力をもとに温度計算
    val = (block[0] << 8) | block[1]
    if(val >= 0x7fff):
        val = val - 0xffff
    now_temp = ((val >> 5) * 0.125)

    # CSV書き込み
    f = open("./temp_data.csv", "a")
    temp_write = csv.writer(f, lineterminator = "\n")
    temp_write.writerow([now_date, now_time, now_temp])

    f.close()
    time.sleep(60)

temp_plot.py

実行するたびにtemp_data.csvからデータを取得し、最大で過去120分の温度推移をプロットしてくれます。

# -*- coding: utf-8 -*-
import csv
import matplotlib.pyplot as plt

f = open("temp_data.csv", "r")
temp_data = csv.reader(f)

temp_x = list(range(-119, 1, 1))
temp_y = []

for row in temp_data:
    temp_y.append(float(row[2]))

temp_y = temp_y[-120:]
temp_x = temp_x[-len(temp_y):]

plt.title("Room temperature")

plt.xlabel("ago(minutes)")
plt.ylabel("temperature(C)")

plt.plot(temp_x, temp_y)
plt.show()

temp_data.csv

溜まっていく温度データ

2019-03-27,19:42,27.25
2019-03-27,19:43,27.125
2019-03-27,19:44,27.25
2019-03-27,19:45,27.125
2019-03-27,19:46,27.0
2019-03-27,19:47,27.0
2019-03-27,19:48,27.0
2019-03-27,19:49,27.0
2019-03-27,19:50,26.875
The present writer kazz.

関連記事

+ブラウザで動くオンライン対戦リバーシ作ってみた
+LINEBOTで画像文字起こしと有害検出
+Markdownで講義ノートを書くためのノート
+PHPで簡易LINEBotを作ってみた
+LINEBOTを楽に実装できるPHPライブラリ作った