Sympapaのスマートホーム日記

スマートなんとかはスマートじゃない方法でつくられている

トイレのニオイ対策(2): ウ〇チしたのを検出するセンサーをESP Home+ESP32+臭気センサーで試す

Sympapaです。一行で中身を表さなくてはいけないブログのタイトルってなかなか難しいですね(笑)


さて、前回のトイレのニオイ対策の記事では、トイレにナノイー発生機(脱臭機)を置いて、トイレに人が一定時間以上存在した場合にウ〇チをしたと判定してナノイー発生機の電源をオンにし一定時間経過後にオフにするようにしました。
sympapa.hatenablog.com


しかし、ひと言で「ウ〇チを完遂する時間」といっても人によってもおなかの調子によっても異なるのでトイレの滞在時間でウ〇チをしたか否かを判定するのは不確実ですし、クサさも人によっても腸の状態によっても異なる(お父さんのは特にクサイ!?)ので一定時間ナノイー発生機を動かすというのも理にかなっていない気がします。
そんなワケでウ〇チの臭いに反応するセンサーを使用して、ナノイー発生機を自動でオンオフしたいと思うワケです。


そもそもそんな面倒なことをしなくてもナノイー発生機を24Hr稼働させればいいって話かもしれませんが、ナノイー(やオゾンは)酸化によってニオイの物質を分解するものなので様々なモノを酸化させます。
人体への影響はオゾンの場合、許容濃度が0.1ppmとされています。まぁ生き物の場合は新陳代謝があるので多少酸化しても復活すると思いますが、モノは酸化による劣化が徐々に進んでいくのでナノイー発生機を24Hr稼働させるのはあまりよろしくないんじゃないかと思った次第です。
が、そんなことよりもなによりも、自動化こそが目的でありそのトリガーを臭いにするという手段こそが目的なのであります(笑)


そんなワケで今回は、ウ〇チの臭いを検出できそうなセンサーを探して、我が家で使用しているスマートホームシステム"Home Assistant"と接続するのにトライしたいと思います。

■試すセンサーを選ぶ

そもそも、ウ〇チの臭いの成分って何でしょう?
↓のページには「尿素であるアンモニア、腐った魚臭であるアミン、インドールスカトール、腐った卵臭の硫化水素、刺激臭のアセトアルデヒドなど」と書かれています。ふむふむ。
daiwaseibutsu.co.jp


できればラクをしたいので、我が家で使用しているスマートホームシステム"Home Assistant"へ簡単に接続できる「通信機能一体型」の臭気センサーを最初に探しましたが、Wi-FiやZigbbeで接続できる臭いセンサー的なものは、いわゆるキッチンのコンロで使用するガス(漏れ)を検出するものしか見つけられませんでした。
まぁ無いものは作れば良いということで、センサー単体を買ってESP32などのマイコンと組み合わせれば”Home Assistant"に接続出来るはずです。
ですが、何を隠そう私は電子工作はチンプンカンプンでESP32も"ESP Home"でしか使ったことが無く、ESP32とかArdinoのコードとか全くわかりません。
"ESP Home"であれば既にプラットフォームが用意されているセンサーを使えば、用意されたサンプルコードをコピペするだけです。しかも"Home Assistant"と接続する部分は何も考えなくてもアドオンを使って連携できちゃいます。なので"ESP Home"でプラットフォームが用意されているセンサーで出来るといいなぁと思うわけです。
あ、"Home Assistant"と"ESP Home"が何ぞ?という方は↓こちらをご覧ください↓
www.home-assistant.io
esphome.io


んで、日本語で「ウンチ 臭い センサー ESP32」とか(ESP32をardinoに置き換えたりとか)でググると、実際にウ〇チをしたことを検出するために使用している例が最も多く出て来るセンサーはフィガロ技研製の"TGS2450"です。"TGS2450"にはウ〇チの臭いを検出する一定以上の能力がありそうです。
たくさんヒットしますが例えば↓こちらのページとか。
qiita.com


"TGS2450"のデータシートによると「メチルメルカプタンや硫化水素といった硫黄化合物系ガスに対して、低濃度から非常に高い感度を示します」ってことなので、まぁ硫化水素を検出できるセンサーであればよいってことでしょうか。
しかし、"TGS2450"は海外での使用事例を探すと皆無で、当然ながらESP Homeで使用している事例も見つかりませんでした。
"TGS2450"はESP32に直接は接続できずトランジスタやら抵抗を組み合わせて回路を作らなくてはいけないし、単にセンサーを読み取るのではなくヒーターのオンオフ制御もしなくてはいけないようで、ハードル高そう。。。
ですが、手元に稼働していないESP32が無かったので、ESP32を購入するついでに"TGS2450"も秋月電子で発注しました。センサー自体は300円です。
ちなみに今回届いたESP32はちゃんとした箱入りでした。今まで秋月電子で買ったものも箱に入っていたことが無いのでちょっとびっくり。。。


