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 ~ワイヤストリッパー~

お疲れ様です。高橋です。 先日秋葉原でワイヤーストリッパーを買ってきました。 被 …

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

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

電子オルゴール 回路図

お疲れ様です。高橋です。 電子オルゴールの回路図を書いてみました。 実体配線図よ …

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

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

シフトレジスタLED付きのYMZ294回路をFritzingに起こしてみた。

お疲れ様です。高橋です。 ユニバーサル基板で作ったYMZボードと、音階LED及び …

Arduino Pro MiniでLチカしてみた

お疲れ様です。高橋です。 最近ずっと忙しく、平日はもちろん、土日も疲労のため何も …

音階LEDの再設計

お疲れ様です。高橋です。 本日帰宅途中に電車をぼーっと待っている時、ふと、音階L …

【完成】 耳コピミキサー

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

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

お疲れ様です。高橋です。 マイコンと5V給電 先日実験に成功した硫化水素センサー …

PCとArduino間でのシリアル通信を介したEEPROM書き込み(難航)

お疲れ様です。高橋です。 Arduino Pro MiniでI2C EEPROM …