自制空气粉尘质量检测器

目的:通过Sharp GP2Y1010空气质量传感器检测办公区粉尘浓度,并通过Yeelink实时查看;
材料:Arduino UNO R3、GP2Y1010+150欧电阻+220μF电容各1、Rsspberry Pi、面包板、公对公连接线若干;
原理:GP2Y1010收集粉尘数据并通过Arduino串口传输至Raspberry Pi,Raspberry Pi负责存储数据并连接至Yeelink平台;

先看下GP2Y1010的内部结构图和硬件说明:

自制空气粉尘质量检测器

在发射端,需要通过引脚3驱动一个红外发射管,对应后文Arduino程序中定义的LedPower。引脚5为输出,输出的为模拟数据,对应程序中定义的measurePin。

通过GP2Y1010的DataSheet,可以看出粉尘传感器的输出电压几乎是线性的,根据国外牛人Chris Nafis得出的计算公式:

dustDensity = 0.17 * calcVoltage - 0.1
dustDensity是粉尘密度值,单位mg/m³,calcVoltage是输出电压值;
注:由于此传感器在<0.9V的低电压环境下就无粉尘数据,所以在较清洁环境中易输出负数;

我们知道0~5V的输出电压对应的模拟读数为0~1023,所以需要通过公式将模拟值转为电压值:

calcVoltage = voMeasured * (5.0 / 1024.0)
voMeasured为输出口模拟值

根据DataSheet中的脉冲周期图可知,我们需要开启内部的Led并等待280μs(微秒),然后再读取输出值。由于整个脉冲持续时间为320μs。因此,我们需要等待40μs才能将Led关闭。

接下来开始将GP2Y1010与Arduino进行硬件对接:

根据引脚说明图,需要在引脚1串联150欧电阻,并并联一个220μF电容。

自制空气粉尘质量检测器

上图为GP2Y1010的实物图及引脚位置编号,按照以下表进行连接:

自制空气粉尘质量检测器

连接完后开始编程工作,硬件效果如下:

自制空气粉尘质量检测器

在Arduino上烧入代码如下:

int measurePin = 0;  // 连接模拟口0
int ledPower = 2;    // 连接数字口2

int samplingTime = 280;
int deltaTime = 40;
int sleepTime = 9680;
float voMeasured = 0;
float calcVoltage = 0;
float dustDensity = 0;

void setup(){
Serial.begin(9600);
pinMode(ledPower,OUTPUT);
}

void loop(){
digitalWrite(ledPower,LOW);              //开启内部LED
delayMicroseconds(samplingTime);       // 开启LED后的280us的等待时间
voMeasured = analogRead(measurePin);   // 读取模拟值
delayMicroseconds(deltaTime);           //  40us等待时间
digitalWrite(ledPower,HIGH);             // 关闭LED
delayMicroseconds(sleepTime);

// 0 - 5V mapped to 0 - 1023 integer values
// recover voltage
calcVoltage = voMeasured * (5.0 / 1024.0);   //将模拟值转换为电压值

// linear eqaution taken from http://www.howmuchsnow.com/arduino/airquality/
// Chris Nafis (c) 2012
dustDensity = 0.17 * calcVoltage - 0.1;      //将电压值转换为粉尘密度输出单位
Serial.println(dustDensity);  // 输出单位: 毫克/立方米
delay(3000);
}

至此,GP2Y1010+Arduino已正常工作并产生数据。由于我们希望将这些数据通过Raspberry Pi进行后续处理,所以需要把Arduino与Raspberry Pi进行通信,这里采用USB连接方式(Via 极客工坊 ):

1、安装Python:

sudo apt-get install python

2、安装Python的GPIO模块,用于控制LED、电机等:

wget http://raspberry-gpio-python.googlecode.com/files/RPi.GPIO-0.3.1a.tar.gz  //下载GPIO库
tar xvzf RPi.GPIO-0.3.1a.tar.gz  //tar解压
cd RPi.GPIO-0.3.1a   //进入解压后的文件夹
sudo python setup.py install    //安装GPIO库文件

3、安装Serial,用于串口通信及USB通信:

sudo apt-get install python-serial

4、如果是想在树莓派装串口调试工具就装:

sudo apt-get install minicom

配置minicom:

sudo minicom -s

选serial port setup,输入A配置串口驱动为/dev/ttyAMA0、输入E配置速率为9600 8N1、输入F将 Hardware Flow Control设为NO,回车并退出。

由于我们使用minicom作为超级终端控制路由器等设备, 而不是控制modem, 所以需要修改Modem and dialing, 将Init string, Reset string, Hang-up string设置为空。设置完成后选择Save setup as dfl将当前设置保存为默认设置,选Exit退出下次在输入minicon 即可直接进入。

接下来测一下环境是否都OK:

sudo nano test.py

输入以下内容:

import serial
import RPi.GPIO

保存退出,然后运行代码:

python test.py

如果没有报错那就说明RPi.GPIO与Serial两个库安装成功。

USB对接方式:

将Arduion Uno插入树莓派的USB然后在树莓派输入:

ls /dev/tty*

查看有没有ttyACM0这个文件(只有在两个硬件USB互连的情况下才会有,如果两者没有连接是不会出现的),最新的系统一般都会自动生成。看到ttyACMO就说明二者可以通讯了,接下来上测试代码:

Arduino代码:

byte number = 0;
void setup(){
Serial.begin(9600);
}
void loop(){
if (Serial.available())  {
number = Serial.read();
Serial.print("character recieved: ");
Serial.println(number, DEC);
}
}

先把上面的代码下载到Arduino,再次将两者USB互接,然后再树莓派新建Python文件1.py并粘贴测试代码如下:

import serial
ser = serial.Serial('/dev/ttyACM0', 9600, timeout=1)
ser.open()
ser.write("testing")
try:
    while 1:
             response = ser.readline()
             print response
except KeyboardInterrupt:
ser.close()

保存并退出。

python 1.py //运行测试代码

如果结果输出正常,说明两者USB通讯成功了。

接下来,开始将GP2Y1010+Arduino的数据通过树莓派传至Yeelink(需先在Yeelink平台注册并添加设备及传感器,此处不再累述):

配合Arduino上烧入的代码,在树莓派上新建Python文件air.py,并复制以下代码:

import serial
import time
ser = serial.Serial('/dev/ttyACM0', 9600, timeout=1)
ser.open()
ser.write("testing")
try:
    while 1:
             response = ser.readline()
             print response[:-2]
             time.sleep(3)
             file_object = open('TR.log', 'a')
             file_object.write(response)
             file_object.close( )
except KeyboardInterrupt:
    ser.close()

接着,新建.sh文件airyeelink.sh,输入以下代码:

KKKK=`tail /home/pi/TR.log -n 1`

curl --request POST --data '{"value":'$KKKK'}' --header "U-ApiKey:你的账号Key " 传感器API地址

保存后授予执行权限:

chmod +x airyeelink.sh

最后,执行该程序测试是否成功。接着,我们设置一个定时任务,每隔1分钟将获取到的粉尘密度(mg/m³)数据传至Yeelink并在前端展示:

sudo crontab –e

在最后一行添加以下代码:

*/1 * * * * /home/pi/airyeelink.sh

至此,大功告成。你可以分享Yeelink上公开的空气质量监控结果页面给你的好友们,也可以探索下Yeelink提供的其他服务。

参考:

http://www.howmuchsnow.com/arduino/airquality/
http://sensorapp.net/?p=479
http://www.geek-workshop.com/thread-5585-1-1.html
http://www.dfrobot.com.cn/index.php?route=sns/tutorials/detail&tid=232