今天老婆不在家,申请的dueros和买的机器人零件都没到,儿子自己玩坦克玩的正hi,我也找点事干吧,从箱子里扒拉出一个GP2Y1010AU0F灰尘传感器,做个pm2.5检测吧。
GP2Y1010AU0F模块的检测原理:
传感器中心有个洞可以让空气自由流过,定向发射LED光,通过检测经过空气中灰尘折射过后的光线来判断灰尘的含量,跟激光的比成本较低。
硬件连线
传感器 -> Arduino
1白线Vled –> 5V (150ohm resistor)2
2蓝线 LED-GND –> GND3
3 绿线LED –> Digital pin 24
4 黄线S-GND –> GND5
5 黑线Vo –> Analog pin 06
6 红线Vcc –> 5V
示例没有接电容电阻,其中1、6红白线可以连一起后接5v;2、4蓝黄线连一起后接GND;3绿线接D2数字端口;5黑线接A0模拟端口。
检测结果:
今天下大雨空气太好,人工制造了点灰尘,这是灰尘被检测到散开的检测数据:
临时加了个警报灯,超过阈值就会亮起来,等esp板子到了就统一都传到server端显示。
程序代码
int measurePin = 0; // 引脚定义里的第5脚,黑色线接到A0
int pm25Pin = 2; // 引脚定义里的第3脚,白色线接到D2
int ledPin = 13; // led报警灯接到D13
int samplingTime = 280;//等待LED开启的时间是280μs
int deltaTime = 40;//整个脉冲持续时间为320μs。因此,我们还需再等待40μs
int sleepTime = 9680;
float voMeasured = 0;
float vtMeasured = 0;
float calcVoltage = 0;
float dustDensity = 0;
void setup(){
Serial.begin(9600);
pinMode(pm25Pin,OUTPUT);
pinMode(ledPin,OUTPUT);
}
void loop(){
digitalWrite(pm25Pin,LOW); //开启pm2.5检测设备
delayMicroseconds(samplingTime); // 开启LED后的280us的等待时间
voMeasured = analogRead(measurePin); // 读取模拟值
delayMicroseconds(deltaTime); // 40us等待时间
digitalWrite(pm25Pin,HIGH); // 关闭pm2.5检测设备
delayMicroseconds(sleepTime);
// recover voltage
calcVoltage = voMeasured * (5.0 / 1024.0); //将模拟值转换为电压值
dustDensity = 0.17 * calcVoltage - 0.1; //将电压值转换为粉尘密度输出单位
Serial.print("原始信号值:"); //0-5V mapped to 0-1023 integer values
Serial.print(voMeasured);
Serial.print(" 电压:");
Serial.print(calcVoltage);
Serial.print(" 粉尘密度:");
Serial.print(dustDensity); // 最终浓度值,输出单位: 毫克/立方米
Serial.print(" 空气质量 :");
digitalWrite(ledPin,LOW);
if (voMeasured > 36.455){
vtMeasured = (float(voMeasured/1024)-0.0356)*120000*0.035;
Serial.print(vtMeasured);
if(vtMeasured<75){
Serial.print(" 非常好");
}else if(vtMeasured<150){
Serial.print(" 很好");
}else if(vtMeasured<150){
Serial.print(" 很好");
}else if(vtMeasured<300){
Serial.print(" 好");
}else if(vtMeasured<1050){
Serial.print(" 一般");
}else if(vtMeasured<1050){
Serial.print(" 一般");
}else if(vtMeasured<3000){
Serial.print(" 差");
}else{
Serial.print(" 会死人的,还不快跑");
}
digitalWrite(ledPin, HIGH);
}else{
Serial.print(" 未检测到尘埃");
}
Serial.println("");
delay(1000);
}
我去,又五点了,赶紧给儿子做饭去……
yan 17.8.13 17:16