はじめに
初投稿失礼します。
ラズパイとTwitterを活用してカイワレ大根の生長度合いを記録しツイートできるようにしました。
記録内容はカイワレ大根の写真とカイワレ大根の長さ(折れ線グラフ化する)です。
また、元々は植物を自動で育てるロボットの製作を目標としていたため、そのための機能(スイッチを押すことによるLEDの切り替え、水やり通知システム)についても記述します。
Twitter APIが有料化すると聞き、せっかくやったことを記念に残しておきたいと思って書きました。2年くらい前に行ったものを今更備忘録として記録しているため当時と変わっているところや適当な記述がある場合があります。よければ適宜調べてください。すみません。
時間があるときに追記するかもしれません。
準備物
必要なもの:Raspberry Pi(ラズパイ)、ラズパイ用カメラ、超音波センサ、(LED赤・青、モータ、各種抵抗)
使用言語:Python(ラズパイには標準搭載されているので特にダウンロード等いりません)
Twitter投稿ができるようにする準備
Twitter APIの取得
忘れたけど面倒だった記憶しかないです。恐らく有料化してもう使えなくなっていると思うのでこの記事でのTwitterを使う部分はもうできないのではないかと思います。記録用なので前はそういうことも出来たんだな〜と思って読んでください。リンクお借りします。
下のようなauth.pyというファイルを作ってそこに各自取得したキーやトークンを張り付けておきます。
consumer_key = ''
consumer_secret = ''
access_token = ''
access_token_secret = ''
ターミナルでTwythonをインストールしておきます。
$ pip install twython
ラズパイ用カメラによる写真撮影
ラズパイ用カメラを接続し、撮影した写真をTwitterに投稿するプログラムです。
import picamera
import time
import datetime
import os
from twython import Twython
from auth import(
consumer_key,
consumer_secret,
access_token,
access_token_secret)
twitter=Twython(consumer_key,
consumer_secret,
access_token,
access_token_secret)
camera=picamera.PiCamera()
now=datetime.datetime.now()
name='/home/pi/Plant_Pictures/' #事前にラズパイの中にフォルダ(ここではPlant_Pictures)を作ってそこに写真を保存すると良い
files=os.listdir(name)
file_name=str(len(files)).zfill(4) #何枚目の写真なのか分かりやすく
date_name=now.strftime('%Y%m%d%H%M') #撮影日時をファイル名に入れる
camera.start_preview() #カメラ部分
time.sleep(10)
name1=name+file_name+"__"+date_name+".jpg" #例えば「0003__202302062250.jpg」のようになる
camera.capture(name1)
camera.stop_preview()
message="This is a picture of my plant! 今育てている植物の様子です! " #ツイート部分
image=open(name1,'rb')
response=twitter.upload_media(media=image)
media_id=[response['media_id']]
twitter.update_status(status=message,media_ids=media_id)
print("Tweeted: "+message)
超音波センサによる植物の長さ計測
超音波センサを使って植物の葉との距離を測り、超音波センサと地面の距離から引くことで、植物のおおよその長さが計測できます。誤差はあります。計測結果をツイートします。計測結果と時刻をcsvファイルに保存します。
import RPi.GPIO as GPIO
import os
import time
import datetime
import smbus
from twython import Twython #この辺り上と被ってる
from auth import(
consumer_key,
consumer_secret,
access_token,
access_token_secret)
twitter=Twython(consumer_key,
consumer_secret,
access_token,
access_token_secret)
filename='/home/pi/distance/distance.csv' #事前にフォルダとcsvファイルを作る
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
TRIG=20 #超音波センサを使うピン番号
ECHO=21
C=343 #音速
GPIO.setup(TRIG,GPIO.OUT)
GPIO.setup(ECHO,GPIO.IN)
GPIO.output(TRIG,0)
time.sleep(0.3)
if not os.path.exists(filename):
thData=open(filename,'w')
thData.write('date_time,dist\n')
thData.close()
def main():
def readDistance(): #超音波センサを使う部分
GPIO.output(TRIG,1)
time.sleep(0.00001)
GPIO.output(TRIG,0)
while GPIO.input(ECHO)==0:
signaloff=time.time()
while GPIO.input(ECHO)==1:
signalon=time.time()
t=signalon-signaloff
distance=t*C*100/2
return distance
dist=readDistance()
dist1=55-dist #55cmは植物の情報に設置した超音波センサから植物が生えている植木鉢の地面までの距離でした。各自変更してください
time.sleep(0.5)
if(-5<dist1<30): #よく誤作動するので有り得ない値を取るときは記録しない。本当は負の値も取ったらまずい。
print("make a glaph!")
now=str(datetime.datetime.now())[0:16] #時刻を取得してデータをファイルに保存
data=[now,round(dist1,2)]
thData=open(filename,'a')
thData.write(','.join(map(str,data))+'\n')
thData.close()
dist_str=str(round(dist1,2))
print(dist_str+” cm”)
message="Distance is "+dist_str+” cm” #ツイートする
twitter.update_status(status=message)
print("Tweeted: "+message)
def cleanup(): #正直理解してない。エラーが出たらこれ書いとけ系のページに書いてあること書いただけ。
print("cleanup")
GPIO.cleanup()
if __name__ == '__main__':
try:
main()
except KeyboardInterrupt:
pass
このような仕組みで超音波センサにより植物の長さを計測しています。
続いてcsvファイルに記録した植物の長さの値について折れ線グラフを書くプログラムです。
import pandas as pd
import matplotlib.pyplot as plt
data=pd.read_csv('new_Distance.csv',index_col='date_time')
data.plot()
plt.show()
例えばこのようなグラフが描かれます。残念ながら誤差が大きいですが、概ね右上がりになっていて植物の長さがだんだん伸びているとわかります。
参考文献
電気設計人.com 【ラズパイ電子工作】超音波センサで距離を読み取る方法(HC-SR04)
https://denkisekkeijin.com/raspberrypi/pi-ultrasound/
そうだ!研究しよう ラズベリーパイで自動で写真を撮りそのまま画像付きツイートをする
https://kenyu-life.com/2018/09/18/raspberrypi_tweet_picture/
DEVICE PLUS ラズパイその他工作 ラズパイでスマートホームを実現しよう!第4回:カメラをつけて,お部屋のチェックなど便利に使おう! https://deviceplus.jp/hobby/entry_y19/
書籍
ゼロからよくわかる!ラズベリー・パイで電子工作入門ガイド(2019) タトラエディット