Closed3

2時間でobnizを活用した温度記録デバイスを作る

shuyin02shuyin02

ライブラリのインストール

npm で実施

npm i obniz
npm i @line/bot-sdk
npm i express
npm i stein-js-client

ターミナル上で入力
よくよく考えたら、今回push message だからexpressいらない

botの作成

以下、JavaScriptとNode.jsにて作成
今回は温度検知してpushだからこれ
https://qiita.com/n0bisuke/items/7c2616068cb918ba31a5

コードベタばりで一斉送信完了

google sheetへの記録

いつものStein

ここまでのコード
// ########################################
//          LINEBot イベント処理部分
// ########################################
const config = {
    channelSecret: '設定したチャネルシークレット',
    channelAccessToken: '設定したチャネルアクセストークン'    
};
const line = require('@line/bot-sdk');
const client = new line.Client(config);
const report = async () => {

    const messages = [{
        type: 'text',
        text: 'いっせい送信です!'
    }];

    try {
        const res = await client.broadcast(messages);
        console.log(res);
        await store.append("シート1", [
            {
              日時: "a",
              温度1: "s",
              温度2: "s",
            }
          ]);        
    } catch (error) {
        console.log(`エラー: ${error.statusMessage}`);
        console.log(error.originalError.response.data);
    }
}

report();
shuyin02shuyin02

obnizのところを作る

使用するセンサー類

obniz Board 1Y
温度センサー:LM60
フルカラーLED:WS2811 後述しますが使いませんでした

詳細なコード
let temp1 = 0;
let temp2 = 0;

const Obniz = require('obniz');
const obniz = new Obniz('****-****');
// obnizと接続確立したとき
obniz.onconnect = async () => {
    obniz.display.clear();
    obniz.display.print('obniz Ready');
    obniz.switch.onchange = async function (state) {
        // スイッチ右でtemp1、左でtemp2
        if (state === 'right') {
            console.log('right');
            obniz.display.clear();
            obniz.display.print('right');
            temp1 = await getObnizTemp1();
            console.log(temp1)
        } else if (state === 'left') {
            console.log('left');
            obniz.display.clear();
            obniz.display.print('left');
            temp2 = await getObnizTemp2();
            console.log(temp2)
        }
    }
}

// 温度センサから値を取得して返す
const getObnizTemp1 = async () => {
    // 温度センサの利用
    const tempsens = obniz.wired('LM60', { gnd: 6, output: 7, vcc: 8 });
    const temp1 = await tempsens.getWait();
    console.log('obniz temp:', temp1);
    return temp1;
}
const getObnizTemp2 = async () => {
    // 温度センサの利用
    const tempsens = obniz.wired('LM60', { gnd: 9, output: 10, vcc: 11 });
    const temp2= await tempsens.getWait();
    console.log('obniz temp:', temp2);
    return temp2;
}
shuyin02shuyin02

組み合わせて全体作る

現在の日付出力

詳細なコード
//日付の取得
let year = now.getFullYear();
let month = now.getMonth()+1;
let date = now.getDate();
let hour = now.getHours();
let min = now.getMinutes();
let sec = now.getSeconds();

//obniz起動したら日時をログとgoogle sheetに記載
const SteinStore = require('stein-js-client');
const store = new SteinStore('作成したAPI URL');
const Obniz = require('obniz');
const obniz = new Obniz('****-****');
// obnizと接続確立したとき
obniz.onconnect = async () => {
    console.log(year + '年' + month + '月' + date + '日');
    console.log(hour + ':' + min + ':' + sec);
    obniz.display.clear();
    obniz.display.print('obniz Ready');
            await store.append("シート1", [
            {
              日付: year + '年' + month + '月' + date + '日',
              時間: hour + ':' + min + ':' + sec,
              温度1: "s",
              温度2: "s",
            }
          ]);   
}

実際のプロダクトとコード

LEDについて

本来は、正常温度の時は青色、温度以上があった時は赤色にLEDを点灯させる予定でしたが、省電力のためにスリープにしてしまうと、LEDも消えてしまうため、LINE Botへのアラートのみとしました。ごめんなさい。


指定した時間ごとに温度ログをとります(今回は1分間隔)

温度をとっていない時はスリープしています。

温度異常が発生した場合は、LINE に通知がきます。

この時は、意図的に表示温度を操作しています。

詳細なコード
'use strict';
let temp1 = 0;
let temp2 = 0;
let now;
let year;
let month;
let date;
let hour;
let min;
let sec;

const SteinStore = require('stein-js-client');
const store = new SteinStore('発行したSteinAPIURL');

// ########################################
//          obniz処理部分
// ########################################
const Obniz = require('obniz');
const obniz = new Obniz('****-****');
// obnizと接続確立したとき
obniz.onconnect = async () => {
    now = new Date();
    year = now.getFullYear();
    month = now.getMonth()+1;
    date = now.getDate();
    hour = now.getHours();
    min = now.getMinutes();
    sec = now.getSeconds();

    obniz.display.clear();
    //温度の記録
    console.log(year + '年' + month + '月' + date + '日');
    console.log(hour + ':' + min + ':' + sec);
    temp1 = await getObnizTemp1();
    temp2 = await getObnizTemp2();
    await store.append("シート1", [
            {
              日付: year + '年' + month + '月' + date + '日',
              時間: hour + ':' + min + ':' + sec,
              温度1: temp1,
              温度2: temp2,
            }
          ]);      

    if(temp1 > 30 || temp2 > 30){ //温度帯に合わせて記載(冷蔵 > 5、冷凍 > -15)
        await report();
    }
    obniz.sleepMinute(60*4); // ()の中は分単位で指定

}

// 温度センサから値を取得して返す
const getObnizTemp1 = async () => {
    const tempsens = obniz.wired('LM60', { gnd: 6, output: 7, vcc: 8 });
    const temp1 = await tempsens.getWait();
    console.log('obniz temp:', temp1);
    return temp1;
}
const getObnizTemp2 = async () => {
    const tempsens = obniz.wired('LM60', { gnd: 9, output: 10, vcc: 11 });
    const temp2= await tempsens.getWait()+10;
    console.log('obniz temp:', temp2);
    return temp2;
}

// ########################################
//          LINEBot イベント処理部分
// ########################################
const config = {
    channelSecret: '取得したチャネルシークレット',
    channelAccessToken: '取得したアクセストークン'    
};
const line = require('@line/bot-sdk');
const client = new line.Client(config);
const report = async () => {

    const messages = [{
        type: 'text',
        text: `温度異常が発生しています
冷ケース1:${temp1}
冷ケース2:${temp2}`
    }];

    try {
        const res = await client.broadcast(messages);
        console.log(res);
     
    } catch (error) {
        console.log(`エラー: ${error.statusMessage}`);
        console.log(error.originalError.response.data);
    }
}
このスクラップは2021/12/21にクローズされました