ueponxのアイコン画像

なくなりそうになったら購入時期を教えてくれるスマートスケール            

ueponx 2021年05月16日に作成  (2021年05月16日に更新)

なくなりそうになったら購入時期を教えてくれるスマートスケール            

なくなりそうになったら購入時期を教えてくれるスマートスケール

使っているときには、そろそろなくなりそうだなと思うのですが、でかけているときには購入することをつい忘れてしまうことが多いないですか。それを通知してくれるような仕組みがないかなと思って制作してみました。スマートスケールを置き場にしておけば常に監視して、購入時期を教えてくれます。
購入通知を仕事終わりなどで通知してくれると、買い物の忘れもないかなと思って仕事の始まりぐらい、終わりぐらいに都合よく教えてくれますし、内容をアマゾンの商品購入URLを送るようにしておけば、ワンタッチで購入もできます。

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

システム概要

  • 適応対象:5kg以下の重さがわかるもの。使用により重さが変化するもの(お米、洗濯洗剤、台所洗剤、トイレットペーパー、シャンプー等)
  • 操作方法:センサーに乗せておく。事前に新品時の重さと補充時の重さの設定が必要
  • 拡張性:LINE Notifyの送信先をグループに設定することで、より購入の忘れを防ぐことができる。重複購入防止策のために、補充されたこともLINE Notifyで送信することも考える(一人暮らしようには不要ですが)

使用した部品

部品 説明 ・備考
obniz Board / obniz Board 1Y obniz
RaspberryPi 3B Node.jsを実行するホスト
HX711センサー 電子スケール ロードセル計量センサ
デジタル・マイクロサーボ SG90 重量をアナログ値で表示

キャプションを入力できます

使用したネットワークサービス

サービス名 備考
LINE Notify 連携したWebサービスからの通知を公式アカウントである「LINE Notify」から受信できるサービス

LINE Notify

Node.jsライブラリ

ライブラリ名 内容
line-notify-nodejs LINE Notifyライブラリ
node-cron Node.js内でcronのような定時実行を行うライブラリ

構成図

構成図

ソースコード

var Obniz = require("obniz");
//lineNotifyのトークンを入力する
const lineNotify = require('line-notify-nodejs')('---LINENotifyトークンを入力---');
const cron = require('node-cron');

//ObnizのデバイスIDを入力する 
let obniz = new Obniz("OBNIZ_ID_HERE");

let value = 0;
let weight = 0;
let weightMessage = "";
let sensor;
let servo;

const WeightMAX = 400; //g
const triggerWeight = 40; //g

obniz.onconnect = async function () {
    //hx711 設定
    sensor = obniz.wired("hx711" , {gnd:0, dout:1, sck:2, vcc:3} );
    sensor.setOffset(-8231198); //デバイスごとに調整が必要
    sensor.setScale(480.0); //デバイスごとに調整が必要
    //SG90 サーボ設定
    servo = obniz.wired("ServoMotor", {gnd:4,vcc:5,signal:6});
    servo.angle(0);

    //hx711 計測
    value = await sensor.getValueWait(10);
    weight = numberValueRound(Math.abs(value), 0.01);
    weightMessage = "残りの重さは" + Math.abs(weight) + "gです。";
    console.log(weightMessage);
    
    //SG90 サーボ制御
    servo.on();
    angle = weight / WeightMAX * 180;
    servo.angle(angle); 
    await obniz.wait(1000);
    servo.off();
}

cron.schedule('0 0 9,18 * * *', async function () {
  console.log("計測処理開始!");

  //hx711 計測
  value = await sensor.getValueWait(10);
  weight = numberValueRound(Math.abs(value), 0.01);
  weightMessage = "残りの重さは" + Math.abs(weight) + "gです。";
  console.log(weightMessage);
  
  //SG90 サーボ制御
  servo.on();
  await obniz.wait(1000);
  angle = weight / WeightMAX * 180;
  servo.angle(angle); 
  await obniz.wait(1000);
  servo.off();
  //console.log(angle,weight);

  //送信メッセージの作成
  if(weight < triggerWeight){
    //LineNotify送信
    lineNotify.notify({
      message: "そろそろ無くなりそうですよ。購入しましょう!" + weightMessage
    })
  }
  console.log("計測処理完了!");
});

//指定桁の四捨五入
function numberValueRound(value, base) {
  return Math.round(value * base) / base;
}

実行の様子

コンソールでの実行の様子

LINE Notifyでのメッセージ通知

食器洗剤を計測

1
  • ueponx さんが 2021/05/16 に 編集 をしました。 (メッセージ: 初版)
ログインしてコメントを投稿する