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

 

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

 - 電子工作

  関連記事

FM音源YM2203をArduinoで鳴らしたい #3

お疲れさまです。高橋です。 昨年8月にブレッドボード上で動作したFM音源YM22 …

USBカメラ+Raspberry Pi

お疲れ様です。高橋です。 USBカメラをRaspberryPiに装着し、ストリー …

Arduino電源ON/OFF機

お疲れ様です。高橋です。 Arduinoを使っている時、特に2個とか複数同時に使 …

YMZシールドの作成 #2

お疲れ様です。高橋です。 先日から作っていたYMZシールドですが、本日完成しまし …

PCとArduinoをJavaでシリアル通信

お疲れ様です。高橋です。 先日作ったコレ。 よくよく考えると、書き込む際にいちい …

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

お疲れ様です。高橋です。 最近なんだか忙しかったので、なかなか物が作れませんでし …

「びんぼうでいいの」を組み立ててみた。

お疲れ様です。高橋です。 懸案だったヘッドフォンの修理が片付き、やりたい事をやり …

ブレッドボード上のYMZ294をユニバーサル基板化してみたが。

お疲れ様です。高橋です。 ArduinoからYMZを鳴らしているブレッドボードが …

MIDI INの実験

お疲れ様です。高橋です。 Arduino+YMZをMIDI化するための第一歩の実 …

Raspberry Pi2 model B

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