Arduino系列教程八:PM2.5灰尘传感器

摘要: 本教程实现功能:通过传感器获取当前空气PM2.5的值,并通过串口发送给上位机显示。PM2.5传感器概述: 可以检测直径大于0.8um的灰尘颗粒浓度,作为一名创客,想了解空气质量?想DIY一个PM2.5检测仪?想设计一个空气净 ...


本教程实现功能:通过传感器获取当前空气PM2.5的值,并通过串口发送给上位机显示。

PM2.5传感器概述:

可以检测直径大于0.8um的灰尘颗粒浓度,作为一名创客,想了解空气质量?想DIY一个PM2.5检测仪?想设计一个空气净化器?,那么这款传感器就是你的必备神器

硬件准备:

硬件连接:
1. 将IO Expansion 扩展板接入UNO PLUS,用跳线帽将两个板子的电压都配置为 5V
2. Dust Sensor 与IO Expansion的连接
VCC   --   VCC
GND  --   GND
AOUT --  A5
ILED  --  D2
3. 连接效果如下图



程序:
01#define        COV_RATIO                       0.2            //ug/mmm / mv
02#define        NO_DUST_VOLTAGE                 400            //mv
03#define        SYS_VOLTAGE                     5000           //ADC参考电压   
04 
05/*
06I/O define
07*/
08const int iled = 2;                                           //drive the led of sensor
09const int vout = 5;                                           //analog input
10 
11/*
12variable
13*/
14float density, voltage;
15int   adcvalue;
16 
17/*
18private function
19*/
20int Filter(int m)
21{
22  static int flag_first = 0, _buff[10], sum;
23  const int _buff_max = 10;
24  int i;
25   
26  if(flag_first == 0)
27  {
28    flag_first = 1;
29 
30    for(i = 0, sum = 0; i < _buff_max; i++)
31    {
32      _buff[i] = m;
33      sum += _buff[i];
34    }
35    return m;
36  }
37  else
38  {
39    sum -= _buff[0];
40    for(i = 0; i < (_buff_max - 1); i++)
41    {
42      _buff[i] = _buff[i + 1];
43    }
44    _buff[9] = m;
45    sum += _buff[9];
46     
47    i = sum / 10.0;
48    return i;
49  }
50}
51 
52 
53void setup(void)
54{
55  pinMode(iled, OUTPUT);
56  digitalWrite(iled, LOW);                                     //iled default closed
57   
58  Serial.begin(9600);                                          //send and receive at 9600 baud
59  Serial.print("*********************************** WaveShare ***********************************\n");
60}
61 
62void loop(void)
63{
64  /*
65  get adcvalue
66  */
67  digitalWrite(iled, HIGH);
68  delayMicroseconds(280);
69  adcvalue = analogRead(vout);
70  digitalWrite(iled, LOW);
71   
72  adcvalue = Filter(adcvalue);
73   
74  /*
75  covert voltage (mv)
76  */
77  voltage = (SYS_VOLTAGE / 1024.0) * adcvalue * 11;
78   
79  /*
80  voltage to density
81  */
82  if(voltage >= NO_DUST_VOLTAGE)
83  {
84    voltage -= NO_DUST_VOLTAGE;
85     
86    density = voltage * COV_RATIO;
87  }
88  else
89    density = 0;
90     
91  /*
92  display the result
93  */
94  Serial.print("The current dust concentration is: ");
95  Serial.print(density);
96  Serial.print(" ug/m3\n"); 
97   
98  delay(1000);
99}


实现输出:

程序代码下载:

DustSensor.zip