しかし"TGS2450"を使いこなす自信がなかったので海外の事例もググって、Winsen社の"MQ-136"という硫化水素を検出するセンサーを見つけました。
こっちもESP Homeで"MQ-136"を使った事例は見つからなかったのですが他のMQ-シリーズを使った事例は見つかったし、"MQ-136"はESP32に直接接続してアナログで電圧を読み取るだけです。これなら私にもなんとかなりそうな気がします。"MQ-136"とあわせてメタンガスを検出する"MQ-4"もAliexpressで購入しました。
"MQ-136"はモジュールで1978円、"MQ-4"はモジュールで425円でした。"MQ-136"は結構お高いですがググるとスイッチサイエンスでセンサー単体が8800円で販売されているので、ものすごくお得なのかはたまたニセモノなのか。。。(汗)

■とりあえずMQ-136とMQ-4を試してみる

前述のとおり、"TGS2450"は回路を組んでヒーターの制御をしなくてはいけないので、とりあえず簡単そうな"MQ-136"と"MQ-4"の方を使ってみます。
MQ-136は「硫化水素」、MQ-4は「メタン」の検出度をアナログの電圧で返します。
ESP32はWi-Fiを使っているとアナログで使用できるpinが制限されると過去に見たような気がするので調べてみると、使用できるのはADC1 pin32-39なので、32番と33番を使うことにします。ESP32のピンとは下図のとおり接続しました。
ちなみに"MQ-136"と"MQ-4"のDO端子はガス濃度が一定レベルを超えるとHIGHになるだけなので使わなくてもいいです。その閾値は基盤についたアナログボリュームで調整できますが、これは実用的ではないですね。。。


ESP Homeのコードは下記のとおりとしました。これくらいは何とか私のスキルでも。。。(汗)
最初、全く電圧が動かなかったので、attenuation:を6dbに設定しました。

captive_portal:

sensor:
  - platform: adc
    pin: GPIO32
    name: "MQ4 CH4 sensor"
    accuracy_decimals: 3
    id: MQ4_CH4
    attenuation: 6db
    update_interval: 30s
  - platform: adc
    pin: GPIO33
    name: "MQ136 H2S sensor"
    accuracy_decimals: 3
    id: MQ136_H2S
    attenuation: 6db
    update_interval: 30s

binary_sensor:
  - platform: gpio
    pin: GPIO22
    name: "MQ4 CH4 HIGH"
    device_class: gas 
  - platform: gpio
    pin: GPIO23
    name: "MQ136 H2S HIGH"
    device_class: gas   


一応、油性ペンを近づけると"MQ-136"も"MQ-4"も電圧が上がることを確認できたので、とりま成功ということで。


参考にしたページは↓ここらへんです。
community.home-assistant.io
esphome.io

■"TGS2450"も頑張って試してみる

日本で使用例の多い"TGS2450"も頑張って試してみます。
回路は秋月電子の"TGS2450"販売ページにArdino用のサンプル回路が載っているのでこのまま組むことにします。
回路自体の意味はさっぱりわかりません。ってかトランジスタ使うの初めて(汗)

このセンサーとトランジスタはピン配列が判りにくいので気をつけます。


↓こちらのページを参考に使用するESP32のピンは、D14→GPIO2、D15→GPIO4としています。"TGS2450”は長い時間電圧をかけると簡単に焼けるそうで、ESP32のデフォルトで(起動時に)プルダウンになるピンを選択しているとのことだったのでマネしました(笑)
dreamerdream.hateblo.jp


とりあえずブレッドボード上でこんな感じに仕上げました。


さて、コードですが、秋月電子の"TGS2450"販売ページにArdino用のコードのサンプルが↓のとおり載っているのですが、私にはチンプンカンプンです(><)
ですが、ここは乗り越えないといけません。ESP Homeへの移植を頑張ります。


