# M5Stickで養蜂センサーを作ってみる
こんにちは。decobisuと申します。
Farmtory-labでは養蜂をやろうと養蜂箱を作って屋上に置いたり美味しい蜂蜜酒の布教をしたりしています。

前回の技術書典6が開催された時には、待ち箱と呼ばれる箱を設置して野生のミツバチが入るのを期待していたのですが、今年はミツバチたちは入居せずな結果でした。残念!
運の要素もあるため、また来年に向けて色々試していこうと思ってます。ということで次は屋上の養蜂箱の環境情報を今時のお手軽な機器とセンサーで取得するというのをやっていこうと思います。
## 養蜂とは
そもそも養蜂とは「蜂蜜あるいは蜜蝋や花粉をとるためにミツバチを飼育することである。また、虫媒による、農作物の受粉を確実にするためにも使われる」(Wikipedia-養蜂より引用)と言われるようにミツバチを飼育することです。一般的に商業養蜂と呼ばれる場合は、大々的にミツバチの群れを管理し、蜂蜜の生産や店舗への卸しに加えて作物の受粉のために農家へのミツバチの貸し出しを行っています。Farmtory-labでは屋上でミツバチを育て、自分たちで蜂蜜の採集が出来たら最高!という感じでゆるくやっております。
## センサーで何を測るか
養蜂はペットというよりも、どちらかというと畜産です。もともとは野生種なので放っておいてもわりと強く生きていきますが、暑過ぎたり寒過ぎたりすると群れとして上手く機能できずに死んでしまったり巣箱から逃亡したりしてしまいます。巣の環境情報を計測することで、より良い育成環境の検討やミツバチにストレスなく巣内の状態の監視が可能です。群の個体数の維持や害虫・害獣、その他病気の予防など、群れにとって良い環境に持っていくことがミツバチの群れの安定に繋がります。
今回は(手元に転がっていた)温度・湿度センサーを使ってまずは手軽に巣箱の値を測定することを考えてみます。
- 温度・湿度の測定をしてどうするのか?
- 測定した温度を元に、巣内の温度を一定に保つ(幼虫を育てる育児層は33〜35℃程度にミツバチ自身が保っていると言われています)
- 夏場に温度が高すぎるなら風通しをよくする、冬場で低すぎるなら巣を断熱材で覆う、ヒーターで温めるなど(暑いと弱るし、寒いと死にます)
- 湿度が高すぎると巣箱内にカビが生えたりすると除去が必要
その他以下のような情報も計測できると色々出来そうです。
- 二酸化炭素→活動量とか見れるかも?
- 重量→巣の規模や蜜の貯蓄量など分かるとうれしい
- 音→周波数や羽音を解析すると行動が読める?
## 測定機器(M5Stick,DHT12)
測定に使う機器として、8月に東京ビッグサイトで開かれたMaker Faire Tokyo 2019(https://makezine.jp/event/mft2019/)の会場で手に入れた「M5StickC」という機器を使います。
- M5StickC
- WifiとBLEが使えるESP32マイコンを搭載したオープンソースのIoT開発ボードです。価格が2,000円程度と安く、小型でプロトタイプを作るには最適です。(M5Stackのミニサイズ版)
(https://docs.m5stack.com/#/en/core/m5stickc)
- DHT12(温湿度センサー)
- 温湿度センサーはM5Stackのプロトタイプキットに入っていたDHT12というセンサーにGroveモジュール付きのものを使います。(M5StickC ENV Hatという温湿度に加えて気圧と磁界も測れるやつが出てますが品薄で手に入らず)

## 手順
M5StickCの良いところは手軽にすぐ始められ、さらに単体で画面から動作確認が出来る所がとても良いです。
### 開発環境のセットアップ
今回はArduinoIDEを使いました。(環境はMacbookで実施しています)。M5StickCに書き込むように以下の準備をします。
1. ArduinoIDEを公式からダウンロードして端末にインストール
2. ESP32のボードマネージャーとM5StickCのライブラリをインストール
詳細は公式のM5StickCのクイックインストールの記載がきれいにまとまっています。Windows用の手順ですが、MacOSでも基本同じです。
・[M5StickC クイックスタート](https://docs.m5stack.com/#/ja/quick_start/m5stickc/m5stickc_quick_start_with_arduino_Windows)(https://docs.m5stack.com/#/ja/quick_start/m5stickc/m5stickc_quick_start_with_arduino_Windows)
### M5StickCにプログラムを書き込む
M5StickCを箱から出します(腕時計用のバンド等も入っているが一旦放置)。
M5StickCにはデフォルトでプログラムが入っているので、USB TypeCを接続して電源をいれたら画面にサンプルが表示されます。DHT12のセンサーはGroveポートに差し込むだけです。
次にArduinoIDEを開き、プログラムを書き込みます。
書き込み設定については、「ツール」タブで「ボード: "M5Stick-C"」を選択します。 シリアルポートはM5StickCを接続した場所によって変わります(私の環境ではMacbookのUSBポートに指したので以下のようになりました)。

「ファイル」タブ→「スケッチ例」→「M5StickC」→「UNIT」→「ENV」から温湿度センサー用のサンプルプログラム(M5StickC ENV Hat用)のスケッチがあるので、これを改変して以下のソースコードにしました。
```Arduino
#include <M5StickC.h>
#include "DHT12.h"
#include <Wire.h> //The DHT12 uses I2C comunication.
DHT12 dht12; //Preset scale CELSIUS and ID 0x5c.
void setup() {
M5.begin();
Wire.begin();
M5.Lcd.setRotation(3);
M5.Lcd.println("sensor test...");
}
void loop() {
float tmp = dht12.readTemperature();
float hum = dht12.readHumidity();
M5.Lcd.setCursor(0, 10);
M5.Lcd.setTextColor(WHITE, BLACK);
M5.Lcd.setTextSize(2);
M5.Lcd.printf("Temp: %2.1f \r\nHumi: %2.0f%%", tmp, hum);
delay(100);
}
```
コンパイルと書き込みは少し時間がかかります。書き込むとすぐ新しいプログラムが稼働します。下の画像のように画面表示ができました。温湿度センサーの値もちゃんと取得出来ていそうです。

## 測定値の可視化
次に測定した値をどこかに送り、ブラウザ等から見れるようにしましょう。以前の技術書典やFarmtory内でも使ってみた話をよく聞いたシンプルなデータ可視化サービスの「Ambient」を使ってみます。単純なデータ取得だけであればとても簡単なのでおすすめです。
Ambient – IoTデーター可視化サービス(https://ambidata.io/)
手順は簡単で、Ambient側の設定については
1. ユーザー登録
2. チャネルを作成
のみで大丈夫です。作成したチャネルに対してM5StickCからWifi経由でデータを送信することで、データの可視化が可能です。
AmbientのArduino用ライブラリが公開されているので、こちらをZipでダウンロードしてArduinoIDEから「スケッチ」→「ライブラリをインクルード」→「.ZIP形式のライブラリをインストール」でインストールします。
Ambientも公式にサンプルがあるので、それと先ほど作ったプログラムを元に、Ambientに送信する部分を追加したプログラムを作成します。
```Arduino
#include <M5StickC.h>
#include "DHT12.h"
#include <Wire.h> //The DHT12 uses I2C comunication.
#include <Ambient.h>
DHT12 dht12; //Preset scale CELSIUS and ID 0x5c.
WiFiClient client;
Ambient ambient;
const char* ssid = "xxxxxxx"; // Wifi SSID
const char* password = "xxxxxxxxx"; // Wifiパスワード
unsigned int channelId = 11111; // AmbientのチャネルIDを指定
unsigned int t=0;
const char* writeKey = "111111111111"; // 作成したチャネルのライトキーを指定
void setup() {
M5.begin();
Wire.begin();
M5.Lcd.setRotation(3);
M5.Lcd.setTextColor(WHITE, BLACK);
M5.Lcd.println("*Send tmp/hum to Ambient*");
WiFi.begin(ssid, password); // Wi-Fi APに接続
while (WiFi.status() != WL_CONNECTED) { // Wi-Fi AP接続待ち
delay(100);
}
M5.Lcd.println(WiFi.localIP());
ambient.begin(channelId, writeKey, &client); // チャネルIDとライトキーを指定してAmbientの初期化
}
void loop() {
float tmp,hum;
M5.Lcd.setCursor(0,0);
M5.Lcd.println("*Send tmp/hum to Ambient*");
M5.Lcd.println(WiFi.localIP());
tmp=dht12.readTemperature(); //
hum=dht12.readHumidity();
M5.Lcd.printf("Temp: %2.1f \r\nHumi: %2.0f%%\n", tmp, hum);
if(t==0){ // 60秒毎に値を送信
ambient.set(1,String(tmp).c_str());
ambient.set(2,String(hum).c_str());
ambient.send();
M5.Lcd.println("Data sended to Ambient");
M5.Lcd.printf("%d\n",t);
}else{
M5.Lcd.println(" ");
M5.Lcd.printf("%d\n",t);
}
if(t>60){
t=0;
}else{
t+=5;
}
delay(5000);
}
```
しばらく流してみて、Ambientのチャネルを見ると、データが送られていることが分かります。(値がぶれぶれの所はテスト中のためです)

後はモバイルバッテリー等で電源を確保しつつ、養蜂箱の中におけば温度と湿度の測定が出来るようになりました。

## 今後
以前はRaspberry pi等でセンサーを組んでみてましたが、M5Stickはとてもお手軽でほぼ繋ぐだけで色々データを取れるので楽しいです。
今後は外で使う機器になるので、防水などを検討するのと、色々センサーキットが沢山でているので、手に入れて試したいです(品薄ですが)。
(一緒に買ったM5StickVという画像認識もできるやつもあるので、何か使って遊べたらなぁと思ってます)
また巣箱自体の改良や、実際に監視出来るシステムを作っていきたいですね。ミツバチきてくれ〜。
参考
- M5StickCで小型環境センサ端末を作る http://pages.switch-science.com/letsiot/m5stickc/
#### 自己紹介
##### でこびす@decobisu
アイコン
普段はその他製造業の社内インフラエンジニアとしてから物理からAWSまでいじっている。大学の頃はミツバチの集団行動解析をテーマとした研究でミツバチと戯れる生活を送っていた。趣味の養蜂と蜂蜜酒作りをしてみたい。最近自宅サーバも飼い始めた。