手把手教你用单片机或arduino玩物联网.docx
《手把手教你用单片机或arduino玩物联网.docx》由会员分享,可在线阅读,更多相关《手把手教你用单片机或arduino玩物联网.docx(22页珍藏版)》请在冰豆网上搜索。
手把手教你用单片机或arduino玩物联网
物联网跟我动手做系列介绍
中国第一个免费开放的公共物联网服务平台
物联网跟我动手做系列教程分为3篇
1.物联网公共服务平台介绍篇
a)主要内容是介绍物联网基本概念,组成,还有物联网开放平台的介绍,它的主要应用领域,使用范围,还有一些案例和国际上发展的趋势。
2.Yeelink平台篇
a)主要介绍Yeelink平台的设计理念,使用的开发工具,系统架构,能够提供的服务,如何注册账号,并进行测试性的尝试。
3.Yeelink平台动手篇
A.如何用arduino+PC工具实现光照传感器数据上传和显示。
B.如何用arduino+Ethernetshield进行温度数据的上传和如何触发email报警。
第一章物联网公共服务平台介绍
物联网理念如今已经逐渐深入人心,并随着传感器技术,通信技术和互联网技术的发展逐渐触及到社会的每一个角落,物联网存在的意义在于,它彻底改变了人与人创造的机器世界和周边环境的交流方式,从此,人们能够更自由,更简单的获取各种各样的信息,也更容易的与机器和进行交互,甚至是让机器与机器(M2M)之间,建立通信和对话的桥梁,让机器更好的为人类服务。
随着物联网主机进入大数据(BigData)时代,通过对海量的传感器数据进行存储,并提取有价值的信息和形成模型,对科研,城市管理,自然科学等方面研究,都有着重要的意义。
一些大型公司所号召的物联网应用,如IBM的智慧星球,Google的智能眼镜,NASA的星球皮肤等等项目,都已经逐渐获取了市场和人们的认可。
那物联网具体有哪些表现形式,他又能为人们提供哪些方面的好处呢?
最典型的应用,就是使用RFID或者二维码标签,对各种各样的物体进行唯一性的标示,使得物品从生产和销售,回收流程中,能够被自始至终的监控,譬如对农产品的产地进行精确回溯,对生产机械的制造和运行进行监控,这样除了能够对产品的质量问题快速定位外,还赋予了用户增加更多的能力,比如远程对机械的工作情况采集甚至控制。
一个典型意义的物联网应用,一般要完成传感器数据的采集,存储,和数据的加工和处理这三项工作,举例来说,对于驾驶员,希望获取去目的地的路途上的路况,为了完成这个目标,就需要有大量的交通流量传感器对几个可能路线上的车流和天气状况进行实时的采集,并存储到集中的路况处理服务器,应用在服务器上通过适当的算法,从而得出大概的到达时间,并将处理的结果展示给驾驶员。
所以,我们能得出大概的系统架构设计可以分为如下三部分:
1.传感器硬件和接入互联网的通信网关(负责将传感器数据采集起来,发送到互联网服务器)。
2.高性能的数据接入服务器和海量存储。
3.特定应用,处理结果展现服务。
从物联网的应用形态中,我们能看出,针对具体应用的不同,我们关心的传感器数据是各有不同的,譬如,对安防应用来说,我们希望能够读取到家庭里布置的门磁,红外灯传感器的数据,而对于海洋研究来说,就希望能够读取到特定海域的气候信息,对制造风电的朋友,则希望能够获取设备的工作状态,所以,针对不同的业务类型,传感器的需求可谓是千差万别,而数据上传的手段,根据对费用,便利程度的要求不同,有GPRS,wifi,网线,工业总线等等多种选择,差别的比较大。
在我们成功采集到传感器数据后,需要解决的另外一个问题就是传感器数据的存储,几乎任何一个典型的物联网应用,都需要处理大量的数据,这对服务器的设计提出了相当高的要求,第一,需要能够同时承载数以万计,乃至数十万的同步网络数据传输,就是首先要把这些数据收好;第二能够将这些海量级的数据,以一定的规则存储好,在存的同时,还要考虑和解决数据取回的问题,举例说,500个传感器,以10秒一条的速度上数据,在1年能够达到上亿条的数据记录,这时候,如何实现数据的快速查询和取回就变得极具挑战性,除此之外,服务器还需要考虑解决安全性,可维护性,不间断的服务能力等多种问题。
数据的取回和展示也是一个非常关键的问题,随着移动互联网的兴起,人们已经不满足仅仅从web浏览器去获取数据,更多的希望能从智能手机,平板电脑等媒介,便利的获取信息,除了传感器数据给人看之外,物联网的传感器数据还可以为远程的机器或者设备直接获取,并按照既定规则直接执行相应的动作,譬如大型养鸡场,根据鸡笼的文档变化,自动调节恒温系统;办公大楼根据大量光照传感器的读数和感知各个楼层的人数,自动调整灯光系统的水平,这些都是典型的机器直接使用传感器数据的例子。
从上面的介绍我们能看出,尽管存在着形形色色的物联网应用,但是它们都需要有一个基于互联网的平台加以支撑,而这个平台的稳定性,可靠性,易用性,对该物联网项目的成功实施,有着非常关键的作用,所以,类如IBM,CISCO,HP等IT基础设施和解决方案提供商,包括国内的一些科技行业巨头和科研院所,都提出了各种各样的平台方案,利用云计算和云存储的理念,解决上述的提到的服务共性问题;但是遗憾的是,到目前为止,这些方案和解决思路都是封闭的,是为了解决特定问题营运而生的,他们并未向社会开放使用,好比天上的神仙,看起来很漂亮,但是百姓们却除了膜拜无事可做。
那么,除了国际巨头之外,存不存在这样的公司,他们自己完成物联网服务平台的主要基础功能开发,然后开放接口,为公众,特别是具有一定电子或软件知识的爱好者或者中小企业服务呢?
事实上,随着世界上物联网理念的逐渐普及和深入人心,为人群重大的草根阶层量身设计的物联网公共服务平台已经逐渐出现,几个国际上规模比较大的平台有Scinan,Arrayent,COSM/Pachube等,国其中cosm是目前世界上用户量最大的开放物联网平台,他提供了一系列的数据上传手段,让每个人都能通过简单的开源硬件或者单片机,实现传感器数据的上传和存储,还提供了一系列的数据展现方式,比如dashboard,用来按时间轴多个传感器数据到一个同一个平台上(图一),另外,通过和视频识别技术和增强现实技术,移动应用的结合,还能够使用android手机对传感器设备进行识别,并自动将获取的传感器数据叠加到手机显示层上(图二),是不是很神奇呢?
图一:
COSM将多个传感器的历史数据反映到通一个WEB数据面板上
图二:
增强现实(AR)技术讲传感器数据通过3D投影实时叠加到手机屏幕
国内的平台,是目前国内第一家对公众开放的物联网公共服务平台,目标是服务中国的物联网爱好者,使得中小型的企业和电子爱好者们能够非常简单的使用物联网平台,下面,我们将详细的介绍一下yeelink平台和如何使用它来完成您的梦想。
第二章Yeelink平台介绍
Yeelink平台的设计目的,就是要成为物联网世界的开放服务提供商,完成对传感器数据的接入管理,数据存储,以及将数据随时显示给客户。
为了解决上文中提到的物联网服务器所必须解决的几个关键问题,yeelink开放和运维团队做了大量的工作,来保证可靠,安全,高质量的提供物联网公共服务,下面,先从技术层面上,来分析一下为何Yeelink具备这种提供高性能物联网服务的能力。
首先Yeelink系统在设计之初,就充分考虑了超大并发接入的可能性。
在设计接入服务系统的时候,参照新浪微博的标准(峰值3000条/秒,目前Cosm的平均值是300条/秒),Yeelink基于团队多年在开发和维护电信级服务器的经验,进行大量的设计优化,那就是,做到平台与应用服务的隔离,一个http的post服务,在经过接入网关的处理后,交给专门的服务模块进行处理,而一个完整的传感器数据存储操作,由运行在多个机器上的服务组件协同处理,有效的达到了负载上的均衡,而且很容易通过增加机器扩充容量,在理念的实现上,Yeelink采用了Node.js这一比较流行的开发语言用来提供传感器接入服务,随着雅虎,微软,Linkedin,和国内的淘宝网开始大量的采用该技术开发项目,已经证明了该技术在处理高并发,实时性和开发速度上的卓越优势,同时由于Yeelink的前段同样大量使用Javascript,所以在调试时服务器系统和前段可以以同一种语言调试,大大提高了解决问题的速度。
数据接入以后,在解决数据的存储方面,Yeelink使用了Hadoop这个分布式处理框架有针对性的搭建了一个高并发,海量存储,高可扩展性的云存储服务中心,针对传感器数据在时间上具有连续性,数据插入时速度相对恒定,数据需要快速取回(展示)等特点,Yeelink做出大量的优化工作,使得系统能够非常稳定健壮的提供数据存储的优质服务。
在对用户的数据获取手段的支持上,我们使用了基于RESTful架构的开放API体系,通过统一的webservice,使得用户在取回和管理自己的传感器数据时,界面非常友好和简单,可以使用各种语言实现客户端系统,这样很很方便在当前的移动智能应用流行的环境下,提供个性化服务,不管是在android,iOS等操作系统上,使用Yeelink提供的界面组件API,可以非常快速的搭建起属于自己独一无二的APP,加速您想法的实现速度,特有的win7桌面Widget,和论坛插件,博客插件,能够方便的将您的传感器数据,共享到社交网络。
另外,除了完成数据存储工作外,通过Yeelink的数据事件引擎,传感器数据不再是冰冷的节点,我们考虑到您的需求,定制了大量的规则触发应用,譬如在传感器达到阈值的时候,自动触发类似电信API如短消息,语言电话,彩信等应用,也能按照您所定制的数据类型,向指定的其他设备转发控制信息,从而方便的实现M2M控制,更让人兴奋的是,实现这一切,无需任何编程,通过点击网页的按钮和填写资料,就能轻松实现。
了解了这么多,是不是想亲自动手试试Yeelink到底有多好玩呢?
下面,我们就试试如何通过网页模拟传感器数据来对yeelink平台进行测试吧!
是的,如果你能猜到的话,整个测试过程,无需编写任何代码,也不使用任何硬件系统。
下面,我就简单介绍一下,如何使用web浏览器进行开放平台的使用测试:
第一步:
首先需要注册用户
注册账号后,注意填写电子邮件部分,因为,您注册后,会自动收到一封激活邮件,账号和API只有在激活以后才能正常使用。
(没收到?
可能需要去信箱的垃圾邮件那边翻翻看)
第二步:
通过点击邮箱内的连接,完成激活您的账号,这时就可以正常使用API了。
行,注册就是这么简单就完成了。
第三步:
这时候,可以打开首页的“登陆”按钮,就能看到自己的账号信息了。
在出现用户页面后,填写用户和密码即可完成登陆
登陆之后,控制面板上出现了“用户中心”,可以通过这个用户中心来管理和查看自己的物联网设备啦!
在Yeelink平台上,所有的用户设备被分为两类“设备”和“传感器”。
“设备”可以看做是一个传感器的集合,他是一个具备处理能力和互联网接入能力的网关设备,您的传感器数据,就是通过设备来接入物联网的,在这里您可以将设备理解成您的arduino或者单片机板。
“传感器”可以看做是最终的节点,他代表了一种的采集数据内容,传感器可以是和设备在一个单片机系统上,也可以是无线或有线的形式和单片机相连。
点击“用户中心”后,可以首先增加一个物联网设备:
通过点击“我的设备”—>“增加新设备”:
填好以后,直接保存,该设备就已经准备好进行上传数据和使用了。
增加完毕新设备后,还需要再添置一个传感器(因为一个设备可同时支持多个传感器),而传感器获取的数据则是我们真正关心的东西了。
添加完传感器后,系统会自动生成一个图标用来描述收集的数据
以后,这个传感器采集的数据,都会以图标的形式,展现在这里了。
要完成数据的上传,要进行如下操作:
从上图中,能看到“我的账户设置”里面,有属于您的APIKEY,这个APIkey能够是您的数据和其他人区分出来,务必请安全保存不要泄露。
数据的上传
下面介绍如何上传数据:
从这个图中,我们能看到,这个传感器的Device=8即设备号等于8,Sensor=12即传感器号等于12,这也是该传感器在服务器系统的唯一标示,我们上传数据的时候,也是依靠这两个ID和APIKEY进行数据的有效性验证。
根据API手册,就需要发送POST到URL
按照协议来说,需要发送如下数据到服务器:
POSTBODY里面需要增加如下数据:
{
“value”:
340
}
这样,就能把该传感器的数据发送到服务器了,系统会自动拿当前时间作为标记,进行存储。
如果你是使用Curl进行测试,则需要这样操作:
命令行下面敲入:
curl–requestPOST\
--data‘{“value”:
349}’\
--headerU-ApiKey:
您申请的API_KEY”\
--verbose\
默认服务器将以服务器的当前时间对该数据进行存储,如果您对时间有特别的要求,可以发送带timestamp的数据给服务器,如果没有,则服务器会自动分配一个时间,格式如图中所示,点击SEND按钮发送即可发送到Yeelink了。
如果多发送几个点,回到传感器的页面,按F5键进行刷新,就能看到绘图空间已经帮您将数据点从数据库取出并绘制成一个Flash的图片了。
怎么样,是不是很简单呢?
下面我们谈一下如何将数据从数据库中取回
数据的取回
用如下的方法取回数据
比如想取回我们刚才插入的所有数据,可以发送GET到如下的URL:
服务器会默认返回最新的一条数据记录
"{\"timestamp\":
1337158055,\"value\":
243}"
如果是希望返回某个时间段的数据,则可以根据API文档,完成获取数据的功能了。
如何进行触发规则的设定:
仅仅把数据发送到服务器,从web页面上看到图片,是不是对你来说有点简单啦?
想要更多,没问题,那就使用Yeelink强大的事件触发引擎吧!
事件触发引擎,被设计用来当某个传感器数据达到预设阈值的时候,触发由用户指定的动作,譬如说,温度传感器达到50度的时候,发送短信给你的手机号;PM2.5传感器达到100的时候,自动给驱动窗户的电机发送控制包关闭窗户,颜色传感器检测到热水器烧水开的绿灯亮后,发布微博到所有实验室同学微博上等等。
这些有趣的点子在Yeelink平台上,都非常简单。
下面就举例说明,如何设置一个简单的Email触发器吧。
首先,我们假定这样一个场景,假定要增加一个触发,让传感器数据达到600的时候,触发一个邮件发送到你的信箱,需要如下操作
1.点击设备的名字
2.
点击绿色的增加触发按钮,然后添加一个触发动作即可
3.这里我们添加一个,当光线传感器的流明达到600的时候,自动发送电子邮件给自己就可以了,就是这么简单,注意默认15分钟内,邮件只会触发一次哦。
等你配置好后,就可以迅速的用上次提到的网页测试工具试试吧!
更多的通知方式,如短消息,语言电话,微博通知,还有其他的有趣功能会在后面逐一放出,敬请期待吧。
第三章:
Yeelink动手做
上面,我们都是在讨论Yeelink平台的功能和如何使用网页来简单的测试Yeelink,下面就让我们用电子爱好者都比较熟悉的开源硬件Arduino,或者是你手边上的单片机,来进行实际的实验吧。
第一个实验arduino/单片机+PC实现光照传感器数据上传和显示
实现首先从一块arduino板和一种传感器,通过电脑完成数据的上传,这个最简单,也适应于其他类似的单片机用户,只要会使用串口操作,就能够完成这个实验。
需要硬件:
1.任一支持串口输出的单片机(包括arduino)
2.任一传感器
需要软件:
串口转http软件(yeelink开发并开放源码目前仅提供windows版本)
实验流程:
1.在你的硬件上,将读取到的传感器数据作为字符串独立一行打印出来,在行首加上”yeelink:
”.比如在Arduino上使用
Serial.print("yeelink:
");
Serial.println(value);
2.运行yeelink串口工具,选择与你硬件连接的串口和波特率,当然,还少不了要用线缆连起来:
)
3.登录网站,进入用户中心,在我的设备>>设备管理中找到即将要上传的数据的传感器,如果你还没有添加,这里有上一章的Yeelink平台使用手册添加。
将其中的URL复制到工具的上传地址一栏。
另外,从帐户>>我的帐户设置中找到APIKEY一栏。
将其复制到工具的API-KEY中,然后点击连接就可以打通串口到Yeelink服务器的通道了。
至此,你的工作已经完成了,程序会打印出log供你分析出现的问题。
如果没有异常,你应该会见到如前面主界面所示的结果。
这时候,当你的硬件往串口上写入数据,本工具就会检测到,并提取出来,然后上传到yeelink上你指定的传感器地址。
结束语
程序上传的数据会在网页上绘制出曲线图,当你看到这样的数据图是是不是很激动呢。
原本很复杂的过程现在变得如此简单,没错,就是如此简单。
还犹豫什么,马上试一试。
第二个实验arduino+Ethernetshield进行光强数据上传和触发Email报警。
硬件需求
Arduino主板
Ethernet板
BH1750光强传感器模块(你可以替换成自己的传感器)
硬件连接:
电路
Ethernet板和主板的插接略去。
传感器插接线:
VCC-5v
GND-GND
SCL-SCL(analogpin5)
SDA-SDA(analogpin4)
ADD-NC
实验过程,
在连接好线路以后,下一步,就是讲arduino连接到电脑上,并将下面我们给出的示例程序下载到arduino上,即可运行了。
程序的代码如下:
*
//Yeelink测试程序
将光照传感器的数据采集,并通过以太网卡,发送到Yeelink服务器上
*/
#include
#include
#include
#include
intBH1750address=0x23;
bytebuff[2];
//foryeelinkapi
#defineAPIKEY"9cdf51696fa9ddfacdf819033a5f2f63"//这里用您的yeelinkAPIkey替换
#defineDEVICEID4//这就是您yeelink网站上的设备号,请参见Yeelink平台手册获取
#defineSENSORID7//这个更换成您的传感器号码,如何取得请参阅YeelinkreplaceyoursensorID
//assignaMACaddressfortheethernetcontroller.
bytemac[]={0x00,0x1D,0x72,0x82,0x35,0x9D};
//initializethelibraryinstance:
EthernetClientclient;
//charserver[]="";//yeelinkAPI的服务器名称
IPAddressserver(202,136,60,231);//这里填的是yeelink平台的入口服务器IP
unsignedlonglastConnectionTime=0;//上次连接到服务器的时间,毫秒
booleanlastConnected=false;//上次连接状态
constunsignedlongpostingInterval=30*1000;//默认发送间隔30秒
voidsetup(){
Wire.begin();
//startserialport:
Serial.begin(57600);
//starttheEthernetconnectionwithDHCP:
if(Ethernet.begin(mac)==0){
Serial.println("FailedtoconfigureEthernetusingDHCP");
for(;;)
;
}
else{
Serial.println("EthernetconfigurationOK");
}
}
voidloop(){
//ifthere'sincomingdatafromthenetconnection.
//senditouttheserialport.Thisisfordebugging
//purposesonly:
if(client.available()){
charc=client.read();
Serial.print(c);
}
//ifthere'snonetconnection,buttherewasonelasttime
//throughtheloop,thenstoptheclient:
if(!
client.connected()&&lastConnected){
Serial.println();
Serial.println("disconnecting.");
client.stop();
}
//ifyou'renotconnected,andtensecondshavepassedsince
//yourlastconnection,thenconnectagainandsenddata:
if(!
client.connected()&&(millis()-lastConnectionTime>postingInterval)){
//readsensordata,replacewithyourcode
intsensorReading=readLightSensor();
//senddatatoserver
sendData(sensorReading);
}
//storethestateoftheconnectionfornexttimethrough
//theloop:
lastConnected=client.connected();
}
//thismethodmakesaHTTPconnectiontotheserver:
voidsendData(intthisData){
//ifthere'sasuccessfulconnection:
if(client.con