目 次
さて、今年もビール作りの時期がきましたが・・・・・
今年はビールのもととか軟水の水は確保したもののコロナウイルスのおかげで、
消毒液を作るエタノールやら精製水ががまったくないのであえなく断念しました。
消毒ができないとカビでビール酵母がおかしくなってしまうので、消毒は必須です。
そんな分けで今回は、温度管理に使おうと思って温めていたものを来年に向けてこしらえることにします。
Raspberry Piでポリタンクの温度を管理させて、温度によって暖房を入れたり、切ったりするものを作成します。
用意したもの
ラスベリーパイ
以下がメインのハードウェアで温度をコントロールする基板コンピュータです。
家にあった古いものを再利用しました。
Raspberry Pi 1 Model B 512MB
スペック
SoC: Broadcom BCM2835 (CPU, GPU and SDRAM)
CPU: 700 MHz ARM1176JZF-S core (ARM11 family)
GPU: Broadcom VideoCore IV, OpenGL ES 2.0, OpenVG 1080p30 H.264/MPEG-4 AVC High-Profile decoder
Memory (SDRAM): 512 Megabytes (MiB)
Video output: Composite RCA, HDMI
Audio output: 3.5 mm, HDMI
Mass storage: SD/MMC slot
USB: two USB2.0 ports
Network: 10/100 Ethernet RJ45
Power supply: 5V/700 mA (3.5 W) via microUSB
Dimensions: 85.6 mm x 53.98 mm
LM75B温度センサ(I2C接続)
NXP社製の温度センサLM75Bです。
電源電圧:2.8V〜5.5V
温度分解能:0.125℃
https://www.switch-science.com/catalog/1813/
本体:385円
LM75B とラズパイの接続
VCC <->3.3V(1)
SCL<->SDA(3)
SDA<->SCL(5)
GND<->GND(6)
3.3v 1 チャネルリレー
そのままラズパイの電力のみで実施したかったのですが、家にあった5Vリレー本体のみでは、駆動ができなかったので3.3Vで動作するリレーユニットを購入しました。
低レベルトリガ · リレーモジュールとフォトカプラ絶縁体
特徴
• 電源インジケータ (緑) 、リレーステータス表示灯 (赤)
• Smdフォトカプラ
• トリガ電流 5mA
• フォールトトレラント設計
本体:100円くらい
ドリンクウォーマ巻き付け型
ビールを温めるのに最適だと思ったのがUSBで給電するドリンクオォーマでした。
ただし、WEBを物色してみると温度が熱くなる強力な製品が多いようで、コースタータイプのものは手で触れられないと書き込みがあったので、火事にならないような適度な温度になるものが、このサンコーレアモノショップで購入した「ドリンクウォーマー(巻きつけ型)」です。
この製品は手で触れられないほど熱くならないので、ビールを温めるぐらいならこれで行けると思い、この製品に決めました。
スペック
サイズ:310×80×10 mm
重量:約50g
電源:USBバスパワー
インターフェース:USB1.1、2.0
ヒーター温度:約38℃
※環境により上下する場合があります。
巻き込み可能外径サイズ:最大約25cm
パッケージサイズ:96×43×165 mm / 約90g
本体:1400円くらい
USB延長ケーブル
100均とかで売っているものを切断して、途中にリレーをかませます。
USBケーブル切断
切断するとシールドに包まれたケーブルが出てきます。非常に細いので被膜を剥く時には注意が必要です。
接 続
ラズパイを使いPython言語でLM75Bの温度を計測して、指定した温度でドリンクウォーマのON/OFF制御を実施してビールを温めます。
ラズパイのピンアサイン
※画像はお借りしています。
Raspberry Piを設定する
いつものごとく、MicroSDにRasbianOSを入れて起動します。やり方についてはVolumioのページに記載してあります。
SSH接続をしたいのでローカルのコンソールから以下を実行
$ sudo raspi-config
コンソールに青い選択画面がでてくるので、「5 Interfacing Options」を選択する。
「P2 SSH」を<Select>選択して有効化します。
ついでにLM75B温度センサーはI2Cなので「P5 I2C」も<Select>で有効にします。
ターミナルからアップデート
このRaspberry Pi本体はGUIだと物凄く遅いので、WindowsからSSHで作業を行います。
お決まりのアップデートを最初にします。
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install -y i2c-tools <--LM75Bに必要
LM75Bの動作を確認する
コマンドを入れて数値が出てくれば認識されています。数値が無い場合は認識されていないのでi2cを有効化したり接続を確認してみましょう。
リレーの動作を確認する
「接 続」項目の通り接続したらリレーが正しく動作するか?を確認します。
下記コマンドでリレーが入り、リレーの緑色LEDが点灯します。
# gpio mode 7 out
リレーのON/OFFを確認します。
# gpio write 7 1 <–OFF
# gpio write 7 0 <–ON
Python
Pythonスクリプトについては、こちらを参考にしました。
https://qiita.com/7L4QOI/items/68d2c1dcd3a4ea6bd700
#!/usr/bin/python
#coding: utf-8
import smbus
import time
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(4,GPIO.OUT)
i2c = smbus.SMBus(1)
lm75b_address = 0x48
def get_Temperature():
block = i2c.read_i2c_block_data(lm75b_address, 0x00, 2)
val = block[0] << 8 #上位ビットをシフトしてセット
val = val | block[1] #下位ビットをORでセット
# val = 0xc920 #マイナス温度のテスト
# 以下プラス、マイナス判定をして温度を計算する
if(val >= 0x7fff):
val = val - 0xffff
result = ((val >>5) * 0.125)
return result
while True:
print("Temperature:%6.2f" % get_Temperature())
if(get_Temperature() > 30.0): #テストとして30.0度以上でOFF
GPIO.output(4,GPIO.HIGH)
else:
GPIO.output(4,GPIO.LOW)
time.sleep(5)
実行すると温度が5秒ごとに出力されます。
次に、データをプロットさせてCVSへ出力するように改造します。
合わせてプログラム実行時、ループ動作のため Ctrl + c を押すとブレイクできるのですが、以下のような警告がでてきます。
RuntimeWarning: This channel is already in use, continuing anyway. Use GPIO.set warnings(False) to disable warnings.
プログラミング実行後にGPIOを設定した後にGPIOをクリアしていないために発生するみたいなので、ブレイク時でもGPIOをクリアさせるために記述を追加し対処しました。
try:
except KeyboardInterrupt:
GPIO.cleanup()
ブレイクはCtrl+Zでも行けます。こっちの方が正しい終了の仕方かも知れません(汗
#!/usr/bin/python
#coding: utf-8
import smbus
import time
import RPi.GPIO as GPIO
import csv
import datetime as dt
GPIO.setmode(GPIO.BCM)
GPIO.setup(4,GPIO.OUT)
i2c = smbus.SMBus(1)
lm75b_address = 0x48
def get_Temperature():
block = i2c.read_i2c_block_data(lm75b_address, 0x00, 2)
val = block[0] << 8 #上位ビットをシフトしてセット
val = val | block[1] #下位ビットをORでセット
# val = 0xc920 #マイナス温度のテスト
# 以下プラス、マイナス判定をして温度を計算する
if(val >= 0x7fff):
val = val - 0xffff
result = ((val >>5) * 0.125)
return result
try:
while True:
now = dt.datetime.now()
now_date = "{0:%Y-%m-%d}".format(now)
now_time = "{0:%H:%M}".format(now)
print("Temperature:%6.2f" % get_Temperature())
#CSV
f = open("./temp_data.csv", "a")
temp_write = csv.writer(f, lineterminator = "\n")
temp_write.writerow([now_date, now_time, get_Temperature()])
f.close()
if(get_Temperature() > 30.0):
GPIO.output(4,GPIO.HIGH)
else:
GPIO.output(4,GPIO.LOW)
time.sleep(5)
except KeyboardInterrupt:
GPIO.cleanup()
実行すると、温度がでてきます。また、temp_data.csvに記録されるのでプロットデータに活用できます。
実際に、設置する際は sleepを60(60秒)として実施させるのがいいと思います。
プロットデータを表示する
ブロットさせるためのプログラムをインストールします。
pip install matplotlib ではエラーを吐くためラズパイはパッケージのインストールをオススメします。
お決まりのアップデートを最初にします。
sudo apt-get update
sudo apt-get install python-matplotlib
※Python3はpython3-matplotlib
下記を参考にしました。
https://kazzstorage.com/raspi-temp/
temp_plot.py
実行するたびにtemp_data.csvからデータを取得し、最大で過去120分の温度推移をプロットしてくれます。
#!/usr/bin/python
#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()