こんにちは。ポン吉です。
先日、トイレにこんな張り紙がされておりました。お父さんがトイレ入った後は危険!。世界平和のため5時間使用禁止しよう!と書かれておりディスり方が上手くなったなぁと我が子の成長を実感(笑)父親の威厳回復のため、トイレの臭いを可視化し身の潔白を証明したいと思います。
家族で食べているもの同じなんだから臭いも同じでしょ~(適当な仮説)
ブレッドボードにセンサを配線し検証してもよいのですが、スマートホーム本番運用を想定すると水回りであるトイレへの設置は不安あり。常時設置を前提にスマートに実装したいと思います。
今回は Bit Trade Oneさんの臭気センサ基盤 を使いました。素晴らしい商品ありがとうございます!
こちらの記事を読めば、ラズパイによる臭いの可視化が誰でも簡単に出来るようになります!
今回のテーマはこちら!
- 家族からトイレ後の臭いでディスられている世の中のお父さんを救いたい
- 実際に臭いデータを収集し分析。「お父さん VS 娘A」 どっちが臭いのかをガチで勝負!
それではやってみましょう~♪
【準備】Raspberry Pi に 臭気センサ基盤 をセットアップ
難易度:★☆☆☆☆
- Raspberry Pi Zero WH に 臭気センサ拡張基盤 を接続
- 必要パッケージをインストール
- Raspberry Pi の設定変更とOS再起動
- 臭い計測プログラム作成(Python)
注意
臭気センサ部分は非常に高温となります。取り扱いにはご注意ください。
今回は小型のRaspberry Pi Zero WHを使って構築します。ラズパイ3や4でも動作可能です。
臭気センサはこちらの基盤を使って構築します。
ラズパイ自体も品薄で購入が難しい状況が続いています。ラズパイの在庫と価格をリアルタイム確認できるページを作りました。ラズパイを購入しようとしている方は是非参考にしてみてください。
Raspberry Pi Zero WH に 臭気センサ拡張基盤 を接続
ラズパイの電源は切った状態で接続しましょう。GPIOピンを曲げないように丁寧に接続しましょう。
左の丸いところが臭いセンサ。高温注意と記載あり。さらにアナログセンサを2つ接続可能なGroveコネクタを備えています。
おなじみのRaspberry Pi Zero WH。今回はGPIOヘッダピン付きを使います。
接続後はジャンパ線もなくシンプル(当たり前)。拡張基盤を接続すると厚みが出るためラズパイケースは使えません。
必要パッケージをインストール
臭気センサによる「臭いの可視化」にCPUパワーはほぼ使いません。Raspberry Pi Zero, Raspberry Pi 3, Raspberry Pi 4 どのラズパイでも動作しますが、省エネ観点でZeroをおすすめします。
注意
最新Raspberry Pi OS bullseye での構築例を紹介します。以前のRaspberry Pi OS buster等では python ⇒ python3 pip ⇒ pip3 と読み替えて実行してください。
ラズパイ初期セットアップの詳細は、上記記事を参照してください。
sudo apt update
sudo apt install -y python3-pip
pip install smbus
必要なパッケージは少ないのですぐに終わります。
Raspberry Pi の設定変更とOS再起動
sudo raspi-config nonint do_serial 2
sudo raspi-config nonint do_i2c 0
sudo raspi-config nonint do_spi 0
sudo reboot
raspi-configコマンドで画面操作から設定も可能ですが、コマンドで実施する方法を記載します。コピペしてでサクッと終わらせましょう。設定後にラズパイを再起動しています。
臭い計測プログラムを作成(Python)
Bit Trade OneさんのGitHubに説明やサンプルプログラムが置いてあります。こちらのソース「adrszOD-sample.py」をベースに必要部分を切り出してプログラムを書いてみました。
5行目と7行目の閾値電圧については、実環境に合わせて変更して使ってみて下さい。
ファイル名:toilet.py
import sys, smbus, time, datetime
########## 設置環境に応じて設定変更が必要 ##########
# 1.最大臭気計測モードに移行する閾値電圧
threshold_volts_upper = 0.73
# 2.通常モードに戻る閾値電圧
threshold_volts_lowwer = 0.68
######################################################
# Raspberry Pi I2C BUS番号である1を指定
i2c = smbus.SMBus(1)
# デバイスのアドレスを指定
addr=0x68
# 電圧計算用の定数
Vref=2.048
# 最大臭気計測モードのフラグ
kusai_flag = False
# 最大臭気記録用の変数
volts_max = 0
# 電圧計算用のビット演算関数
def swap16(x):
return (((x << 8) & 0xFF00) |
((x >> 8) & 0x00FF))
# 電圧計算用のビット演算関数
def sign16(x):
return ( -(x & 0b1000000000000000) |
(x & 0b0111111111111111) )
# メイン処理
while True:
# 臭気センサの電圧を取得
i2c.write_byte(addr, 0b10011000) #16bit
time.sleep(0.2)
data = i2c.read_word_data(addr,0x00)
raw = swap16(int(hex(data),16))
raw_s = sign16(int(hex(raw),16))
volts = round((Vref * raw_s / 32767),5)
# 現在時間と臭気センサ電圧を出力
time_str = datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S, ')
print(time_str + str(volts))
# 何やら臭くなり閾値電圧を超えた場合、最大臭気計測モードに移行
if (kusai_flag == False and volts > threshold_volts_upper):
print("トイレの臭いがちょっと臭くなりました")
start_time=time.perf_counter()
start_time_str = datetime.datetime.now().strftime("%Y/%m/%d %H:%M:%S")
kusai_flag = True
# 臭いが落ち着き閾値電圧を下回った場合、通常モードに移行
elif (kusai_flag == True and volts < threshold_volts_lowwer):
print("トイレの臭いが正常に戻りました")
end_time=time.perf_counter()
end_time_str = datetime.datetime.now().strftime("%Y/%m/%d %H:%M:%S")
print("・トイレの臭い検知時刻=" + start_time_str)
print("・トイレの臭い解消時刻=" + end_time_str)
print("・臭いポイント[v]=" + str(volts_max))
print("・臭い滞留時間[s]=" + str(int(end_time-start_time)))
volts_max = 0
kusai_flag = False
# センサ電圧値がこれまでの最大値を超えた場合に更新
if (kusai_flag == True and volts_max < volts ):
volts_max = volts
sys.stdout.flush()
# 電圧取得の0.2秒と合わせ5秒ごとに計測となるようにsleepさせる
time.sleep(4.8)
基盤で使用している臭気センサは「TP-401T」とのこと。以下に反応するようです。
屋内での低濃度の汚染ガスや臭いを検知します。硫化水素、アンモニア、水素、アルコール、一酸化炭素、メタンなど有機揮発性気体、プロパン、タバコ、プロピレングリコール、フェノール、アセトン、木材燃焼発生した煙など様々な気体に対応しています。
テストプログラムを動かしてお酒や口臭や握りっぺ等で動作チェック!
※反応は個人差あり
プログラム実行例:python toilet.py
2022/04/26 21:50:16, 0.84196
トイレの臭いがちょっと臭くなりました
2022/04/26 21:50:21, 0.86853
<中略>
2022/04/26 21:56:47, 0.69602
2022/04/26 21:56:52, 0.69071
2022/04/26 21:56:57, 0.67915
トイレの臭いが正常に戻りました
・トイレの臭い検知時刻=2022/04/26 21:50:16
・トイレの臭い解消時刻=2022/04/26 21:56:57
・臭いポイント[v]=0.86853
・臭い滞留時間[s]=400
臭気センサの電圧が大きいほど臭いことになります。臭いに応じて数値が変化すれば確認OKです。
【実践】トイレに設置して臭いデータを収集!分析してみよう
それでは先ほどセットアップしたラズパイZeroを、トイレに設置してデータを取得していきましょう。
トイレ設置場所を検討
ウォシュレット付きのトイレであれば電源コンセントがトイレ内にあると思います。ここからラズパイの電源を取りましょう。無線LANについても電波が届いている事が前提となります。
設置場所として埃や水が付きにくい場所を探します。うちのトイレ(TOTO:ネオレストTCF9783J)は側面後方のカバーが外せます。ちょうど埃や水が掛からなそうなのでここに設置。ここならラズパイのケースが無くても安心。
お父さんと娘の 臭い対決結果を公開!
盗撮、盗聴、盗臭?(そんな単語ないか)と言われたくないので家族の同意を取りデータ分析開始!
「お父さん VS 娘」トイレ臭い対決の結果
お父さんのうん〇のほうが臭い事がIoT技術により判明されました・・・。いやいやいや!統計学的にサンプル数が少なくこんなの証明にならない!と言い訳を残し再びリベンジ予定。
世界のお父さんの無念晴らせず・・・(涙)
まとめ
- やはりお父さんのうん〇の方が臭かった(敗北) ストレスや老化等の影響か・・・
- 臭いの変化は検知できたが人間が感じる不快なにおいを定量化するには改善の余地あり
- 複数のガスセンサを試して「うん〇の臭い検知に特化したベストセンサ」を見つけたい
これぞInternet of Toilet!ストレスとうん〇の臭いについても分析したい
おまけ
ウォシュレット操作をリモコンで操作するトイレの場合、ラズパイから赤外線リモコン経由でトイレ遠隔操作が可能です。臭いがキツイ時に強制的に流したり、ウォシュレット強制発射による嫌がらせで退出を促す等、未来を感じるスマートホーム化が実現可能(笑)
スタンフォード大学が未来のトイレを先取りすぎていて凄いので紹介!トイレで肛門認証・・だと!?これは家族でも同意得るのが難しい内容ですね・・・
プライバシー保護について
個人を特定した上でIoTデータを分析しないと有力な情報とならないケースが多いと感じています。そこで問題となるのが個人情報・プライバシー保護。今回は家族内なので了承を得るのは簡単?ですが、データのマスキング等して了承を得る努力が必要になると思います。