満員電車内でのオナラと検知 #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オーバーは達成出来ませんでした。
近日中に硫化分の多い食物を食べ、試験したいと思います。
今後のタスク
- 硫化分の多い食物を摂った後の動作確認
- この前作った「オナラを検知しました。くさーい。」との連動試験
- ケーシング
以上、よろしくお願い致します。
関連記事
-
-
Arduino+EEPROM+YMZ294で曲の抜き差し
お疲れ様です。高橋です。 I2Cの256KBitなEEPROMに曲データを書き込 …
-
-
EEPROM書き込みシールドの作成
お疲れ様です。高橋です。 先日成功したPCからのEEPROM書き込みですが、ジャ …
-
-
USBカメラ+Raspberry Pi
お疲れ様です。高橋です。 USBカメラをRaspberryPiに装着し、ストリー …
-
-
LEDドライバなる物の存在
お疲れ様です。高橋です。 本日、同僚とLED周りについて雑談していると、「LED …
-
-
大掃除を終え、aitendoで30円で売ってたタクトスイッチ基板でクリスマス
お疲れ様です。高橋です。 aitendoで店頭限定30円だったタクトスイッチ基板 …
-
-
FM音源YM2203をArduinoで鳴らしたい #2
お疲れ様です。高橋です。 先に結論 FM楽曲及びPSG楽曲の演奏に成功しました。 …
-
-
Arduino Pro MiniでLチカしてみた
お疲れ様です。高橋です。 最近ずっと忙しく、平日はもちろん、土日も疲労のため何も …
-
-
【完成】PCからシリアル通信でEEPROM書き込み
お疲れ様です。高橋です。 PCからシリアル通信を介して楽曲データをEEPROMに …
-
-
MIDI INの実験
お疲れ様です。高橋です。 Arduino+YMZをMIDI化するための第一歩の実 …
-
-
上司の離着席状態をクラウドに飛ばし、スマホで見れるようにした。
お疲れ様です。高橋です。 前回ブレッドボード上に構築した上司離着席検知システムで …
- PREV
- 満員電車内でのオナラと検知 #3
- NEXT
- 満員電車内でのオナラと検知 #5
