
モルモットの給水ボトル。水が少なくなったら通知する仕組みをobnizで作りました。水位センサーは使わず、レーザーと感光センサーを利用しています。
光の屈折で水位を知れる?
衛生面が気になり、水にセンサーを入れず、水位を知る方法を考えます。
方法としては、ボトルの重さを測ったり、画像認識で解析したり、光で測ったり・・・いくつかありそうです。
今回は最も簡単そうな、レーザーと感光センサーを用いる方法を試します。
光の屈折を利用します。

水が入っている状態のボトルでは、レーザーが屈折して、感光センサーに光が当たらないようにします。
そして水がなくなったら、レーザーが直進して感光センサーが反応するようにします。
水位確認レーザーセンサー

目論見通りに水位を測れるか、まずは試作してみます。
obniz、レーザー、受光センサー、そして家にあった木材やネジで組み立てました。
レーザーは水位を測る時、瞬間的に照射すればよいので、通常はOFFにしています。
タイマーで10分毎にレーザーを放ち、計測するようにしました。
ボトルの水がなくなったとき

実際の挙動です。ボトルの水が少ない状態。
レーザーを0.1秒照射して赤く光った後、ブラウザに「水がないよ!」という通知が来ました。
ちなみに音声で「水がないよ!」と、しゃべっています。
水を補充したら

今度はボトルに水を入れた状態です。
レーザー照射後、ブラウザの表示が「水あるよ」に戻りました。
obnizの配線とコード

obnizボードの配線は下記のようにしました。
IO 6ピン・・・レーザーVCC
IO 8ピン・・・レーザーGND
IO 9ピン・・・感光センサーVCC
IO10ピン・・・感光センサーGND
IO11ピン・・・感光センサーデジタル入力
試作したHTMLでは、音声通知にWeb Speech APIを使っています。
		
		
			
			
			
			
				
					
				| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | <html> <head>   <meta charset="utf-8">   <meta name="viewport" content="width=device-width, initial-scale=1">   <title>モルモット水残量</title>   <script src="https://obniz.io/js/jquery-3.2.1.min.js"></script>   <script src="https://unpkg.com/obniz@3.11.0/obniz.js" crossorigin="anonymous"></script> </head> <body> <div id="obniz-debug"></div> <main>   <h1>モルモット水残量</h1>   <button type="button">音声お知らせOFF</button>   <p id="val" style="font-size:100px;">計測待ち・・・</p> </main>   <script> const obniz = new Obniz("obnizID"); const $val = $('#val'); let isSpeech = false,     uttr;   $('button').on('click', function() {   let text;   if(isSpeech){     text = "音声お知らせOFF";     isSpeech = false;   }else{     text = "音声お知らせON";     isSpeech = true;   }   $(this).text(text);   uttr = new SpeechSynthesisUtterance(text);   speechSynthesis.speak(uttr); })     obniz.onconnect = async () => {   let text;   obniz.io8.output(false);   obniz.io10.output(false);     const timer = async () => {     const sleep = msec => new Promise(resolve => setTimeout(resolve, msec));     let val;     await obniz.io6.output(true);     await obniz.io9.output(true);     await sleep(100);     val = await obniz.io11.inputWait();     obniz.io6.output(false);     obniz.io9.output(false);     if(val){       text = "水あるよ";     }else{       text = "水ないよ!";     }     if(isSpeech){       uttr = new SpeechSynthesisUtterance(text);       speechSynthesis.speak(uttr);     }     $("#val").text(text);   };     setInterval(timer, 1000 * 60 * 10);//10分毎   }; </script> </body> </html> | 
				
			 
		 
実運用ではブラウザのタイマーより、obnizのサーバレスイベントに登録して実行したほうが良いでしょう。
ただ、サーバレスイベントだと当然、Web Speech APIは使えません。
代案として、IFTTTで水が少なくなったらLINEに通知する方法や、obnizボードに直接ブザーを付けて鳴らす方法などが考えられます。
自分のライフスタイルに合わせ、気づきやすい方法で知らせるのが良いかと思います。
モルモット自身も教えてくれる

最後に余談ですが、モルモットは何か欲しい時、「キューイ!キューイ!」と大きな声で鳴きます。
在宅中はブザーがなくても、水がないことをモルモット自身が教えてくれるかもしれません・・・。