目的:通过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
最新评论