看图说话测量PM2,5
本帖最后由 ardypro 于 2013-6-23 16:51 编辑乐联老刘送俺一块DSM501A,可以像美帝那样测量pm2.5污染程度{:soso_e144:},还可以发表到物联网服务器,随时随地都可以看到空气清洁程度的变化。
所需要的硬件:
序 号 硬 件 数 量 备 注
1 Arduino 1
2 DSM501A 1
3W5100网络模块1
4 DHT11 1 非必须
5 TPLink 703N 1 非必须
物联网服务器:
乐联或者yeelink,这里选择的是乐联。
考虑到要监测的地点可能要变动,所以方案中用到TPLink703N无线路由器,这样可以端着到处跑,变成移动监测站{:soso_e113:},当然,如果你只是要监测路由器旁边的空气质量,那就扯一根网线就行,703N就省了,顺便省了不少银子。
一、连接硬件
硬件连接拓扑图:
注意,DSM501A传感器有两个数据输出引脚,4号脚是可以调节采样精度的,这个我们不用,接2号脚,另外一端接入Arduino,程序中用的是D8,也可以是其它可用IO脚。
二、注册/设置乐联帐户
如果你已经注册成功乐联帐户,并且已经添加网关和设备,那可以跳过这一步。
2.1 添加网关
乐联网的网关概念跟pachube里的设备概念差不多,就是可以管理传感器的设备。
标识是服务器自动给出的,类型可以根据自己的设备选择,我这里选择的是Arduino,名称取一个自己好记的有含义的词语就行。
是否可控不用勾选,目前用不到这个属性。
如果你准备在你的乐联门户页面公开你的传感器数据,则可以勾选是否公开,这样以后不用登录就可以通过互联网查看传感器数据,当然其他人也可以随便查看。
2.2 添加设备
这里的设备就是传感器。
注意类型要选择颗粒物3;是否公开跟网关对应选项一样。
三、设置TPLink703N工作模式
在这个应用中,TPLink703N工作方式类似于无线网卡,负责将W5100网络模块的网络请求发给主路由器,或者将路由器接收到的服务器反馈转发给W5100,因此需要将TPLink703N设置成client模式。
3.1 设置模式
选择无线AP模式
选择client模式
3.2 设置IP地址
按理讲设置成动态IP也应该可以,但是遇到过麻烦,而且不方便以后对它的管理,所以这里选择设置成固定IP
3.3 无线设置
因为主路由器采用WPA2安全措施,所以TPLink703N要连接到主路由器的话,需要设置SSID和密码才能成功接入。这里的设置跟主路由器的设置密切相关,不清楚的话要打开主路由器的设置界面查看选项。下面图示仅供参考。
设置完之后,重启TPLink703N,就可以以client模式接入主路由器。
四、Arduino程序
所有的硬件接线正确之后,就可以upload程序到Arduino,从而采集颗粒物数据。
为了简化程序,方便维护,我将DSM501传感器的采集过程单独封装成一个library,需要的可以从这里下载。
另外,还需要一个最新版的leweiclient库,注意不要下载那个带TCP字样的library。
主程序:
#include <DHT11.h>
#include <dsm501.h>
#include <LeweiClient.h>
#include <SPI.h>
#include <Ethernet.h>
#define LW_USERKEY "你自己的USERKEY"
#define LW_GATEWAY "01"
char my_addr="http://192.168.16.221/api";
int port =8889;
LeWeiClient *lwc;
dsm501 DSM501A;
DHT11 dht11(2);
void setup()
{
Serial.begin(9600);
DSM501A.setDatapin(8);
DSM501A.enableFilter();
connectRouter();
lwc = new LeWeiClient(LW_USERKEY, LW_GATEWAY);
}
void loop()
{
if (lwc)
{
unsigned long op,fp; //origin particles, filtered particles
DSM501A.getParticles(op,fp);
lwc->append("p1",double(op));
lwc->append("p2",double(fp));
Serial.print(">>>>>>>>>>>>>>>>>>>>>p1.particles: ");
Serial.println(op);
Serial.print(">>>>>>>>>>>>>>>>>>>>>p2.particles: ");
Serial.println(fp);
int err;
float t,h;
if ((err=dht11.read(h,t))==0)
{
char* sensor;
sensor="t1";
lwc->append(sensor, t);
sensor="h1";
lwc->append("h1", h);
}
lwc->send();
}
}
void connectRouter()
{
String stringOne;
uint8_t mac[] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
#if 0
IPAddressmyip(192, 168, 16, 133);
IPAddressdnsip(202,103,225,68); //get this ip from local isp
IPAddressgateway(192, 168, 16, 105);
Ethernet.begin(mac, myip, dnsip, gateway);
#else
Serial.println("DHCP in process !");
if (Ethernet.begin(mac) == 0)
{
Serial.print(F("Failed to configure Ethernet using DHCP\n"));
}
else
{
Serial.print("My IP address: ");
for (byte thisByte = 0; thisByte < 4; thisByte++) {
// print the value of each byte of the IP address:
Serial.print(Ethernet.localIP(), DEC);
Serial.print(".");
}
Serial.println();
Serial.println(F("Ethernet configuration OK\n"));
stringOne="http://";
stringOne+=Ethernet.localIP();
stringOne+=".";
stringOne+=Ethernet.localIP();
stringOne+=".";
stringOne+=Ethernet.localIP();
stringOne+=".";
stringOne+=Ethernet.localIP();
stringOne+=":";
stringOne+=port;
stringOne+="/api";
Serial.println(stringOne);
stringOne.toCharArray(my_addr, 50);
}
#endif
}
正常上传之后,便可以查看数据曲线
所有的硬件装在一个快餐盒里的,接线太难看,先不上图。{:soso_e106:} 注意DSM501传感器安装的时候,必须跟地面垂直,因为它底下有个电阻加热空气,要是偏的话,热空气从孔里直接排到空气中了,影响数据准确性。 图画的真好~ 奈何col 发表于 2013-6-23 19:29 static/image/common/back.gif
图画的真好~
:lol 哈哈 楼主你好,请问你图中PM2.5的单位是什么? 楼主,有空加我QQ:18333856
有DSM501A的问题请教,谢谢。 DSM501传感器的采集过程单独封装成一个library这个我没法下载,你可以发一个给我嘛,楼主,我的邮箱:
312797290@qq.com 楼主,求DSM501A的library邮箱372308269@qq.com感激不尽!!
页:
[1]