HomeMadeGarbage が 2021年04月12日00時03分38秒 に編集
初版
タイトルの変更
牛乳残量計
タグの変更
IoT
obniz
スマートホーム
メイン画像の変更
記事種類の変更
製作品
本文の変更
成長期のこどもたちがいる我が家 最近では牛乳の消費量が日々増しております。 そこでいつでもどこからでも自宅の牛乳在庫を知ることができる牛乳残量計システムを製作しました。 # デモ動画 @[youtube]( https://youtu.be/RPM6O0iMeSA) # システム概要 obnizに牛乳の在庫本数を設定する可変抵抗と開封済み牛乳の残量を計測するロードセルを接続して、1時間に一度測定してデータをサーバにアップします。 データアップ後にスリープし、1時間後に起床して計測データをアップしスリープを繰り返します。 obniz Board 1Yにはスリープ機能があり、スリープ中の消費電流は 20uA-40uAとのことです。 https://obniz.com/ja/doc/reference/board-1y/sleep-function 冷蔵庫内で単3電池3本で長期間動作させるために極力消費電力を抑える構成にいたしました。 # 構成 ![キャプションを入力できます](https://camo.elchika.com/c2f51691bc5c8f427472628add6d794cd1711354/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39396533383932642d313165622d346636362d393638622d3230623961353138303030652f65363737353339382d383835352d343734312d396466372d633362613036316635363739/) ## 部品 - [obniz Board 1Y](https://obniz.com/ja/products/obnizboard1y/) - 10 kohm 可変抵抗 - [5kg ロードセル](https://www.amazon.co.jp/HX711%E3%83%AD%E3%83%BC%E3%83%89%E3%82%BB%E3%83%AB%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB-24%E4%BD%8D%E7%B2%BE%E5%BA%A6AD%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB-%E5%9C%A7%E5%8A%9B%E3%82%BB%E3%83%B3%E3%82%B5%E3%83%BC%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB-Arduino-%E9%87%8D%E9%87%8F%E3%82%BB%E3%83%B3%E3%82%B55KG/dp/B07JL7NP3F) - [電池ボックス 単3×3本](https://www.amazon.co.jp/%E9%9B%BB%E5%85%89%E3%83%9B%E3%83%BC%E3%83%A0-%E9%9B%BB%E6%B1%A0%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9-%E5%8D%983%C3%973%E6%9C%AC%E7%94%A8%EF%BC%884-5V%EF%BC%89%E9%9B%BB%E6%B1%A0box-%E3%83%95%E3%82%BF%E3%83%BB%E3%83%AA%E3%83%BC%E3%83%89%E7%B7%9A%E3%83%BB%E3%82%B9%E3%82%A4%E3%83%83%E3%83%81%E4%BB%98-Battery/dp/B00WU9ZV5I) # 計測 牛乳在庫の計測方法を記します。 ## 未開封在庫 未開封の牛乳在庫本数は可変抵抗で手動で設定するようにしました。 0~5本をツマミで設定できるようにしました。 @[twitter](https://twitter.com/H0meMadeGarbage/status/1381140688314634244) ## 開封済残量 開封済 牛乳の残量はロードセルで重量を測り算出しました。 使用したロードセルのA/DコンバータにはHX711が使用されていました。 obnizによるHX711の制御には以下を参考にしました。 https://obniz.com/ja/sdk/parts/hx711/README.md setOffsetでゼロ補正を行い、 setScaleでスケール設定します。 測定した重量から紙パックの重量(35g)を差し引いて、牛乳の比重1.03より残量を算出します。 @[twitter](https://twitter.com/H0meMadeGarbage/status/1381142035105599489) # 筐体 筐体は3Dプリンタで出力しました。 ![キャプションを入力できます](https://camo.elchika.com/0e6784f5ecb1665fd7d3ab28795baa63fadc10c9/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39396533383932642d313165622d346636362d393638622d3230623961353138303030652f33373933393931342d616634352d346638622d623665372d326162643537333731373536/) 筐体に各部品を固定します。 ![キャプションを入力できます](https://camo.elchika.com/9a7e70cf23f0b1d1716eb7b181bf1cd498bd7f86/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39396533383932642d313165622d346636362d393638622d3230623961353138303030652f66376335343335362d663437632d343633332d623337632d656639363039343430363464/) 牛乳残量計の完成です。 ![キャプションを入力できます](https://camo.elchika.com/b3d72d020ef04821962f9d144dc3ef1228999797/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39396533383932642d313165622d346636362d393638622d3230623961353138303030652f62626335613863642d396566632d343439382d383830342d616465323537653865343762/) # データ送信 計測したデータ(在庫本数、開封済み牛乳残量)はUrlにパラメータとして付与して自宅サーバにアップします。 自宅サーバでデータと受信時間を保持してブラウザ表示できるようにしました。 ![キャプションを入力できます](https://camo.elchika.com/fc1b0c51ba4705d00407dcdf8c112d8d5ba1eb9b/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39396533383932642d313165622d346636362d393638622d3230623961353138303030652f31616639353861662d323961612d343133622d393732622d383932616562633137623439/) これで、いつでもどこでも自宅の牛乳の在庫を知ることができ外出時に牛乳の買い忘れを防ぎ 子の育成の促進をはかることができるようになりました。 # ソースコード ```html:牛乳残量計コア部 <script> $("#bploading").text("RUNNING..."); //type in your obniz ID var obniz = new Obniz("OBNIZ_ID_HERE"); var label, cnt = 0; label = new ObnizUI.Label('label'); const milkDensity = 1.03; const packWeight = 35; var sensor ,value = 0; //during obniz connection obniz.onconnect = async function() { // 重量測定 sensor = obniz.wired("hx711" , {gnd:4, dout:3, sck:2, vcc:1} ); sensor.setOffset(180800); sensor.setScale(441.9); value = (await sensor.getValueWait(1) - packWeight) / milkDensity; //牛乳在庫本数 obniz.io5.output(false); cnt = ((await obniz.ad6.getWait()) / 33) * 50; //ブラウザ・LCD表示 obniz.display.clear(); obniz.display.print('牛乳在庫'); obniz.display.print(([' ',cnt.toFixed(),'本と', value.toFixed(), 'ml'].join(''))); label.setText((['牛乳在庫は',cnt.toFixed(),'本と', value.toFixed(), 'ml'].join(''))); //サーバ送信 var request = new XMLHttpRequest(); request.open('GET', 'https://自宅サーバ' + '?count=' + cnt.toFixed() + '&value=' + value.toFixed()); request.send(null); //スリープ obniz.sleepMinute(60); }; </script> ``` アプリはスリープ起床後に毎回動作してほしいので"デバイスがオンライン時に実行"にチェックを入れてインストールしました。 ![キャプションを入力できます](https://camo.elchika.com/0dd3d2022f8b2dec413b13d71246a71201067d4c/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39396533383932642d313165622d346636362d393638622d3230623961353138303030652f61323636306564302d636362642d343937352d623361372d663762623133333363666266/)