Bear_Deafのアイコン画像

ペット食事時間の記録システム

Bear_Deaf 2021年04月30日に作成  (2021年05月05日に更新)
ペット食事時間の記録システム

概要

ペット食事時間の記録システムは、ペットが食事をしたことを、Lineグループに自動投稿する情報共有ツールである。ペットフード保存容器のフタを戻したときに、家族にLineでペットの食事時間を共有できる。

ペット食事時間の記録システム

問題

うちにはニーナという食いしん坊なわんちゃんがいる。ごはんをもらっていないよ、と嘘をつくのがとても上手だ。家族はだまされて、2回以上もあげるときもある。家族内の共有をしたくても、朝夕はとても忙しくLineを打つ時間がない。そこで、obnizの助けを借りる。

概要仕様

  • 開いているペットフード保存容器のフタを閉めたたとき、家族のLineグループにメッセージを送る
    ・5秒よりはやくフタがしまった場合は、メッセージを送らない
    ・5秒以上ひらいたフタがしまった場合は、メッセージを送る
  • メッセージは家族が登録したLineグループに送る
    メッセージは、以下のとおり(HH:MMはふたがしまったときの時間)
    ・朝ご飯(5時~8時)の場合は、「HH:MM 朝ご飯、終りました。」
    ・晩ご飯(17時~8時)の場合は、「HH:MM 晩ご飯、終りました。」
    ・それ以外の時間の場合は、「HH:MM おやつ、終りました。」

Line グループの画面例

システム図

システム図を以下に示す。

システム図

部品表

部品表を以下に示す。

番号 部品名 型式 数量
1 obniz obniz Board 1Y 1
2 マイクロスイッチモジュール KEYESTUDIO 1
3 モバイルバッテリ SP-L4000 1

開発環境

  • Node.js
  • LineのNotify npmライブラリ

接続表

接続表を以下に示す。

obniz マイクロスイッチモジュール 備考
No 0 S 信号端子
No 1 + 電源端子
No 2 - GND端子

ソースコード

const Obniz = require("obniz");
var obnizeId = "XXXX-XXXX"; // obnizのID
var obniz = new Obniz(obnizeId);
var msg_data = "XXX"

const axios = require('axios');
const qs = require('querystring');
const BASE_URL = 'https://notify-api.line.me';
const PATH =  '/api/notify';
const LINE_TOKEN = '------------'; // LINEのトークン

var config = {
    baseURL: BASE_URL,
    url: PATH,
    method: 'post',
    headers: {
        'Content-Type': 'application/x-www-form-urlencoded',
        'Authorization': `Bearer ${LINE_TOKEN}`
    },
    data: qs.stringify({
        message: msg_data,
    })
};

async function getRequest(msg){
  // LINE Notify に送る
  config.data="message=\n" + msg
  try {
    const responseLINENotify = await axios.request(config);
    console.log(responseLINENotify.data);
  } catch (error) {
    console.error(error);
  }
}

obniz.onconnect = async function () {

   //--- 変数の定義
   // 状態遷移
   const s0 = 0;
   const s1 = 1;
   const s2 = 2;
   var s = 0;
   // 制御フラグ
   var lid_state_cnt = 0;  // ふたが開いている時間を計測
   var button_flg = true;  // ボタンを押した状態のフラグ
   var line_send = false;  // LINEへメッセージを送信完了のフラグ
   // 時計データ
   var h_time = 0; // 時
   var m_time = 0; // 分
   var s_time = 0; // 秒

   //--- インターフェースの初期設定 ---
   // ディスプレイのクリア
   obniz.display.clear();
   // センサのIO入力設定
   obniz.io1.output(true);   //センサの電源用
   obniz.io2.output(false);  //センサのGND用

   // ボタン io0がtrue(スイッチがポップアップ、フタがオープン)
   obniz.io0.input(function (value){
      console.log("value is " + value);
      if(value == false){
         button_flg = true;
      }else if(value == true){
         button_flg = false;
      }else{
         console.log("Button Error");
      }
   });

   // LINEのメッセージ生成
   function Making_LineMsg(){
      var currentDate; // 現在の時刻
      var displaystr;  // ディスプレイ表示のデータ
      var msgtmp;      // LINEメッセージ

      // 変数の初期化
      msgtmp = ""

      // 時刻データ取得
      currentDate=new Date();
      h_time = currentDate.getHours();
      m_time = currentDate.getMinutes();
      // s_time = currentDate.getSeconds();
      msgtmp = h_time + ":" + m_time + "\n";

      // 時刻に応じてLINEメッセージを決定
      if(5 <= h_time && h_time <= 6){ // 朝5時~朝7時
         msgtmp = msgtmp + "朝ご飯、終りました。"
      }else if(17 <= h_time && h_time <= 18){  // 夕方5時~夕方7時
         msgtmp = msgtmp + "晩ご飯、終りました。"
      }else{   // その他の時間帯
         msgtmp = msgtmp + "おやつ、終りました。"
      }

      return msgtmp;
   }

   // メインループ
   obniz.repeat(function(){
      if(s == s0){
          // フタが閉じている状態
          if(button_flg == true){
             // ボタンがONであれば、s0状態
             s = 0;
          }else if(button_flg == false){
             // ボタンがOFFであれば、s1状態
             lid_state_cnt = 0;
             s = 1;
          }else{
             // 状態維持
             s = 0;
          }
      }else if(s == s1){
          // フタが開いて、その時間を計測している状態
          lid_state_cnt += 1;
          if(button_flg == true){
             // ボタンがONであれば、s0状態
             s = 0;
          }else if(lid_state_cnt >= 5){
             // 5秒以上であれば、s2状態
             lid_state_cnt = 0;
             s = 2;
          }else{
             // 状態維持
             s = 1;
          }
      }else if(s == s2){
          // フタが5秒以上開いている状態
          if(button_flg == true){
             // ボタンがONであれば、s0状態
             getRequest(Making_LineMsg());
             s = 0;
          }else{
             // 状態維持
             s = 2;
          }
      }else{
         // 絶対に発生しないので、ディスプレイにエラー表示
         console.log("--Err--");
      }

   },1000); //1秒間隔のポーリング

};

デモ動画

ニーナにご飯やおやつをあげた後は、自動的にLineの家族グループにメッセージが送信された。家族のみんなは、ニーナの食事時間を簡単に共有できた。

ここに動画が表示されます

導入後は...

家族がいちばん忙しいときに、ペットの食事時間をスムーズに共有できた。ペット食事時間の記録システムは、共有しなくちゃ!、というストレスから解放できた。
ちなみに、ニーナはごまかすことができず、悶々しているようだ(ごめんね、メタボの予防になるので、長生きしてね)。

Bear_Deaf さんが 2021/04/30 に 編集 をしました。 (メッセージ: 初版)
Bear_Deaf さんが 前の水曜日の5:30 に 編集 をしました。 (メッセージ: タイトル記述法変更(2021/5/5))
ログインしてコメントを投稿する