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. ケーシング

 

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

 - 電子工作

  関連記事

電子オルゴール 動作試験

お疲れ様です。高橋です。 前回「電子オルゴール基板実装 #2 ~ワイヤストリッパ …

電子オルゴール 基板実装 #1

お疲れ様です。高橋です。 Pro Mini互換機を贅沢に使った電子オルゴールの仮 …

Raspberry Pi2 model B

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

上司離着席検知システムの作り方

お疲れ様です。高橋です。 上司離着席検知システムの作り方は下記の通りです。 必要 …

aitendoで買った4桁7セグLEDを使う

お疲れ様です。高橋です。 aitendoの4桁7セグLED aitendoで1個 …

YMZ294のMIDI音源化と、YMZのピン数圧縮

お疲れ様です。高橋です。 YMZで使うピン数を11本から6本に減らす事によって、 …

クオーツ時計を100倍速&リバースモード付きに改造してみた。

お疲れ様です。高橋です。 今日、奥さんから壊れた時計を貰いました。電池を入れ替え …

ルネサス RX621でLチカするまで

お疲れ様です。高橋です。 とある事情のため購入した、ルネサスのRX621マイコン …

YMZ294の基板が動いた。

お疲れ様です。高橋です。 先日「ブレッドボード上のYMZ294をユニバーサル基板 …

【完成】 耳コピミキサー

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