小猪学arduino—使用GP2Y1010AU0F检测pm2.5空气质量

今天老婆不在家,申请的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

 

欢迎关注下方“非著名资深码农“公众号进行交流~

发表评论

邮箱地址不会被公开。