お猫様ほかほか監視装置


こちらはIoTLT Advent Calendar 2021 | Advent Calendar 2021 - Qiita 21日目の記事です。

はじめに

寒くなってきたので猫が3匹いる我が家では電気毛布が欠かせません(4枚くらい稼働中)
しかし最近の電気毛布は勝手に電源が切れる安全仕様になっていて、電気毛布が勝手に止まっています(切れないタイマー)
電気毛布が切れてお猫様が寒い思いをしてしまっている OR 電気毛布の上でお猫様がほかほかになりすぎていないかをチェックして冬を快適に過ごしてもらいたいというものです

できたもの

電気毛布の上にサーモセンサを置いて、電気毛布上の温度を計測
10分ごとにLINE Notifyで温度を通知してくれる

環境・材料

接続方法


センサとobnizのピン配置もこちら を参考にさしていきましょう

obniz側 センサ側
0 GND GND 電源端子
1 VCC VCC 電源端子(5V ±10%)
2 SDA I2C(5V) データ
3 SCL I2C(5V) クロック

どこを測る?

4×4の16箇所の温度を取れるので、猫さんがいる時といない時の電気毛布の表面の温度を測ると、だいたい皆同じ温度の中に少し高いところがあったので、猫さんは27°以上のところらへんにいそうというのがわかりました。

しかし測ってみると猫さんはすぐに動くので猫さんを測るではなくて、むしろいなさそうな端っこあたりを固定にして電気毛布の温度を測り、三段階に分けて、
20°を下回ると電気毛布が切れている
30°を超えると猫さんがほかほかになり過ぎている、
それ以外は通常の温度を通知というアラートにしました

コード

node.js
'use strcit';
const axios = require('axios');
const qs = require('querystring');
const BASE_URL = 'https://notify-api.line.me';
const PATH =  '/api/notify';
const LINE_TOKEN = '***';  //notifyのトークン
const Obniz = require('obniz');
const obniz = new Obniz('***'); // Obniz_ID
const botmsg = 'ホカぺ監視中'
const botmsghot = '熱くなってきてるよ'
const botmsgcld = 'ホカぺ切れたね'
let config = {
    baseURL: BASE_URL,
    url: PATH,
    method: 'post',
    headers: {
        'Content-Type': 'application/x-www-form-urlencoded',
        'Authorization': `Bearer ${LINE_TOKEN}`
    },
    data: 'message=${botmsg}'
};
obniz.onconnect = async function () {
    obniz.display.clear();
    obniz.display.print('Hot.....');
    var i2c = obniz.getFreeI2C();
    obniz.io1.output(true);
    obniz.io0.output(false);
    i2c.start({mode:"master", sda:2, scl:3, clock:100000});

    obniz.repeat(async function(){
      await obniz.wait(100);
      i2c.write(0x0A, [0x4C]);
      await obniz.wait(160);
      var data = await i2c.readWait(0x0A, 35);
      var t = [];
      for(var i=2; i<34; i++){
        t[i] = ((data[i]+(data[i+1]<<8))*0.1).toFixed(1);
        console.log(t[i]);
        i++
      }
      if(t[8] > 30){
        config.data =  "message="+ botmsghot + t[8] + "°";
      }else if(t[8] > 20){
        config.data =  "message="+ botmsg + t[8] + "°";
      } else {
        config.data =  "message="+ botmsgcld + t[8] + "°";
      }
        axios.request(config).then((res) => {
          console.log(res.status)
        })
        .catch((error) => {
            console.log(error);
        });
      }, 600000)
}

まとめ

サーモ楽しい!温度を測るだけでこんなに楽しいとは!という感じで楽しいものができました。
温度を通知するものはできたので、LINEnotifyではなくLINE Botにして電気衣毛布の電源をコントロールするところに次は行きたいな
とりあえず10分おきに通知が来るのでとても煩わしいので、もう少しアラートを絞ろうと思います。