編集履歴一覧に戻る
Takanakaのアイコン画像

Takanaka が 2021年05月16日21時24分21秒 に編集

初版

タイトルの変更

+

コーヒー豆の美味しさを保つために温度を監視してLINEで通知。

タグの変更

+

coffee

+

LINE

+

SHT31

メイン画像の変更

メイン画像が設定されました

記事種類の変更

+

製作品

本文の変更

+

![キャプションを入力できます](https://camo.elchika.com/802e8940fb73ba0128893558bf9df4c3df917ed7/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65633630663262352d346136362d343130642d613033662d3563343761306135633666332f66313030386231392d656365622d346165372d383363322d636261313330646461383061/) # きっかけ 急に「あれコーヒーが美味しくない!」ってことありますよね! そう、コーヒー豆は急激な温度変化に弱いのです。 そこで、コーヒー豆を美味しく保つには、一定の温度で保管管理する必要があります。 でも管理が難しい、、、。予期せぬ直射日光やネコの襲来があります。 そこで、obniz Boardを使って、コーヒー豆の保管棚の温度をモニタできる機能を作りました。 私はソフトは全くの素人、、苦労して実用性のある機能を仕立てました。 # 概要 ![完成した保管棚](https://camo.elchika.com/5a98fb75032dd4999d015b69d9cf915b6454d27b/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65633630663262352d346136362d343130642d613033662d3563343761306135633666332f63373037653535312d303161652d343337612d386537632d636330383034623631323963/) obniz Board iYと温湿度センサのSHT31を用いた簡単の温度アラートセンサーです。温度と湿度はobniz Boardのディスプレイに1秒毎に更新されて表示されます。環境温度が35℃を超えた場合は、LINE NotifyのAPIを使って、LINEに通知します。これにより、コーヒー豆の劣化を未然に防ぐことが出来ます。 obniz IoT コンテスト 応募作品です。 # DEMO [デモ動画はこちら](https://www.youtube.com/watch?v=vB-vpPFnH9k) <iframe width="560" height="315" src="https://www.youtube.com/embed/vB-vpPFnH9k" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe> 室温が35℃のことは少ないので、コテを近づけて実験しています。 ![キャプションを入力できます](https://camo.elchika.com/8ddd94e42578b4f93bc19f77b095883d8c0b69a3/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65633630663262352d346136362d343130642d613033662d3563343761306135633666332f61663736613564342d666465352d343730652d383836662d643565373936343262646161/) # 部品 | 部品 | 内容 | |:---:|:---| | IoT module | [ obniz Boad 1Y ](https://www.switch-science.com/catalog/6081/) | | 温湿度センサ | [GY-SHT31-D ](https://www.amazon.co.jp/%E2%9D%A4-%F0%9D%90%8D%F0%9D%90%9E%F0%9D%92%98-%F0%9D%90%98%F0%9D%90%9E%F0%9D%90%9A%F0%9D%90%AB%F0%9D%90%AC-%F0%9D%90%83%F0%9D%90%9E%F0%9D%90%9A%F0%9D%90%A5%E2%9D%A4/dp/B08CHKSLV9/ref=pd_day0_7?pd_rd_w=BQuAK&pf_rd_p=fab5dbe4-f0e5-4fa4-b9db-f6338912edc6&pf_rd_r=BHJBHRDR48G2MAY4035S&pd_rd_r=b8c7e55b-21c3-4542-b9b0-a9cd519c24d8&pd_rd_wg=tYYbH&pd_rd_i=B08CHKSLV9&psc=1) | # 回路ブロック図/結線 ![回路ブロック図](https://camo.elchika.com/a00081ad3fa4d56a977347ddf92a37317d953dfc/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65633630663262352d346136362d343130642d613033662d3563343761306135633666332f32326437343836372d396366332d343931352d383161392d666634666337333036653533/) # システム構成 1.アプリを起動する 2. 温度、湿度を読みとる 3. 35℃未満の場合は1秒待ってループ 4. 35℃を超えた場合は、LINE API で通知を行う。 # 開発内容 amazonで手に入れた温湿度センサは、パーツライブラリの中のSHT31で動くだろう期待していましたが、実際にはピン配列が異なり、SW素人には苦労しました。1つ1つ理解して最終的にピンアサインを変更することで無事読み取ることができました。 ```arduino:ピンアサインの変更 obniz.onconnect = async function () { tempsens = obniz.wired("SHT31", { vcc: 0, sda: 3, scl: 2, adr: 4, gnd: 1, addressmode: 4 }); } ``` 初手として、情報の見える化のためにobniz Board 1Yのディスプレイに、現在の温度と湿度を表示させることにしました。 ```arduino:温度湿度センサの読み出し var data = await tempsens.getAllWait(); console.log('temperature:' + data.temperature ,'humidity:' + data.humidity); obniz.display.clear(); obniz.display.font("Null", 30); obniz.display.print("" + parseInt(data.temperature) + "℃"); obniz.display.print("" + parseInt(data.humidity) + "%"); ``` 完成したのはこちらです。 ![ディスプレイ表示](https://camo.elchika.com/34d6330052ff637ff28b348b4546b8a2d421fa9b/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65633630663262352d346136362d343130642d613033662d3563343761306135633666332f32336366386334332d623030392d343536622d616265382d313730333233663139386635/) 慣れている人なら秒でできると思いますが、私はここまででだいぶ時間もかかったこともあり大喜びでした。 LINEで通知する部分も苦労しました。LINE Notifyからログインしてトークンを取得するまではスムーズでしたが、通知システムは文献が少なく悩みました。node.jsだとライブラリもあり便利だとわかり挑戦してみることにしました。 サンプルコードを参考に理解を進めました。私自信node.js自体も全く知らず、開発環境からスタートしました。require関数で読み込むところで躓いてしまい時間が掛かりましたが、node app.jsで実行することを覚えました。 ```arduino:苦労した箇所 var fs = require( 'fs' ); var Canvas = require( 'canvas' ), Image = Canvas.Image; const axios = require('axios'); const qs = require('querystring'); const Obniz = require('obniz'); const obniz = new Obniz('OBNIZ_ID_HERE'); const LINE_TOKEN = 'LINE_NOTIFY_TOKEN_HERE'; const config = { url: 'https://notify-api.line.me/api/notify', method: 'post', headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'Authorization': `Bearer ${LINE_TOKEN}` }, data: qs.stringify({ message: `35℃を超えました!!!`, }) }; ``` 完成したのがこちらです。 ![キャプションを入力できます](https://camo.elchika.com/23076d2fdbe8e2c514157ff85742e852bcd15664/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65633630663262352d346136362d343130642d613033662d3563343761306135633666332f65636235643639622d316432312d346530632d623537332d303931393332633330613962/) # 参考資料 - [Line Notify](https://notify-bot.line.me/ja/) - [node.js](https://nodejs.org/ja/) - [obniz パーツライブラリ](https://obniz.io/sdk/parts) - [郵便物が届いたらLINEにお知らせ](https://blog.obniz.com/make/notify-line-mail-arrivesl) # あとがき node.jsの理解に時間がかかってしまい、今回は通知どまりでしたらが、今後は、WEBからグラフ表示が確認できるようにして、コーヒーが劣化するメカニズムの解析を進めていきたいと思います。ソフトウェアはずっと避けていましたが、obnizを触れたおかげで少し可能性を感じ、なによりも自信に繋がったと感じます。今後も楽しく進めていきたいと思います。 # ソースコード node.jsを使用して作成しました。 ```arduino:SHT31-Temp 'use strcit'; var fs = require( 'fs' ); var Canvas = require( 'canvas' ), Image = Canvas.Image; const axios = require('axios'); const qs = require('querystring'); const Obniz = require('obniz'); const obniz = new Obniz('OBNIZ_ID_HERE'); const LINE_TOKEN = 'LINE_NOTIFY_TOKEN_HERE'; const config = { url: 'https://notify-api.line.me/api/notify', method: 'post', headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'Authorization': `Bearer ${LINE_TOKEN}` }, data: qs.stringify({ message: `35℃を超えました!!!`, }) }; obniz.onconnect = async function () { tempsens = obniz.wired("SHT31", { vcc: 0, sda: 3, scl: 2, adr: 4, gnd: 1, addressmode: 4 }); while (1) { var data = await tempsens.getAllWait(); console.log('temperature:' + data.temperature ,'humidity:' + data.humidity); obniz.display.clear(); obniz.display.font("null", 30); obniz.display.print("" + parseInt(data.temperature) + "℃"); obniz.display.print("" + parseInt(data.humidity) + "%"); if (data.temperature > 35){ console.log('over temp!') try { const response = await axios.request(config); console.log('response OK!:' + response.data); console.log('POST DONE!'); obniz.display.clear(); obniz.display.font("null", 30); obniz.display.print("35℃ "); obniz.display.print("OVER!!!"); } catch (error) { // ネットワーク console.log('POST fail……'); console.error(error); } passFlag = true; break; }else{ } await obniz.wait(1000); } } ```