ueponx が 2021年05月16日23時13分24秒 に編集
初版
タイトルの変更
なくなりそうになったら購入時期を教えてくれるスマートスケール
タグの変更
obnizBoard1Y
obniz
HX711
SG90
LINE
メイン画像の変更
記事種類の変更
製作品
本文の変更
# なくなりそうになったら購入時期を教えてくれるスマートスケール 使っているときには、そろそろなくなりそうだなと思うのですが、でかけているときには購入することをつい忘れてしまうことが多いないですか。それを通知してくれるような仕組みがないかなと思って制作してみました。スマートスケールを置き場にしておけば常に監視して、購入時期を教えてくれます。 購入通知を仕事終わりなどで通知してくれると、買い物の忘れもないかなと思って仕事の始まりぐらい、終わりぐらいに都合よく教えてくれますし、内容をアマゾンの商品購入URLを送るようにしておけば、ワンタッチで購入もできます。 @[youtube](https://youtu.be/QlKjxWn_cRo) # システム概要 * 適応対象:5kg以下の重さがわかるもの。使用により重さが変化するもの(お米、洗濯洗剤、台所洗剤、トイレットペーパー、シャンプー等) * 操作方法:センサーに乗せておく。事前に新品時の重さと補充時の重さの設定が必要 * 拡張性:LINE Notifyの送信先をグループに設定することで、より購入の忘れを防ぐことができる。重複購入防止策のために、補充されたこともLINE Notifyで送信することも考える(一人暮らしようには不要ですが) # 使用した部品 | 部品 | 説明 ・備考 | |:---:|:---| | obniz Board / obniz Board 1Y | obniz | | RaspberryPi 3B | Node.jsを実行するホスト | | HX711センサー | 電子スケール ロードセル計量センサ | | デジタル・マイクロサーボ SG90 | 重量をアナログ値で表示 |  # 使用したネットワークサービス | サービス名 | 備考 | |:---:|:---| | LINE Notify | 連携したWebサービスからの通知を公式アカウントである「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; } ``` # 実行の様子   