memorandums

日々の生活で問題解決したこと、知ってよかったことなどを自分が思い出すために記録しています。

IoT巣箱(その4)

前回の続きです。

とりあえず、ESP32でソフトウェアの書き込みができるようになったので、以前、M5Stackで作ったことがあったプログラムを動かしてみました。

やっていることは、PIRセンサーで接近を感知し、そのカウントを定期的にLINE NotifyとAmbientに送信するものです。

もともと、一人暮らししている実家の母の様子(居間で人の動きがあるかないか?)を遠隔見守りしたいので作ってみました。

参考にしたサイトをまず挙げておきます。

LINE Notifyについては以下。

ESP32とLINE Notifyを使ってナースコール的なのを作る - Qiita ESP32とLINE Notifyを使ってナースコール的なのを作る はじめに トイレなど見守りが必要に急にな qiita.com

Ambientについては公式を参考にしたと思います。半年以上前なので記憶が怪しいですが。

Arduino ESP8266で温度・湿度を測定し、Ambientに送ってグラフ化する – Ambient ambidata.io

とりあえず、僕のテストコードも貼っておきますね。とりあえず動くことは動きます。コード中の?????は、上記の記事などを読んで自分用のものをセットしてくださいね。

#include <WiFi.h>

#include <WiFiMulti.h>

#include <ssl_client.h>

#include <WiFiClientSecure.h>

#include <HTTPClient.h>

#include <Ambient.h>



Ambient ambient; // Ambientオブジェクトを定義

unsigned int channelId = ?????; // AmbientのチャネルID

const char* writeKey = "?????"; // ライトキー



const char* ssid = "?????";

const char* password = "?????";



int pre_pir = HIGH; //起動直後のHIGHを無視するため



int event_counter = 0;

int total_event_counter = 0;

unsigned int ambient_timer = 0;

unsigned int line_timer = 0;



const bool DEBUG = true;



void setup() {

 if (DEBUG) Serial.begin(115200);

 wifiConnect();

 pinMode(25, INPUT_PULLUP);

}



void loop() {

 int pir = digitalRead(25);

 if (pre_pir == HIGH && pir == LOW) {

   ++event_counter;  //人を検知した

 }

 pre_pir = pir;



 ambient_timer ++; //0.1sec

 if (ambient_timer > 3600 * 10) { //3600sec

   send();  //Ambientに送信

   ambient_timer = 0;

   total_event_counter += event_counter;

   event_counter = 0;

   if (++line_timer >= 6) { //6hour

     line_timer = 0;

     send_line(String(total_event_counter));

     total_event_counter = 0;

   }

 }



 delay(100);

}



//-----------------------------------------------------------------



void send() { //Ambient送信用

 WiFiClient client;



 //Ambientのサーバに接続

 Serial_println("Try(Ambient)");

 if (!ambient.begin(channelId, writeKey, &client)) {

   Serial_println("Connection failed");

   wifiConnect();

   return;

 }



 //リクエストを送信

 Serial_print("Connected(Ambient) -> ");

 ambient.set(1, event_counter);

 if (ambient.send()) {

   Serial_println("OK");

 } else {

   Serial_println("NG");

   wifiConnect();

 }

}



void send_line(String message) { //LINE送信用

 const char* host = "notify-api.line.me";

 const char* token = "?????";

 WiFiClientSecure client;

 Serial_println("Try(LINE)");

 //LineのAPIサーバに接続

 client.setInsecure();

 if (!client.connect(host, 443)) {

   Serial_println("Connection failed");

   wifiConnect();

   return;

 }

 Serial_println("Connected(LINE)");

 //リクエストを送信

 String query = String("message=") + message;

 String request = String("") +

              "POST /api/notify HTTP/1.1\r\n" +

              "Host: " + host + "\r\n" +

              "Authorization: Bearer " + token + "\r\n" +

              "Content-Length: " + String(query.length()) +  "\r\n" + 

              "Content-Type: application/x-www-form-urlencoded\r\n\r\n" +

               query + "\r\n";

 client.print(request);



 //受信終了まで待つ

 while (client.connected()) {

   String line = client.readStringUntil('\n');

   if (line == "\r") {

     break;

   }

 }



 String line = client.readStringUntil('\n');

}



void wifiConnect() {

 WiFi.disconnect();

 WiFi.mode(WIFI_STA);

 WiFi.begin(ssid, password);  // Wi-Fi接続

 while (WiFi.status() != WL_CONNECTED) {  // Wi-Fi 接続待ち

   delay(1000);

   Serial_print(".");

 }

 Serial_println("\nwifi connect ok");

}



//-----------------------------------------------------------------



void Serial_print(String msg) {

 if (!DEBUG) return;

 Serial.print(msg);

}



void Serial_println(String msg) {

 if (!DEBUG) return;

 Serial.println(msg);

}

参考にしている、以下の書籍の消費電力を抑える工夫は一切していません。これからやります。

IoT開発スタートブック ── ESP32でクラウドにつなげる電子工作をはじめよう! www.amazon.co.jp 2,592円 (2021年10月08日 19:16時点 詳しくはこちら) Amazon.co.jpで購入する

TODOは以下。

●省電力化の工夫と充電の持ちの検証

●モバイルSIMの契約、BBルーター等との接続確認

●巣箱本体とのセンサー位置や設置方法の確認

●風雨の入り込み具合の確認と防水対策の要否の検討

とりあえず、100均の入れ物にいれてみたのが以下です。センサーとマイコンと電池ボックスですから。。。超シンプルですね。

画像1

ただ、この形式でやるかどうかは未定です。

15人の参加者のそれぞれの巣箱にこれを設置できなくはないのですが、1年間、屋外に設置することを考えると色々と不安があります。

自分が趣味で勝手にどこかに1つ山奥でも置いてくるならいいんですが、ずーっと見てくれる子供達ももしかするといるかもしれません。となると運用がしっかりやらなければならないですし。サービスステータス的なこととか。

もちろん、台風とや暴風雨もきますし、九州ですから真夏の照りつける太陽下でひさしがあるとはいえまともに動作し続けるのか?も不安があります。ESP32がいくら低消費電力とはいえ1週間もつかどうかと想像しています。となると1週間ごとに電池の入れ替えを誰かがしなければならない。。。うーんつらそう。

盗難や破損はまぁしかたがないとしても、上記のことを1年間、常に気にしなければならない運営側の心理的な負担はそれなりにあると想像します。

となると。。。別の形態での実装もいいかなぁ、と。個人的にはこちら推しです。小学生の低学年なら作ったことを覚えているのは1週間あるかないか。。。かなと思いますし。

で、とりあえず、これまでのイベントでやってきたシステムを同じように組み込んでみたのが以下です。詳細は省略しますが、中華Arduino Nanoに上記と同じくPIRセンサーをつけて、人が近づいたらELEKITの音声ボードを鳴らすというシステムです。一応、この箱に収まります。もちろん、巣箱にいれると鳥が逃げちゃいますので、巣箱を外に設置するときには外します。いつ使うのか?一応、イベントで巣箱を組み立ててデザインして保護者の前で発表します。そのときに巣箱にいれておいて、手を挿入すると子供の声で説明が始まる。。。そんな感じで使えるんじゃないかな(これまでもそうしてきた)ということです。

画像2

とりあえず、プロトタイプはできたので、これで打ち合わせてきます。次はイベント報告かな?

もし使わないことになってもせっかく作ったので、自宅に巣箱でもおいて監視してみようかなぁ😁と思っています。もし、興味のある方がいらしたらやってみてください😁