syoshoのアイコン画像

酔い具合通知デバイス「Nomaniz」

syosho 2021年05月16日に作成

酔い具合通知デバイス「Nomaniz」

酔い具合をLINEでグループに通知してくれる装置「Nomaniz(ノマナイズ)」
酔っぱらって呂律が回らなくなる前に迎えに来てもらえる超画期的なアイテムです。
【注意】本装置はジョークであり、正確な呼気アルコール濃度を計測できるものではありません。お酒は一滴でも飲めば運転してはいけません!

装着

使い方

  1. obnizを起動します。(センサが安定するまで2分ほどかかるので食事開始と同時に電源を入れましょう)
  2. センサを顔の前10センチくらいに持ってきます。
  3. 酒を飲んだりします。
  4. ほろ酔いを検知すると指定したLINEGroupに通知が飛びます。

使用部品

  • obniz 1Y
  • MQ-3 module (こいつの類似品をアマゾンで購入しました。)

ケース

ケースは以下のサイトのものをサイズが合うように拡大して3Dプリンタで印刷しました。
ありがとうございます。
キャプションを入力できます

https://kitto-yakudatsu.com/archives/6376
https://www.thingiverse.com/thing:2893581

構成図

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

キャリブレーション

本装置で知りたいのは呼気中に含まれるアルコール量(mg/L)です。
データシートによると、センサーから出力されるのは様々な種類のガスと反応して得られた合算値です。
アルコールに対する変化量が他の気体より大きいのが本センサーの特徴ですが、気温/湿度による影響は無視できません。
したがって食事中の室内雰囲気において正確な呼気アルコール濃度を取得するのは不可能です。
飲酒量と酔い具合に関しても個人差があるので、「酔った/酔ってない」の2値に分けるとして自分の感覚でキャリブレーション?することとします。

参考記事

https://nootropicdesign.com/projectlab/2010/09/17/arduino-breathalyzer/
酒の種類とか酸素濃度などの環境で変わってきそう。blood alcohol content (BAC)とセンサ出力に相関はありそうだが正確な値の取得は難しい。

方法

上撰しか勝たん
ワンカップ大関を飲んでから2分後の呼気アルコールを計測します。
理由は大体これくらいで私はほろ酔いになるからです。(マジで個人差)
センサは起動してからセンサ温度が安定するまで2分ほどかかるそうなので、2分を目安としました。
冒頭の方法でobnizに装着し、口から5センチほど離して測定しました。
四日四晩ワンカップを飲み続けた結果、おおよそセンサの差す値が「2.8V」程度であることが分かったので、こちらを閾値と設定します。

ソースコード

今回は簡単にNode.jsで実装しました。クソコードご了承ください。。

Nomaniz

const fs = require("fs"), request = require("request"), Obniz = require("obniz"); const LINE_NOTIFY_URL = "https://notify-api.line.me/api/notify"; const TOKEN = "Hd1n7AoAJDuGqbjvw3VI311i0NxCFHuVZff5u38eyV9"; const MESSAGE = "いまめっちゃ飲んでまーす。"; const HEADERS = { "Content-Type": "application/x-www-form-urlencoded", "Authorization": "Bearer " + TOKEN }; const OPTIONS = { url: LINE_NOTIFY_URL, method: "POST", headers: HEADERS, json: true, form: { message: MESSAGE } } const valtageThreshold = 2.8; var obniz = new Obniz("1736-0982", { access_token:"AZ4xTkWbgjqZVb3pQsI1VNaRb9GPf9VFBgxN3Gn64emq5McVX5g6oT2B8sZVxlda" }) let passCount = 10; let passFlag = true; let oneshotFlag = false; obniz.onconnect = async function() { var mq3 = obniz.wired("MQ3", {vcc:3, gnd:2, do:1, ao:0}); obniz.display.clear(); obniz.display.print("HEAT WAITING..."); await mq3.heatWait(); obniz.display.print("READY"); mq3.voltageLimit = valtageThreshold; mq3.onchangeanalog = function(voltage) { passCount--; if(passCount <= 0){ passCount = 10; obniz.display.clear(); obniz.display.pos(0,0); obniz.display.print(voltage + " v"); } } obniz.repeat(async () => { mq3.onexceedvoltage = function(voltage) { passFlag = false; } if(passFlag | oneshotFlag){ return; } await request(OPTIONS, async(error, response, body) => { console.log(body); oneshotFlag = true; passFlag = true; if(error){ console.log(error); } }); }, 300); }

まとめ

こんなクソコードでも60行程度でLINEに通知するIoTデバイスを開発できるObnizは優秀だなと思います。
実際コーディングには30分程しかかかっていません。
今後の展望としては、今回の仕様では電源を接続する必要があるので実際に使用するとなるとオンラインのみに限定されるのですが、バッテリーを装着することで居酒屋やバーで活躍できるようになります。
キャリブレーションで紹介したリンクではBACとセンサの出力値の関係を調査していましたが、あれを参考にしておおよそのBACを画面等で確認できるようにしても面白いかもしれません。

1
1
syoshoのアイコン画像
エルゴエンジニア。
  • syosho さんが 2021/05/16 に 編集 をしました。 (メッセージ: 初版)
ログインしてコメントを投稿する