巷には猫ちゃんの健康のためUV除菌装置つき猫給水器なるものがいくつか出回っている。
そうかと思うと猫ちゃんのために横着せず毎日どんぶりに入れた水を取り替えてやらねば!という声もネットでは散見される。いったいどっちに振ればいいんだ?
だがIoTに開眼した自分としては前者を選択する。乗るしかない。この
ブームかどうか知らんが。とにかく猫の水やりが心配なので楽して健康を手に入れる手段としてやってみた。
給水器買ったときの記事はこちら。
今回のゴール
今回のゴールについてまずは説明する。
UV除菌式猫ちゃん給水器の動き
猫が水を飲んでいるとき→UVランプは消えている。じゃないと猫ちゃんに紫外線が当たってしまい危ない。腎臓が無事でも目をやられたり日焼けしちゃったりしたらそれはそれで健康を害する。
猫が離れているとき→UVランプが点灯して除菌する。UVランプの効果は正直言ってはっきりとは目に見えないが一応UVランプとして買ったので信じるしかない。
ちなみにUV-Cランプなんだがちょうどオゾンガスが発生しない波長というのを選んで買った。職場にUV-Cランプが腐るほどあったけどどれもオゾンガスを発生して臭いのでそれはそれで健康被害、下手をすれば即死しかねないのでオゾンガスが発生しないことというのも重要。
そんなわけで説明すれば単純な仕掛けだが猫ちゃんが給水器から離れているときには徹底除菌をし、水を飲みに来たら消灯するというものだ。
猫ちゃんたちが水をがぶがぶ飲んでくれること
そして今回の重要なゴールの一つは猫ちゃんたちが水をがぶがぶ飲んでくれるようになることだ。
猫を飼っている人ならだいたい知っていなければならないことだが、猫の死因トップは腎臓疾患だ。だから水をどんどん飲ませて腎臓に負担をかけないようにすることだ。ちょっとここの因果関係はわからないがどこかにそんなことが書いてあったし、獣医も水をたくさん飲ませてねって言ってた。
つまりUVで除菌して前より美味しい状態を一週間(一週間で水を交換して水槽も洗うことにしている)保てれば良いのだ。
▼がぶ飲みは概ねうまくいった。子猫のころから噴水式に慣れさせれば躊躇なく飲んでくれることがわかった。成猫になってからだと波立つ水には近寄りたくないみたい。
完成状態
くどくど言いすぎたがここで完成状態を披露する。
給水器の種類
これじゃなきゃだめということはないがうちはこれを使っている。
ちなみに2個ある。1個あれば十分なんだが、1個は加工するので失敗したとき用にもう1個買った。失敗しなかったので1個は予備で保管するつもりだ。
E17ソケットつけた状態
胴腹に穴をあけて陶器製のE17ソケットを突っ込んだ。ちなみにソケットは樹脂製ではなく陶器製を使うべし。UVで劣化するから。そして隙間にはグルーガンを詰めて水漏れ防止を図っている。
この穴を開ける位置を決めるのがちょっと大変だった。高すぎるとフィルター部分に電球が干渉するし、低すぎるとそれだけ水を入れられる量が少なくなってしまう。
フィルターにぶつからない上限ぎりぎりを目測で狙ったwww
配線状態
実際の制御する装置の配線状態だ。
準備するもの
猫給水器
完成状態の写真でも見せたが、これが我が家に2個設置している給水器だが、普通1個で良いのではないだろうか。
Parner自動給水器 ペット給水器 猫 犬水飲み器 2.4L大容量 ステンレス鋼 循環式給水器 LEDライト ペット用 4枚活性炭フィルター付き シリコンマット 水位窓 お留守番対応
¥2,533(2022/04/05 11:08時点の価格)
平均評価点:
>>楽天市場で探す
>>Yahoo!ショッピングで探す
ESP8266またはESP32
Aideepen 2個 ESP32 ESP-32S ワイヤレスWiFi + Bluetoothデュアルモード開発ボード 2.4GHz CP2102へMicro USB、Tensilica LX6デュアルコアプロセッサ ESP32-WROOM-32チップモジュール内臓マイクロコントローラ、NodeMCUで使用【2021人気商品】
¥2,260(2022/04/05 11:24時点の価格)
平均評価点:
>>楽天市場で探す
>>Yahoo!ショッピングで探す
どっちでもいいのだが、一点注意するならESP8266のほうが少々安めだが技適取得していないものが大部分である。無難な線で言えばESP32をおすすめする。のちほど紹介する自分のプログラムはESP8266で使うことを前提に書いているのでESP32で動かす場合にはGPIO番号やらインクルードするライブラリーやらを少々変更してほしい。
VKLSVAN NodeMcu Lua CP2102 ESP8266 ESP-12E インターネット 開発ボード モジュール
¥699(2022/04/05 11:25時点の価格)
平均評価点:
>>楽天市場で探す
>>Yahoo!ショッピングで探す
E17ソケット
紫外線ランプで使うのでソケットは樹脂製ではなく陶器製をおすすめする。もっともいくらソケットが頑張って陶器製でも給水器本体がプラスチック製なので気休めにしかならない。
ELPA 丸型レセップ E17 ホワイト SB-1713H(W)
¥134(2022/04/05 11:28時点の価格)
平均評価点:
>>楽天市場で探す
>>Yahoo!ショッピングで探す
LEDドライバー
LEDドライバーはなぜか2個組み合わせないとちゃんとランプが光らなかった。たまたま職場にあったのを使えてラッキーだった。
▼ひとつは定電流ドライバーでAC100V電源から15Vぐらいに落としてくれるやつ。4~7wというやつを使った。
▼もうひとつは同じく定電流LEDドライバーで600mAぐらいを安定的に出力してくれるやつ。
LEDドライバ OSMR16-P1213 OptoSupply
¥600(2022/04/05 11:32時点の価格)
平均評価点:
>>楽天市場で探す
>>Yahoo!ショッピングで探す
上記のものを4~7WというほうをAC100Vにつないで出力を600mAのLEDドライバーの入力につないで出力をUVランプにつなぐことで灯る。
ちなみに極性について補足しておくと
デバイス | IN | OUT |
4~7Wドライバー | 極性なし | 極性あり |
600mA定電流ドライバー | 極性なし | 極性あり |
ということなので最後のUV-Cランプにつなぐときだけ極性を気にすれば大丈夫だ。一応赤と黒のリード線だから判断できる。
UVランプ
これは国内のネットショップでは探さなかったがAliExpressでオゾンガス発生しないUV-Cランプとして売られていた。
UV-Cならなんでもオゾンガスが発生するというものではなく、ある特定の波長の光に当たると酸素がオゾンに変わるらしい。
ということで安全性確保のためにオゾン発生なしタイプを選ぼう。ちなみにちょっと匂いを嗅いでみればオゾンが出てるか出てないかわかる。
もし自信がない、わからないというようなら両方買って比べてみればよい。安いし。
ちなみに極性は中央が+、ネジ部がーです。
リレー
AmazonでもAliExpressでもどこでもいい。ただしAliExpressのはハズレを引く場合があったのでAmazonのほうがおすすめ。
そして秋月電子のSSRはちょっとよく作動しなかった。本当は作動音のないSSRのほうが猫ちゃんがびっくりしなくていいんだけど。
waves リレーモジュール 5V 2回路
¥450(2022/04/05 13:05時点の価格)
平均評価点:
>>楽天市場で探す
>>Yahoo!ショッピングで探す
写真は2チャンネルタイプだけど1チャンネルタイプの1個売りというのがAmazonで見かけない。一度に3個セットで買わなければならないので3種類のIoTデバイスを作りますか。
モーションセンサー
モーションセンサーもこれまたAmazonでもAliExpressでも秋月電子でも同じものが手に入る。
Amazonが早く安く手に入るがこれまた1個売りしてない。
VKLSVAN 2個 HC-SR501 人体赤外線感応モジュールPIR モジュール焦電型赤外線検出器 Arduinoに対応
¥499(2022/04/05 13:08時点の価格)
平均評価点:
>>楽天市場で探す
>>Yahoo!ショッピングで探す
電源ケーブル
電源ケーブルはメガネ形状のソケットタイプのものを選んだ。
BUFFALO 電源ケーブル 2ピンソケット(メス)⇔2ピンプラグ(オス)1m BSACC0510BKA
¥315 (中古品)(2022/04/05 11:46時点の価格)
平均評価点:
>>楽天市場で探す
>>Yahoo!ショッピングで探す
これである必要はない。
電源スイッチ
AliExpressで買ったがこの中のAC03というのが日本で売られている上記ケーブルに合う。っていうかヒューズも付いてるしいいかなと思った。必ずしもこれを使う必要はない。
100V→5V変換アダプター
UVランプのドライバーが100V仕様なので100Vから電源を取るがマイコンボードへは5Vの電源を供給したい。そこで100Vの電源スイッチからすぐ分岐させてこのアダプターにも供給する。
必ずしもこれを割り込ませなくともスマホ買ったときとかに付属してくるACDCアダプターを使ってもよい。
アルミテープ硬いの
できるだけUV-Cの光を水以外のところへ当てたくないのでアルミテープをソケットに半周貼り付けてプラスチックへ直射しないようにした。多少の効果はあると思っている。
エスコ(ESCO) アルミ薄板(粘着付・ロール巻) 400x1200x0.2mm EA440ER-24
¥1,491(2022/04/05 13:19時点の価格)
平均評価点:
>>楽天市場で探す
>>Yahoo!ショッピングで探す
たまたま手元にあったこれを使ったんだけど、わざわざ買うにはちょっと高いので手元にあるなにかで代用してほしい。あるいはもっとペラペラの薄いアルミテープでもいけるかなと思う。
グルーガン
SK11 ボンドガン ピタガンセットA (ピタガンGM-100+スティック12本入) GM-100-12
¥1,280(2022/04/05 13:21時点の価格)
平均評価点:
>>楽天市場で探す
>>Yahoo!ショッピングで探す
100均のでもいいけどやっぱりちょっと値が張るものは温まるまでにあまり待たされないからいいよ。
その他
その他細かい材料として端子接続用平型ギボシオスメスとジャンプワイヤーとブレッドボードを用意しておいたほうがよい。
ハードウェアの制作
回路図
手書きだけどこんな感じ。
▼温度センサーもついてるが関係ない。
主電源スイッチ部
▼さきほど部品のところで紹介したヒューズ入りスイッチがこれ。
▼裏面はこうなっている。平型端子187型メスを5個ほど用意しよう。なければ直接リード線を巻き付けても良いがAC100Vなので解けないように十分確認すること。
3つ横並びになった端子がちょっとわかりにくいが、色が金色と銀色で分かれている。右2個が銀色で左1個が金色だ。
スイッチを入れたときどことどこが繋がるかは各々テスターで確認してから作業しよう。
▼こんなふうに平型端子187型を加工したリード線を準備する。
▼順番はどうでも良いんだけど、まずブリッジ線をここにつける。
▼次にコネクターのついている線のうちブリッジになっていないほうの線を3つ並んだ端子の中央につける。
▼最後にブリッジになっているほうのやつをコンセントから来る線と3つの端子の残りとに入れるこれはどっちをどっちに入れても大丈夫。
▼最終的な完成形も載せておく。
UVランプドライバーモジュールのつなぎ方
本当はLEDを安定して灯すためのドライバーなんだがUV-Cランプを安定的に灯すのにも有効だから使う。
▼左下がAC電源側で極性はない(厳密にはL/Nとあるけど)。それが右に言ってピンクと白のラインに出ているが、これをその右の小さい基板の黒い線につなげる。ここは+ーで出ているのだが小さい基板の入り口はどっちを繋げても大丈夫なようにできているのでどっちを繋げてもよい。最後に一番右のピンクと白が+とーだ。これはちゃんとUVランプの+とーに繋げること。
▼はんだ付けして熱収縮チューブで保護した状態がこちら。出入り口には2極のコネクターをつけた。
電源とランプドライバーの間にリレーを噛ます
リレーとマイコンボードを繋げる
▼試作段階でUSBケーブルから電源をとっている。
電源からマイコンボード用電源アダプターへ分岐させる
給水器タンクの穴とE17ソケット
▼穴あけはまずはハンダゴテで少し小さめに開けて、そのあとカッターなどのナイフ系で地道にコツコツと大きさを合わせるのだ。ちょっときつめぐらいがよいはず。
ソケットを通したら周囲をグルーガンで接着し水漏れを防ぐ。
▼内部はアルミの反射板を貼り付け輪ゴムなどで固定する。当初は内側もグルーガンで固定したがタンクを洗うときに結局それらは取り除かなければならないので内側の固定は可逆的というか外しやすいようにやっておこう。
▼火を灯してみたところ。UV-Cの光が雑菌を少しでも除去してくれることを期待する。
▼見たところかなり下の方に穴を開けているように見えるが仕方ない。
▼こんな感じでフィルター受けを入れたときこの位置がぎりぎり干渉しない高さなのだ。これ以上穴位置が高いとフィルター受けを入れられない。
プログラムの構成
デバッグ用であちこちでSerial.printしているがウザかったら消しても可。
VPIN_EMERGという緊急ボタンをBlynkで配置しているが不要なら消しても可。
プログラムはESP8266用にしてあるのでESP32を使う場合はところどころ改造が必要になる。
チューニングする箇所は以下にコメントしてある数カ所。それよりBlynkレガシーアプリでは新規ユーザーアカウトが作れなくなっていよいよサービスが終焉を迎えそうなのでこんなに作っても仕方ないかなと思ってしまう。
#include <blynksimpleesp8266.h>
#define wifiLed 16 //D0
#define RELAYOFF 1 // リレーによってここ変える
#define RELAYON 0 // リレーによってここ変える
#define BAUD_RATE 115200
#define RELAYPIN 12 //D6 リレー
#define MOTIONSENSORPIN 14 //D5 人感センサーピン
const char* ssid = "Wi-Fi情報"; // Wi-Fi情報
const char* pass = "Wi-Fiパスワード"; // Wi-Fi情報
// Blynkレガシー版アプリトークン
const char AUTH[] = "*********ここに入れる*********************" ;
#define DELAY_AFTER_CHANGE_RELAY 2000 // リレー切り替え後の待機時間
//Blynkバーチャルピン
bool LightingState = RELAYOFF; // ランプのステータスを初期状態(オフ)にする
int EmargencyMode = 0; // 緊急モードオフ(0)にしておく
#define VPIN_EMERG V1 // Blynkアプリで任意に変える
int wifiFlag = 0;
void led_blink(int,int,int,int);
// モード切り替えピン
const int MODE_PIN = 0; // GPIO0
BlynkTimer timer;
void relayOnOff(int relay){
if(LightingState == RELAYON){ // LEDが点灯中のとき
Serial.println("点灯中→消灯");
LightingState = RELAYOFF; // LEDステータスをオフ
digitalWrite(RELAYPIN, RELAYOFF); // リレーを切断
delay(DELAY_AFTER_CHANGE_RELAY);
digitalWrite(wifiLed, HIGH); // インジケーターLEDを消灯
}else{ // LEDが消灯中のとき
if (EmargencyMode) {return;}
Serial.println("消灯中→点灯");
LightingState = RELAYON; // LEDステータスをオン
if (!EmargencyMode) {
digitalWrite(RELAYPIN, RELAYON); // リレーをつける
}
delay(DELAY_AFTER_CHANGE_RELAY);
digitalWrite(wifiLed, LOW); // インジケータLEDを点灯
}
delay(100);
}
/*
* ループで呼ばれる
* センサーの状態でリレーを制御する
*/
void CatSensing(){
// センサー感知判断
if (digitalRead(MOTIONSENSORPIN) == HIGH){ // 猫を検知したら
if (LightingState == RELAYON){ // LEDが点灯中なら
led_blink(50,50,2,LED_BUILTIN);
Serial.println("接近した & いまRELAYOFFにする");
relayOnOff(1); // リレー反転
}else{
Serial.println("接近している & すでに RELAYOFF 中");
delay(DELAY_AFTER_CHANGE_RELAY);
}
}else{ // 猫が離れたら
if (LightingState == RELAYOFF){ // ステータスが消灯中なら
led_blink(50,50,4,LED_BUILTIN);
Serial.println("離れた & いまRELAYONにする");
relayOnOff(1); // リレー反転
} else{
Serial.println("離れている & すでに RELAYON 中");
delay(DELAY_AFTER_CHANGE_RELAY);
}
}
}
void OnConnectWifi()
{
Serial.println("Succesfully Connected!!!");
timer.setInterval(5000L, checkBlynkStatus); // check if Blynk server is connected every 3 seconds
Blynk.config(AUTH);
led_blink(50,50,20,wifiLed);
//During Starting all Relays should TURN OFF
digitalWrite(LED_BUILTIN,HIGH);
LightingState = RELAYOFF;
digitalWrite(RELAYPIN, LightingState);
}
BLYNK_CONNECTED() {
}
// アプリのボタンを押したとき
BLYNK_WRITE(VPIN_EMERG)
{
EmargencyMode = param.asInt();
if(EmargencyMode = 0){
led_blink(400,400,3,LED_BUILTIN);
Serial.println("緊急モード解除");
Blynk.setProperty(VPIN_EMERG,"offLabel","緊急モード解除");
}else{
digitalWrite(RELAYPIN, RELAYOFF);
led_blink(50,50,12,LED_BUILTIN);
Serial.println("緊急モード突入");
Blynk.setProperty(VPIN_EMERG,"onLabel","緊急モード突入");
}
}
void checkBlynkStatus()
{ // called every 3 seconds by SimpleTimer
bool isconnected = Blynk.connected();
bool detectCat = digitalRead(MOTIONSENSORPIN);
Serial.print("checkBlynkStatus() LightingState ");
Serial.print(LightingState);
Serial.print(" DetectCat ");
Serial.println(detectCat);
if (isconnected == false) {
wifiFlag = 1;
}
if (isconnected == true) {
wifiFlag = 0;
}
}
void setup()
{
Serial.begin(BAUD_RATE);
pinMode(wifiLed, OUTPUT);
pinMode(LED_BUILTIN, OUTPUT);
pinMode(RELAYPIN, OUTPUT);
pinMode(MOTIONSENSORPIN, INPUT_PULLUP);
////// Wi-Fi接続処理 //////
WiFi.disconnect();
delay(10);
Serial.println();
Serial.println();
Serial.println("Startup");
//Blynk.begin(auth, ssid, pass);
WiFi.begin(ssid, pass);
timer.setInterval(2000L, checkBlynkStatus); // check if Blynk server is connected every 2 seconds
Blynk.config(AUTH);
delay(1000);
////////////// Wi-Fiつながったときの処理はここ //////
OnConnectWifi();
////////////////////////////////////////////////
}
void loop()
{
if (WiFi.status() != WL_CONNECTED){
Serial.println("WiFi Not Connected");
} else {
Blynk.run();
}
timer.run(); // Initiates SimpleTimer
CatSensing();
}
void led_blink(int OnSec,int OffSec,int n,int port){
for(int i=0;i<n;i++){
digitalWrite(port, LOW); // turn the LED on (HIGH is the voltage level)
delay(OnSec); // wait for a second
digitalWrite(port, HIGH); // turn the LED off by making the voltage LOW
delay(OffSec); // wait for a second
}
}
実際に使ってみた効果
メリット
この記事を書いている時点でまだ使いだしてから1週間弱なので猫ちゃんが好んで飲んでるかどうかよくわからない。
ただ水が除菌されているのは間違いないと思う。だから常にきれいな水を与えられるということで飼い主としては精神衛生上よろしいのではないか。
水の衛生より精神の衛生が今のところ貢献度高い
デメリット
前にも触れているがUVランプのソケットを胴体に突っ込んでるので貯水量が少なくなっているのは大きなデメリットだ。
これはつまり補水の頻度が上がるということで給水器そのものの洗浄間隔は1週間余裕で開けて世話なしになったとしても補水は毎日きっちりやらない(猫の頭数による)と致命的だ。
それと水の音がうるさくなった。以前からわかっていたことではあるが給水器にたっぷり水が入っていると落水の音が気にならないのだが水位が下がってくると水が落ちる音が耳につくようになる。
ただしその分マイナスイオン効果がなくもないかなとも思う?
数週間使って感じたこと
それを言っちゃあおしまいよという感じではあるが構造上UVランプ光源が十分遮られているのでモーションセンサーは不要だったのではないかと思っている。
モーションセンサー不要ということはマイコンボードもプログラミングも不要だったといえる。かなり工数削減できていたかもしれない。
でもってマイコンボードだのプログラミングだのなんて無理無理と諦めていた人にとってはちょっと部品を買って接続するだけで除菌タイプの給水器が作れるとしたらどうだろうか。
やってみる価値はあるかもしれない。
その場合省ける部品は
- マイコンボード
- モーションセンサー
- リレー
- 100V→5V変換アダプター
であとプログラムを書き込むための環境など不要になる。
謝意
参考にさせていただいたサイトへのリンクを貼っておく。
E17殺菌電球を光らせるのにはコツが必要でした | kohacraftのblog
Arduino:ESP8266でモーションセンサーと電源スイッチっす | 必要なものを求めてWP