「ラズパイ」と「スプレッドシート」で全自動水耕栽培器をつくって女の子にTwitterで実況しながら栽培してもらう:⑧各種機能編 ~写真をGoogleドライブにアップロードする~

きれいな体、残しておきたいですよね?

というわけで第八回目は植物の写真を撮ってGoogleDriveにアップロードする作業を行う。

 

画像をラズパイに保存する

この辺のことはわざわざ書かなくてもほかの記事でたくさん書かれているので割愛。

カメラモジュールは1700円くらいのラズパイ対応のやつを買えばいいと思うよ。

 

ラズパイからGoogleDriveに画像をアップする

この辺も記事はあるので、検索しながらやりかたを探してほしい。自分が参考にしたのはこの記事。ただし、cronを使って画像アップロード機能を実行する場合、Googleの認証に使う「credentials.json」が見つからないので(cronを実行する場合は絶対パスで指定しないと読み込んでくれないため)、少々設定をいじってやる必要がある。日本語での記事がなく解決に四苦八苦したのだが、なんとか対応できたのでQiitaに記事としてアップしておくことにする。

 

GIF画像も作成する。

野菜の成長過程をタイムラプスにしたいという思いからgif画像も作成してアップロードすることにする。gif作成には「Pillow」というライブラリを使って実装する。(参考にしたサイト

 

画像アップロードテスト

うまくいったみたいですな。

 

以下、ソースコード

main.py

import create_gif as cg
import take_picture as tp
import image_uploader as iu

take_pict   = "jpeg"
take_pictid = "フォルダーID"
take_pictdir = "指定のディレクトリ/save_image"

create_gif   = "gif"
create_gifid   = "フォルダーID"
create_gifdir = "指定のディレクトリ/save_gif"

tp.take_picture()
iu.image_uploader(take_pict,take_pictid,take_pictdir)
cg.create_gif()
iu.image_uploader(create_gif,create_gifid,create_gifdir)
print("allok")

take_picture.py

import time
import datetime
import picamera

def take_picture():
    with picamera.PiCamera() as camera:
     camera.resolution = (640, 480)
     camera.start_preview()
     dt_now  = datetime.datetime.now()
     saveimage =  '指定のディレクトリ/save_image/%s.jpg' % (dt_now)
     camera.capture(saveimage)

create_gif.py

from PIL import Image, ImageDraw
import os
import glob
import datetime
import shutil

def create_gif():
    runnum = 10

 #画像を保存しているディレクトリを指定
    flists = os.listdir('指定のディレクトリ/save_image')
    count = len(flists)  

 #画像が一定数以上ならgifを作成する
    if count >= runnum:
        dt_now  = datetime.datetime.now()
        files = sorted(glob.glob('指定のディレクトリ/save_image/*.jpg'))
        images = list(map(lambda file: Image.open(file), files))
        #gif画像を作成し、保存
        images[0].save('指定のディレクトリ' + str(dt_now) + '.gif', save_all=True, append_images=images[1:], duration=40, loop=0)
       #ディレクトリを削除、再び作成
        shutil.rmtree('指定のディレクトリ/save_image/')
        os.mkdir('指定のディレクトリ/save_image/')
        shutil.rmtree('指定のディレクトリ/save_gif/')
        os.mkdir('指定のディレクトリ/save_gif/')

image_uploader.py

from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
import os
SETTINGS = "指定のディレクトリ/settings.yaml"

def image_uploader(imagetype,folder_id,direct):
 #cronで実行する場合はsettings.yamlの引数に入れる
    gauth = GoogleAuth(SETTINGS)
    gauth.CommandLineAuth()
    drive = GoogleDrive(gauth)

    lists = os.listdir(direct)

    if len(lists) > 0:
        sortedlists = sorted(lists, reverse=True)
        
        image_name = sortedlists[0]
        image_path = direct + '/' + sortedlists[0]
        print(sortedlists[0])
        
        f = drive.CreateFile({
            'title': image_name,
            'mimeType': 'image/' + imagetype,
            "parents": [{"kind": "drive#fileLink","id": folder_id}]})

        f.SetContentFile(image_path)
        f.Upload()
    else:
        print("No images")

 

次回はツイッターで美少女がツイートできるように設定していくぞ!

前回:⑦各種機能編 ~植物の高さを計測する~ 

次回:⑨各種機能編 ~取得した情報をスプレッドシートにまとめる~