LINE はこの記事で使っている LINE Notify の機能を2025年3月末で廃止すると通達していますので注意してください。
猫の健康管理で最も問題になることが何かご存知でしょうか? それはトイレの管理です。砂漠で生活していた猫の祖先は、体内の水分を有効利用するためにオシッコを濃縮して排泄する身体になりました。その名残で現代の猫は腎臓や膀胱に問題を起こすことがとても多いのです。愛猫家にとって、猫がちゃんとトイレに行っているかは大きな関心事なのです。
さて、我が家の猫「おこげ」は普段1日に3回トイレに行き、これがベストな状態です。夏場に水分摂取とオシッコのバランスが崩れてしまうと、何度もトイレに行って苦しそうにします。症状が出始めた初期の段階でその兆候を捉えることができないかというのが本稿の課題です。
「猫検知」センサ
まず、猫がトイレに入ったことを検知するためにどんなセンサーを使うかを検討しました。
(1)スイッチ
猫が踏んだらスイッチが押される仕掛けを作ってトイレの前に置いてみました。バネで支えられた丸いプレートの中央にスイッチを配置して、プレートを踏んだことをマイコンで検出できるようにしました。写真の赤いものはマイコン M5StickC Plus、白いのはついでに付けた温湿度センサです。
ところが、いつまで待ってもシステムが反応しません。猫は見慣れないものがあると用心するので、どうやら装置を避けてトイレに入っているようです。失敗でした。
(2)圧力センサ
FSR-402 という圧力センサです。センサ出力をモニターできることは確認しました。トイレの下に挟み込んで猫の体重に反応するようにすれば良さそうです。十分な精度が出るなら、もしかしたらオシッコの量もわかるかもしれないという期待もありました。と、考えているうちに次の(3)案に傾いてしまったので実装はしませんでしたが、いつか試してみたいと思います。
(3)焦電型赤外線センサ(人感センサ)
照明器具などにも使われている人感センサです。電子工作には HC-SR501 をよく使いますが、猫トイレに設置することを考えてより小型の HW-740 を選びました。
以下、実装方法について説明します。
回路
マイコンにはWIFi機能を搭載した ESP32-DevKitC-32D を使いました。人(猫)感センサは上述の HW-740 です。端子が3本出ているので 3.3V電源、GND、データ信号はGPIO22 にそれぞれ接続しました。
猫が留守番中の室内温度も気になっていたので温湿度センサの DHT11 と、動作状態の確認用に LED も追加しました。DHT は 5V電源、GND、GPIO5 に、LED は 500Ω の抵抗を介して GND、GPIO2 に接続しました。
プログラム
Arduino IDE でもプログラミングできますが、今回は PlatformIO を使いました。
platform.ini です。Arduino IDE を使う場合は lib_deps に書いてある各ライブラリをインストールしてください。
1 2 3 4 5 6 7 8 9 |
[env:esp32dev] platform = espressif32 board = esp32dev framework = arduino lib_deps = mobizt/ESP Line Notify@2.1.0 adafruit/DHT sensor library@^1.4.6 adafruit/Adafruit Unified Sensor@^1.1.14 monitor_speed = 115200 |
人感センサ HW-740 に関する部分は以下のとおりです。
1 2 3 4 5 6 7 8 9 |
#define SENSOR_PIN 22 void setup() { pinMode(SENSOR_PIN, INPUT); } void loop() { int s = digitalRead(SENSOR_PIN); } |
人や猫を検知するとセンサーの出力が HIGH になりますが、ちょっとしたノイズを拾って動作してしまうので工夫が必要です。500ms 毎にセンサー出力を見て、6秒以上検出状態が続いたら「猫がトイレに入った」と判断するようにしました。いったん猫を検出したら5分間は動作を停止して重複検知することを回避しました。また、センサー出力が HIGH になったらLEDを点灯するようにして、意図した通りに動作していることを確認しました。
温湿度センサ DHT11 に関する部分は次のとおりです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#include <DHT.h> #define GPIO_DHT 5 DHT dht( GPIO_DHT, DHT11 ); void setup() { dht.begin(); } void loop() { bool isFahrenheit = true; float percentHumidity = dht.readHumidity(); // 湿度 float temperature = dht.readTemperature( isFahrenheit ); // 温度(F) if (isnan(percentHumidity) || isnan(temperature)) { // エラー処理 } else { float tempC = (temperature - 32.0)*5/9; // 温度を摂氏に変換 float heatIndex = dht.computeHeatIndex( // 暑さ指数を計算 temperature, percentHumidity, isFahrenheit); } } |
以上に加えて、WiFi への接続に関するプログラムも書き加えました。さらに、猫がトイレに入ったら LINE 通知をしたかったので LINE Notify も使っています。
完成
実際に猫トイレに設置した様子です。基板がむき出しのままでは見栄えが悪いので MINTIA の空き箱にいれました。マイコン基板のピンヘッダは邪魔なので切り取りました。
センサはトイレ内側にテープ留め。
LINE への通知画面です。
うちの猫はだいたい1日3回トイレに行っているのが確認できました。この回数が増えることがあったら病院に連れていきます。