・はじめに
aitendoに行った時にほこりセンサが目に入り
衝動買いして、そのままだったで使ってみた。
結論から言うと検出能力は非常に低いんで
ちょっとしたほこりや、室内の空気の状態
を知ることはできなかった
タバコとかの煙が充満していれば検出できる
かもしれない。逆に検出できたらかなり汚染
されてると思う
他にも色々センサーを使ってみました。こちらも宜しくお願いします〜
・使ったもの
arduino uno
GP2Y10AU0F
ユニバーサル基板
150Ω抵抗
220uF電解コンデン
トランジスタ2120
JST ZHR-6 PH:1.5M
Hコネクタハウジング用コンタクト SXH-001
microSDカードソケット
HiLetgo Micro SD TFカードメモリシールドモジュール Arduinoに対応 SPIマイクロSDアダプタ 6PIN(3個セット) [並行輸入品]
- 出版社/メーカー: HiLetgo
- メディア: おもちゃ&ホビー
- この商品を含むブログを見る
・回路図
GP2Y10のコネクタの配置は以下の図
出典:GP2Y1010AU0Fデータシート
出典:GP2Y1010AU0Fデータシート
上の回路図をもとに回路を組んだ
ほぼそのままですね
抵抗は150Ω コンデンサは220uF
3pinのLEDのとこはnpn型のトランジスタ2120
を接続しコレクタをLED、エミッタをGND
ベースをArduinoのデジタルピン2に接続
またVoutはアナログピン2に接続した。
・プログラム
LED端子へ以下の図のパルスを送って
計測する。
出典:GP2Y1010AU0Fデータシート
出典:GP2Y1010AU0Fデータシート
つまりArduinoのD2を
digitalWrite(2,HIGH);
delayMicroseconds(280);
val = analogRead(2);//ここで測定
delayMicroseconds(40);
digitalWrite(2,LOW);
delayMicroseconds(9680);
と言う感じでパルスを送れば
計測できる
おそらくトランジスタを接続しなくても
同じ機能を果たすことが可能だ
トランジスタのエミッタは
LED端子に、コレクタはGNDに接続され
ている。つまりベース(D2pin)がHIGHになれば
LED端子はLOWになり、ベース(D2pin)がLOW
であればLED端子はHIGHとなる。
したがってD2pinの出力を反転させれば
トランジスタがなくても問題がないかもしれない
digitalWrite(2,LOW);//ここ
delayMicroseconds(280);
val = analogRead(2);
delayMicroseconds(40);
digitalWrite(2,HIGH);//ここ
delayMicroseconds(9680);
以下のスケッチはただ
Voutの値を出力しているだけ
const int LED = 1;
const int rea = 2;
void setup() {
pinMode(LED,OUTPUT);
Serial.begin(9600);
}
void loop() {
Serial.println(dustRead());
delay(100);
}
float dustRead() {
float val;
digitalWrite(LED,HIGH);
delayMicroseconds(280);
val = analogRead(rea);
delayMicroseconds(40);
digitalWrite(LED,LOW);
delayMicroseconds(9680);
return val;
}
次は粉塵濃度を出力してsdカード
に保存するスケッチを書く
図7:粉塵濃度 出力電圧
出典:GP2Y1010AU0Fデータシート
図7のグラフより以下の式が導ける
かなり大雑把だけど
y = 2.8/0.5*x +0.7
が読み取れ変形すると
x = 0.178*y - 0.125
となる。
以下のスケッチは
dustRead()でVoutの値を読み取り
calculate()でdustRead()読み取った
値を電圧Vに変換し、そのVを
(2)に代入し粉塵濃度を算出する。
logging(float) では求まった
粉塵濃度をSDカードに保存している。
#include <SPI.h>
#include <SD.h>
const int cs = 3;
const int LED = 2;
const int readPin = 2;
const float SamplingTime = 280;//micro seconds
const float DelayTime = 40;
const float SleepTime = 9680;
File logFile;
float dustRead();
float calculate();
void logging(float);
void setup() {
pinMode(cs,OUTPUT);
pinMode(LED,OUTPUT);
digitalWrite(cs,HIGH);
Serial.begin(9600);
if(!SD.begin(cs)){
//Serial.println("intitializes failed");
return;
}
}
void loop() {
logging(calculate());
delay(500);
}
float dustRead() {
float val;
digitalWrite(LED, HIGH);
delayMicroseconds(SamplingTime);
val = analogRead(readPin);
delayMicroseconds(DelayTime);
digitalWrite(LED, LOW);
delayMicroseconds(SleepTime);
Serial.print(val);
Serial.print(":");
return val;
}
float calculate() {
float concentration, V;
V = 5*dustRead()/1024;
Serial.println(V);
concentration = 0.178*V - 0.125;
return concentration;
}
void logging(float val) {
logFile = SD.open("log3.txt", FILE_WRITE);
if(logFile)
logFile.println(val);
logFile.close();
}