使っているときには、そろそろなくなりそうだなと思うのですが、でかけているときには購入することをつい忘れてしまうことが多いないですか。それを通知してくれるような仕組みがないかなと思って制作してみました。スマートスケールを置き場にしておけば常に監視して、購入時期を教えてくれます。
購入通知を仕事終わりなどで通知してくれると、買い物の忘れもないかなと思って仕事の始まりぐらい、終わりぐらいに都合よく教えてくれますし、内容をアマゾンの商品購入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-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;
}
-
ueponx
さんが
2021/05/16
に
編集
をしました。
(メッセージ: 初版)
ログインしてコメントを投稿する