Raspberry Piでトマトの定期監視

# やること
娘が幼稚園から持ち帰ってきたトマトの成長を自動的に記録します。
具体的には、Raspberry Piで10分ごとにトマトを撮影し、LINE BOTとして撮影した画像を投稿します。

これでいつでもどこでもLINEからトマトの成長を観察でき、振り返ることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113494/f52ef63d-d695-e8d6-7c41-77342dbeaa4c.png)

画像はイメージです。

# セットアップ

## 用意するもの

* Raspberry Pi 4B
* [カメラモジュールV2](https://www.amazon.co.jp/Raspberry-Pi-%E3%82%AB%E3%83%A1%E3%83%A9%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%80%90Raspberry-Camera-V2%E3%80%91/dp/B01F1SWTZE)
* SDカード
* USBケーブル タイプC
* 百均で買ったアクリルケース(任意)
* 百均で買ったタブレット立て(任意)

アクリルケースはラズパイを持ち運びやすくするのと、カメラモジュールをセロハンテープで貼り付けるために使いました。
タブレット立ては上下の角度を調整するために使いました。

![C91B9A8A-8A4A-419C-A76C-6BCD0276B6E0.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113494/1e862c85-af03-90e6-3545-bdd048583cc5.jpeg)



## OS
無難にRasbianOSをRasberry Pi Imagerでインストールしました。


## カメラ

1. `sudo raspi-config`でカメラを有効化
1. /boot/config.txtにモジュールを追記

```/boot/config.txt
dtoverlay=im219
```

3. reboot
3. `libcamera-hello`で確認

参考: [ラズパイ新OS「Bullseye」でのカメラモジュールの使い方｜libcameraの使い方も詳しく解説](https://hellobreak.net/raspberry-pi-bullseye-libcamera/#%E6%96%B0OS%E3%80%8CBullseys%E3%80%8D%E3%81%AB%E6%A8%99%E6%BA%96%E6%90%AD%E8%BC%89%E3%80%8Clibcamera%E3%80%8D)

:::note warn
大事なことは **`libcamera`を使うこと。`raspi-steel`ではない。**
よく参考書とかWebに載っているのは`raspi-steel`。しかし、今は`libcamera`に置き換わったようです。2021年頃から？


[-bash: raspistill: command not found [closed]](https://stackoverflow.com/questions/69907904/bash-raspistill-command-not-found)
:::


# プログラムの内容

## 写真を撮影する

```sh:take-picture.sh
#!/bin/sh
# 撮影してファイルパスを出力
# libcameraの出力は/dev/nullへ捨てる
DATE=$(date '+%Y%m%d_%H%M%S')
FILENAME=/home/u1and0/Pictures/${DATE}.jpg
# FILENAME="/home/u1and0/Pictures/test.jpg"

# タイムラプスを撮影
# 30秒間に渡って3秒ごとに撮影
# libcamera-still --width 1280 --height 960 -t 30000 --timelapse 3000 -o /home/u1and0/Pictures/${DATE}%02d.jpg

libcamera-still --vflip --width 1280 --height 960 -o ${FILENAME} 2> /dev/null &&\
    echo ${FILENAME}
```

* --vflipで上下反転させます。（カメラモジュールの都合でアクリルケースに逆さまにしか貼り付けられなかったので。）
* --width, --heightで解像度を調整します。デフォルトだと1MB超えの写真で、無駄にでかいので。
* `2> /dev/null`で`libcamera-still`の出力を捨てます。
* 撮影に成功したらファイルパスを出力します。


## LINEへ画像を投稿する

事前にLINEアクセストークンを取得します。
[Messaging APIの概要
](https://developers.line.biz/ja/docs/messaging-api/overview/)

```post-picture-line.sh
#!/bin/sh
# Usage
# ./post-picture-line.sh filepath

ACCESS_TOKEN="*******"
MSG="現在のトマトの様子をお届けします。"
PATH="$1"
URL="https://notify-api.line.me/api/notify"

# 何故かcurlでは`not found`が出てしまうので、curlのフルパス指定した
/usr/bin/curl -fsSL -X POST\
    -H "Authorization: Bearer ${ACCESS_TOKEN}"\
    -F "message=${MSG}"\
    -F "imageFile=@${PATH}"\
    ${URL}
```


ファイルパスの前の"@"は必須です。

参考: [Messaging APIリファレンス](https://developers.line.biz/ja/reference/messaging-api/)


## 組み合わせる

撮影して、LINEへ投稿するようにパイプで接続します。

```shell-session
$ take-picture.sh | xargs post-picture-line.sh
```

`take-picture.sh`で撮影したファイルのフルパスを出力します。
`xargs`で受け取り、`post-picture-line.sh`で画像ファイルをLINEへポストします。（`xargs`で一旦受け取ることが大事です。）


## cronへ登録する

`crontab -e`でエディタを開いて下記追記します。

```sh:crontab
*/10 4-19 * * *   /home/u1and0/Program/sh/take-picture.sh | xargs /home/u1and0/Program/sh/post-picture-line.sh
```

適宜プログラムを保存したパスに書き換えてください。
これで4時から19時50分までの間に10分ごとに撮影し、撮影のたびにLINEに画像を送信します。