curious4dev

中国旅行、Arduinoなどを使った電子工作、その他色々。

*

満員電車内でのオナラと検知 #4

 

お疲れ様です。高橋です。

硫化水素センサーが到着しました。結構前に到着していたのだけど、なかなか作れる時間を確保できなかったのです。

しかし、この3連休でようやく実装時間を確保出来ました。クリスマスなんて私には関係の無いイベントです。

MQ-136について

購入したのはこのセンサー。

今回のMQ136は、Hydrogen(水素)でSulfide(硫化)なセンサーです。

MQシリーズは、1番から???番まで、ありとあらゆるガスに対応したセンサーが揃っています。煙、アルコール、天然ガス、ブタン、一酸化炭素、とにかく色々です。

センサーの裏側は、こんな感じに非常にシンプル。

5VとGND、そしてAnalog出力とDigital出力。

実装

今回はAnalog出力をArduino UNOで受け付けますので、UNOとの配線は、

  • UNO 5V – MQ136 5V
  • UNO GND – MQ136 GND
  • UNO A0 – MQ136 AOUT

としてます。

入力した値をSerialに9600で500msec毎に出力するサンプルを書き、動作している事を確認。

しかし、先日はあいにく硫化分の少ない食事をしているため、あまりオナラが臭くありません。まあこの問題は追々解決していきます。(=肉類やネギ類を食べたあとのオナラでの実験となります)

Serialモニタ以外でモニタリングしたい

Serialモニタで数字の増減を見て一喜一憂していたのですが、いちいちパソコン上のSerialモニタで数字を確認するのは携帯性に良くないのが明白。なんとかパソコンを使わず動作を確認したい。

そこで思い出したのがaitendoで売ってたi2cのキャラ液晶。

これならUNO側のピンをそれほど消費せずに数字をリアルタイムに表示できるので、これで表示する事にしました。

実体配線図

UNOとMQ136、そしてUNOとLCDの配線は、それぞれこんな感じです。

LCD及びMQ136はピン配はズバピタな物がFritzingに無いので適当な物を配置しましたが、ルビを振ったのでわかると思います。aitendoのキャラLCDは3.3V駆動で、VDDとRESTとBL+にそれぞれ3.3を配線し、GNDにはGND、DATAとCLKは適当にAnalogポートを割り当てます。

スケッチ

Arduino側スケッチは下記の通り。ArduinoのAnalogポートで入力される値は、0~1,023の値にマッピングされてきます。危険水域を400とし、400を超えたらLEDをチカらせつつ、液晶には「DANGER! DANGER!」と表示するようにしてます。

#include <Wire.h>

int pinLED = 13;
int pinMQ136 = A0;
int intDetect = 400;

int sdaPin = A4;
int sclPin = A5;
int i2cadr = 0x3e;
int intLedContrast = 7;

int intH2S;
char chrH2S[4];

void setup() {
 pinMode(pinLED, OUTPUT);
 pinMode(pinMQ136, INPUT);
 Serial.begin(9600);

 lcd_init();
}

void loop() {
 intH2S = analogRead(pinMQ136);
 sprintf(chrH2S, "%d", intH2S);

 Serial.print("MQ136: ");
 Serial.println(intH2S);

 lcd_move(0x00);
 lcd_puts("H2S Detected: ");
 lcd_puts(chrH2S);

 lcd_move(0x40);
 if (intH2S > intDetect) {
 digitalWrite(pinLED, HIGH);
 lcd_puts("DANGER! DANGER!");
 } else {
 digitalWrite(pinLED, LOW);
 }
 delay(500);
}

void lcd_cmd(byte x)
{
 Wire.beginTransmission(i2cadr);
 Wire.write(0x00);
 Wire.write(x);
 Wire.endTransmission();
}

void lcd_data(byte x)
{
 Wire.beginTransmission(i2cadr);
 Wire.write(0x40);
 Wire.write(x);
 Wire.endTransmission();
}

void lcd_puts(const char *s)
{
 while (*s) lcd_data(*s++);
}

void lcd_init()
{
 Wire.begin();
 lcd_cmd(0x38); // function set
 lcd_cmd(0x39); // function set
 lcd_cmd(0x14); // interval osc
 lcd_cmd(0x70 | (intLedContrast & 15)); // contrast low
 lcd_cmd(0x5c | (intLedContrast >> 4 & 3)); // contrast high / icon / power
 lcd_cmd(0x6c); // follower control
 delay(300);
 lcd_cmd(0x38); // function set
 lcd_cmd(0x0c); // display on
 lcd_cmd(0x01); // clear display
 delay(2);
}

void lcd_move(byte pos) {
 lcd_cmd(0x80 | pos);
}

そして出来上がったのがこちら。

前述したとおり、硫化分の多い食物を食べていなかったため、400オーバーは達成出来ませんでした。

近日中に硫化分の多い食物を食べ、試験したいと思います。

 

今後のタスク

  1. 硫化分の多い食物を摂った後の動作確認
  2. この前作った「オナラを検知しました。くさーい。」との連動試験
  3. ケーシング

 

以上、よろしくお願い致します。

 - 電子工作

  関連記事

音階に合わせてLEDを光らせてみた。

お疲れ様です。高橋です。 主旋律に合わせてLEDを光らせてみる実験を行いました。 …

秋月製ESP-WROOM-02が動いた

お疲れ様です。高橋です。 秋月で買ったESP-WROOM-02が動きました。AT …

マウスの位置座標を使った電子楽器を作ってみた。

お疲れ様です。高橋です。 先日分解したマウスを使って、位置座標の取り出しと、取り …

【完成】 耳コピミキサー

お疲れ様です。高橋です。 作成途中だった耳コピミキサー、やっと完成しました。 思 …

YMZシールドの基板設計

お疲れ様です。 前に基板化したYMZ294をさらにシールド化したい事をPOSTし …

4桁7セグLEDを基板に実装 完成

お疲れ様です。高橋です。 大失敗 前回、実体配線図を書いたこれ。 こんな感じに頑 …

100均で買ったボリュームコントロール付きステレオ延長コードを、バブ型スピーカーに搭載してみた。

お疲れ様です。高橋です。 先日作ったバブ型スピーカーですが、実は裏側がとても汚い …

マウスを入力I/Fとして使うのを断念してみた。

お疲れ様です。高橋です。 先日の「マウスを分解してみた」でマウスを分解し、ケーブ …

Raspberry Pi2 model B

お疲れ様です。高橋です。 今年見た初夢、「猫×おもちゃ×動画×アプリ」の実現のた …

満員電車内でのオナラと検知 #3

お疲れ様です。高橋です。 先日秋月で購入した音声合成LSIのATP3011。やっ …