2020.06.11
Raspberry Piで作ったDIY低温調理機にSSD1306制御のI2C接続OLEDミニモニタを付けてツマでも使えるようにする。
我が家では0.8%食塩で24時間以上付け込まれたムネ肉を61℃×2時間で低温調理して作る鶏ハムが週500gペースで消費され続けていて製造が大変です。
市販の低温調理機買う金の無い貧乏人なので調理はRaspberry Piで作ったDIY装置です。
しかしこの装置、ディスプレイもボタンも無く、PCからSSH接続して実行、進捗もPCからしか見れないため、鶏ハム製造は俺の仕事になってます。この装置をツマにも使えるようにしたいと考え改造を進めています。総予算3000円、Raspberry Pi利用2つのAC電源をWiFi経由でON/OFF出来る装置製作完成(その3) /usePocket.com別館 Raspberry Piで厳密温度管理して鶏ハム作ったら、ものすごく柔らかで美味いのが出来た! /usePocket.com 4 users
の2つがやることです。今回は2つ目のモニター設置
色々調べて購入したのは下記のI2C接続OLEDモニターです。SSD1306というチップで制御されているなら他の製品でもOKっぽい。760円です。
↓現状の表示。現在の温度、スタートしてからの合計時間、目的温度に達してからの時間。もう少し表示をエレガントにしたい。残念ながら現状ではこの表示は1分に一度しか更新されません。
モニターの動作に必要なソフトのインストール
↓本体はI2C接続で4本の線でRaspberry Piと結びます。詳細は省略します。別の記事を見てください。
なお古いRaspberry PiのOSではどうやってもインストール出来なかったので最新のOSイメージから始めるのをオススメです。
(1)i2c-toolsをインストール
sudo apt-get install i2c-tools
これをすると
i2cdetect 1
と入力するとアドレス3cにモジュールを発見出来ます。
(2)Python3のsetuptoolsをインストール
sudo apt-get install python3-dev
sudo apt-get install python3-setuptools
(3)gitのインストール
sudo apt-get install git
(4)SSD1306の制御モジュールをインストール
git clone https://github.com/adafruit/Adafruit_Python_SSD1306.git
cd Adafruit_Python_SSD1306
sudo python3 setup.py install
(5)足りないモジュールを色々とインストール
sudo apt-get -y install python3-pip
pip3 install Adafruit_GPIO
sudo apt-get install libopenjp2-7
sudo apt-get install libtiff5-dev
pip3 install pillow
※不要なものもあるかも
(6)制御スクリプト&デモスクリプト1
git clone https://github.com/adafruit/Adafruit_CircuitPython_SSD1306.git
スクリプト内のディスプレイ解像度を128x64に変更する必要あり。
I2Cのアドレスも変更する必要あるかも。
(7)制御スクリプト&デモスクリプト2
git clone https://github.com/adafruit/Adafruit_Python_SSD1306.git
(8)その他参考にしたサイト
Raspberry Pi 3によるOLEDディスプレイ への表示 | TomoSoft - Raspberry Pi 4 で小さなSSD1306 OLEDディスプレーに文字を表示させてみた | Developers.IO 20 users2イイネ
- RaspberryPi(Raspbian)にpipをインストール - turtlechanのブログ
- python3系でのPython Image Libraryの使用方法 - Qiita 4 users1イイネ
- Raspberry Pi 4 で小さなSSD1306 OLEDディスプレーに文字を表示させてみた | Developers.IO 20 users2イイネ
ModuleNotFoundError: No module named 'Adafruit_GPIO'
とか
ModuleNotFoundError: No module named 'PIL'
とか
raceback (most recent call last):
File "stats.py", line 26, in
from PIL import Image
File "/home/pi/.local/lib/python3.7/site-packages/PIL/Image.py", line 93, in
from . import _imaging as core
ImportError: libopenjp2.so.7: cannot open shared object file: No such file or directory
とか
Traceback (most recent call last):
File "ssd1306_pillow_demo.py", line 12, in
from PIL import Image, ImageDraw, ImageFont
File "/home/pi/.local/lib/python3.7/site-packages/PIL/Image.py", line 93, in
from . import _imaging as core
ImportError: libopenjp2.so.7: cannot open shared object file: No such file or directory
とか
Traceback (most recent call last):
File "stats.py", line 26, in
from PIL import Image
File "/home/pi/.local/lib/python3.7/site-packages/PIL/Image.py", line 93, in
from . import _imaging as core
ImportError: libtiff.so.5: cannot open shared object file: No such file or directory
とかエラーが出る。
現在の低温調理スクリプトこれを&を付けて実行するとSSHを切っても実行され続ける。以前との違いは現在の温度などの情報を「currentdata.txt」に書き込む。維持時間と温度は最後の行で指定している。この設定もRaspberry Pi本体のみで変更出来るようにいずれはしたい。
import RPi.GPIO as GPIO
import time
import re
import subprocess
from datetime import datetime
import atexit
def end():
GPIO.cleanup()
def low():
GPIO.output(17,GPIO.LOW)
GPIO.output(27,GPIO.LOW)
def tempkeep(set,keep):
reach=0
start=0
while (keep>0):
resulttext= subprocess.check_output(["cat","/sys/bus/w1/devices/28-800000269b1a/w1_slave"])
temp=re.search('(?<=t=)(\d+)',resulttext)
temp=float(temp.group(1))/1000
if (tempGPIO.output(17,GPIO.HIGH)
if (temp>=set):
reach+=1
GPIO.output(17,GPIO.LOW)
time.sleep(5)
start+=5
if reach>1: keep-=5
print str(reach)+":start="+str(float(start/6)/10)+":keep="+str(float(keep/6)/10)+":temp="+str(temp)
f.write(datetime.now().strftime("%H,%M,%S")+","+str(start)+","+str(temp)+"\n")
#
f2=open('currentdata.txt',"w")
f2.write("current temp,"+str(temp)+"\n")
f2.write("total time,"+str(float(start/6)/10)+"\n")
f2.write("left time,"+str(float(keep/6)/10)+"\n")
f2.close
atexit.register(end)
GPIO.setmode(GPIO.BCM)
GPIO.setup(17,GPIO.OUT)
GPIO.setup(27,GPIO.OUT)
f=open(datetime.now().strftime("%Y%m%d%H%M%S")+'data.txt',"w")
GPIO.output(27,GPIO.HIGH)
GPIO.output(17,GPIO.LOW)
print "start fan, pose 10 sec"
print "initialize sensor"
resulttext= subprocess.check_output(["cat","/sys/bus/w1/devices/28-800000269b1a/w1_slave"])
temp=re.search('(?<=t=)(\d+)',resulttext)
temp=float(temp.group(1))/1000
print "temp:"+str(temp)
time.sleep(10)
tempkeep(61,3600*2)
exit
OLEDディスプレイ表示部分。下記をcrontab -eで1分おきに繰り返し実行している。エレガントな方法じゃないなー。調理スクリプトが出力した「currentdata.txt」を読み込んで表示しているだけ。
import board
import digitalio
from PIL import Image, ImageDraw, ImageFont
import adafruit_ssd1306
# Define the Reset Pin
oled_reset = digitalio.DigitalInOut(board.D4)
WIDTH = 128
HEIGHT = 64
BORDER = 5
# Use for I2C.
i2c = board.I2C()
oled = adafruit_ssd1306.SSD1306_I2C(WIDTH, HEIGHT, i2c, addr=0x3C, reset=oled_reset)
# Clear display.
oled.fill(0)
oled.show()
# Create blank image for drawing.
# Make sure to create image with mode '1' for 1-bit color.
image = Image.new("1", (oled.width, oled.height))
# Get drawing object to draw on image.
draw = ImageDraw.Draw(image)
# Draw a white background
draw.rectangle((0, 0, oled.width, oled.height), outline=255, fill=255)
# Draw a smaller inner rectangle
draw.rectangle(
(BORDER, BORDER, oled.width - BORDER - 1, oled.height - BORDER - 1),
outline=0,
fill=0,
)
# Load default font.
font = ImageFont.load_default()
# Draw Some Text
f=open('currentdata.txt')
text=f.readlines()
f.close()
datas={}
for textline in text:
textparts=textline.split(',')
datas[textparts[0]]=textparts[1]
#text = "Hello World3"
#text='Current Temp:'+datas['current temp']
#(font_width, font_height) = font.getsize(text)
draw.text((5, 5),'Current Temp:'+datas['current temp'],font=font,fill=255,)
draw.text((5, 15),'Total Time:'+datas['total time'],font=font,fill=255,)
draw.text((5, 25),'Left Time:'+datas['left time'],font=font,fill=255,)
# Display image
oled.image(image)
oled.show()
このOLEDディスプレイって128x64の画像を作って書き込んでいる感じ。このスクリプトは制御&デモスクリプト(1)のHellow Worldをちょっと変えただけです。
縦の解像度が半分で同じSSD1306チップのディスプレイも。同じように動くかな?
あ、こちら128x64で1.3インチと少し大きい。
他に似たようなフルカラーディスプレイあるけど制御チップはSSD1331とちょっと違うっぽい。
Category:#電子工作 Raspberry Pi、Arduinoなど
■ ■ ■ コメント ■ ■ ■
いいっすね!=36
001 [06.11 15:27]y@Iij:M5Stackで作ったらどうか。 ↑(9)
002 [06.11 22:21]ふぇちゅいんさんふぁん(ゆるりゆラリー)★81:web UIにしてスマホから監視・操作できるのが今風じゃない? ↑(8)
003 [06.12 09:03]ふぇちゅいん(管理人) TW★75:う?ん、確かに。 ↑(4)
004 [06.12 22:20]ロード乗り@Nuro:Node-REDとか経由すればブラウザとかアレクサで操作できそうですが鍋に材料入れてから操作するのだから物理ボタンで十分な気が ↑(5)
005 [06.13 10:02]ふぇちゅいんさんふぁん(ゆるりゆラリー)★81:うちのヨーグルトメーカーみたら4ボタンしかなかったわ。これで十分なのか。「UP」「DOWN」「MODE」「ON/OFF」 ↑(3)
本カテゴリーで直近コメントが書かれた記事
→カテゴリー:#電子工作 Raspberry Pi、Arduinoなど(記事数:232)
本カテゴリーの最近の記事(コメント数)