満員電車内でのオナラと検知 #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オーバーは達成出来ませんでした。
近日中に硫化分の多い食物を食べ、試験したいと思います。
今後のタスク
- 硫化分の多い食物を摂った後の動作確認
- この前作った「オナラを検知しました。くさーい。」との連動試験
- ケーシング
以上、よろしくお願い致します。
関連記事
-
-
YMZ294のMIDI音源化と、YMZのピン数圧縮
お疲れ様です。高橋です。 YMZで使うピン数を11本から6本に減らす事によって、 …
-
-
FM音源YM2203をArduinoで鳴らしたい #2
お疲れ様です。高橋です。 先に結論 FM楽曲及びPSG楽曲の演奏に成功しました。 …
-
-
音階LED実装 #3 – 秋葉原で買い物
お疲れ様です。高橋です。 先日、お小遣いがチャージされまして、音階LED実装に必 …
-
-
音階LED実装 #1
お疲れ様です。高橋です。 今日の進捗 音階LEDの半田付け 1日目です。 ICソ …
-
-
100均で買ったボリュームコントロール付きステレオ延長コードを、バブ型スピーカーに搭載してみた。
お疲れ様です。高橋です。 先日作ったバブ型スピーカーですが、実は裏側がとても汚い …
-
-
EEPROM書き込みシールドの作成
お疲れ様です。高橋です。 先日成功したPCからのEEPROM書き込みですが、ジャ …
-
-
シフトレジスタLED付きのYMZ294回路をFritzingに起こしてみた。
お疲れ様です。高橋です。 ユニバーサル基板で作ったYMZボードと、音階LED及び …
-
-
ブレッドボード上のYMZ294をユニバーサル基板化してみたが。
お疲れ様です。高橋です。 ArduinoからYMZを鳴らしているブレッドボードが …
-
-
電子オルゴール 基板実装 #2 ~ワイヤストリッパー~
お疲れ様です。高橋です。 先日秋葉原でワイヤーストリッパーを買ってきました。 被 …
-
-
耳コピを簡単にするミキサー構想
お疲れ様です。高橋です。 私が普段耳コピをする時は、iPhoneで音楽を鳴らしな …
- PREV
- 満員電車内でのオナラと検知 #3
- NEXT
- 満員電車内でのオナラと検知 #5
