満員電車内でのオナラと検知 #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オーバーは達成出来ませんでした。
近日中に硫化分の多い食物を食べ、試験したいと思います。
今後のタスク
- 硫化分の多い食物を摂った後の動作確認
- この前作った「オナラを検知しました。くさーい。」との連動試験
- ケーシング
以上、よろしくお願い致します。
関連記事
-
-
aitendoで買った375円のバックライト付きI2C LCDで文字を表示してみた。
お疲れ様です。高橋です。 ちょっと前にaitendoで買ったバックライト付きのL …
-
-
YMZ294のMIDI音源化と、YMZのピン数圧縮
お疲れ様です。高橋です。 YMZで使うピン数を11本から6本に減らす事によって、 …
-
-
4桁7セグLEDを基板に実装
お疲れ様です。高橋です。 昨日に引き続き今日も奇跡的に早く帰宅する事が出来たため …
-
-
マウスの位置座標を使った電子楽器を作ってみた。
お疲れ様です。高橋です。 先日分解したマウスを使って、位置座標の取り出しと、取り …
-
-
上司離着席検知システムの開発
お疲れ様です。高橋です。 下記、フィクションでイメージです。 背景 何かしらの相 …
-
-
電子オルゴール設計
お疲れ様です。高橋です。 電子オルゴールがどんな形状になるのか、実体配線図を作っ …
-
-
PCとArduinoをJavaでシリアル通信
お疲れ様です。高橋です。 先日作ったコレ。 よくよく考えると、書き込む際にいちい …
-
-
FM音源YM2203をArduinoで鳴らしたい #1
お疲れ様です。高橋です。 きっかけ 4月から現在に掛けてのコロナな最近、会社のと …
-
-
汎用ロジックIC(NAND/NOR/AND/OR)試験機
お疲れ様です。高橋です。 単一の機能を持ったシンプルな、汎用ロジックICという物 …
-
-
音階LED表示器の実体配線図を書いてみた。
お疲れ様です。高橋です。 前に「音階に合わせてLEDを光らせてみた。」で実験した …
- PREV
- 満員電車内でのオナラと検知 #3
- NEXT
- 満員電車内でのオナラと検知 #5