ググって、要は下記のように制御するってことは理解できました。
ヒーターを8ミリ秒だけオンにして、オフにした後237ミリ秒待ってセンサーをオンにし計測するってことですね。
焼けて壊れやすいくせにこんな制御をしろという。失敗は許されないという初心者には全く恐ろしいセンサーですね(笑)
まぁセンサーとトランジスタと抵抗を全部足しても500円未満なので壊れても勉強代だと思えば。。。
~~~
237ミリ秒待つ
センサーオン
3ミリ秒待つ
アナログの値を取得
2ミリ秒待つ
センサーをオフにする
ヒーターをオンにする
8ミリ秒待つ
ヒーターをオフにする
繰り返し
~~~

ESP Homeのコードの書き方を調べてScript:に実行することを順に書いてやれば良いことはわかりましたが、センサーの値を特定のタイミングで取得する方法と、処理を永久にループさせる方法と、起動時にScriptを走らせる方法がなかなかわからず。。。
センサーの値を特定のタイミングで取得するコマンドは "component.update: "らしいことがわかりましたが、結局、処理を永久にループさせる方法と起動時にScriptを走らせる方法がわからずです。
ボタンを作りそれを押すとScriptが走るようにし、永久ループはWhileの条件を「Wi-Fiが有功な間」という無茶苦茶な条件で常に条件を一致させてループするようにしました。
それにしても、値が260ミリ秒毎に更新されるのですが、そのままHome Assistantに垂れ流すとログの容量が大変なことにならんだろーか?(汗)
まぁ後で考えますか。。。
そんなワケで組んだコードは以下のとおりです。

captive_portal:

output:
  - platform: gpio
    pin: GPIO2
    id: heater_output
  - platform: gpio
    pin: GPIO4
    id: sensor_output
sensor:
  - platform: adc
    pin: GPIO33
    name: "sensor_value"
    id: sensor_value
    attenuation: 12db
    update_interval: 3600s
button:
  - platform: template
    name: script_check_button
    id: script_check_button
    on_press:
      then:
      - script.execute: TGS2450_control_script
      - if:
          condition:
            - script.is_running: TGS2450_control_script
          then:
            - logger.log: "Script is running"
script:
  - id: TGS2450_control_script
    then:
    - while:
        condition: wifi.enabled
        then:
        - delay: 237ms
        - output.turn_on: sensor_output
        - delay: 3ms
        - component.update: sensor_value
        - delay: 2ms
        - output.turn_off: sensor_output
        - output.turn_on: heater_output
        - delay: 8ms
        - output.turn_off: heater_output

一応、油性ペンを近づけると電圧が下がることは確認できたので、とりま成功かな?ということで。

■トイレに設置してウ〇チをしたらどれくらい値が変わるのかを見る

家族にカオスだと思われそうですが、実験的にトイレにおいてウ〇チをしたらどれくらい値が変化するのかをみてみたいと思います。

しかしですね、こういう時に限って便秘気味でなかなかウ〇チがしたくならないのですよね(笑)
よーやくすることが出来たので電圧変化をチェック。。。

硫化水素を検出する"MQ-136"は1.5V前後だった電圧が1.9Vを超えました。25%くらいの変動。
メタンを検出する"MQ-4"も1.2V前後だった電圧が1.6Vを超えました。30%くらいの変動。
ただ、オナラでも結構反応したのでオナラとウ〇チとをうまく区別できるかな?
一方"TGS2450"は、3.04Vだった電圧が3.00Vまでしか下がらず。。。あらためて確認すると油性マジックを近づけても2.9V前後までにしか下がりません。(追記: と思ったけれど油性マジックをめっちゃ近づけると1.6V付近まで下がったのでそれなりに動いてはいるのですね。うーむ。)
動作はしているので抵抗を変えてセンサーにかける電圧とか電流を調整するとうまくいくのかもしれませんが大変そう。。。ってか既に"TGS2450"を壊してしまったのかも(笑)
ということで、"MQ-136"か"MQ-4"をウ〇チをしたかを判定するセンサーとして使いたいと思います。

■まとめ

そんなワケで、Home Assistantと連携可能なウ〇チをしたことを検出するセンサーをESP Home+ESP32+臭いセンサーで作って試してみたというお話でした。
日本でその筋(?)の方々が良く使用されている"TGS2450"は私のスキルでは使いこなせず。。。(汗
でも"MQ-136""MQ-4"で、無事にウ〇チの臭いを検出してHome Assistantに繋がるセンサーを作ることが出来ました。
このままトイレに置いてしばらく値の推移のログを取りウ〇チをしたと判定する閾値を決め、ナノイー発生機のオンオフのトリガーとして利用したいと思います。


それでは、つづく