概要
ペット食事時間の記録システムは、ペットが食事をしたことを、Lineグループに自動投稿する情報共有ツールである。ペットフード保存容器のフタを戻したときに、家族にLineでペットの食事時間を共有できる。
問題
うちにはニーナという食いしん坊なわんちゃんがいる。ごはんをもらっていないよ、と嘘をつくのがとても上手だ。家族はだまされて、2回以上もあげるときもある。家族内の共有をしたくても、朝夕はとても忙しくLineを打つ時間がない。そこで、obnizの助けを借りる。
概要仕様
- 開いているペットフード保存容器のフタを閉めたたとき、家族のLineグループにメッセージを送る
・5秒よりはやくフタがしまった場合は、メッセージを送らない
・5秒以上ひらいたフタがしまった場合は、メッセージを送る - メッセージは家族が登録したLineグループに送る
メッセージは、以下のとおり(HH:MMはふたがしまったときの時間)
・朝ご飯(5時~8時)の場合は、「HH:MM 朝ご飯、終りました。」
・晩ご飯(17時~8時)の場合は、「HH:MM 晩ご飯、終りました。」
・それ以外の時間の場合は、「HH:MM おやつ、終りました。」
システム図
システム図を以下に示す。
部品表
部品表を以下に示す。
番号 | 部品名 | 型式 | 数量 |
---|---|---|---|
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
さんが
2021/05/05
に
編集
をしました。
(メッセージ: タイトル記述法変更(2021/5/5))
ログインしてコメントを投稿する