満員電車内でのオナラと検知 #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オーバーは達成出来ませんでした。
近日中に硫化分の多い食物を食べ、試験したいと思います。
今後のタスク
- 硫化分の多い食物を摂った後の動作確認
- この前作った「オナラを検知しました。くさーい。」との連動試験
- ケーシング
以上、よろしくお願い致します。
関連記事
-
-
ArduinoIDE1.6.4+ATTiny13Aで赤外線リモコン
お疲れ様です。高橋です。 先日実験したArduinoで赤外線リモコンの問題点、そ …
-
-
電子オルゴール 動作試験
お疲れ様です。高橋です。 前回「電子オルゴール基板実装 #2 ~ワイヤストリッパ …
-
-
USBカメラ+Raspberry Pi
お疲れ様です。高橋です。 USBカメラをRaspberryPiに装着し、ストリー …
-
-
秋月製ESP-WROOM-02が動いた
お疲れ様です。高橋です。 秋月で買ったESP-WROOM-02が動きました。AT …
-
-
無線モジュールでモールス信号
お疲れ様です。高橋です。 無線モジュールnRF24L01Pを使った、なんちゃって …
-
-
ブレッドボード上のYMZ294をユニバーサル基板化してみたが。
お疲れ様です。高橋です。 ArduinoからYMZを鳴らしているブレッドボードが …
-
-
上司の離着席状態をクラウドに飛ばし、スマホで見れるようにした。
お疲れ様です。高橋です。 前回ブレッドボード上に構築した上司離着席検知システムで …
-
-
LEDドライバなる物の存在
お疲れ様です。高橋です。 本日、同僚とLED周りについて雑談していると、「LED …
-
-
USBやDCジャックからの5Vを3.3Vにする物を作った
お疲れ様です。高橋です。 前にesp8266の動作試験を行った時、とても面倒だと …
-
-
満員電車内でのオナラと検知 #2
お疲れ様です。高橋です。 最近なんだか忙しかったので、なかなか物が作れませんでし …
- PREV
- 満員電車内でのオナラと検知 #3
- NEXT
- 満員電車内でのオナラと検知 #5