查看: 1128|回复: 0
打印 上一主题 下一主题

基于Yeelink+STM32+W5100的温湿度网络监测系统

[复制链接]
跳转到指定楼层
沙发
发表于 2015-10-7 14:47:06 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
这个东东断断续续搞了有一年多,最近测试了一周以上,貌似还比较稳定,遂发表出来,感兴趣的朋友可以仿制一个。

首先我来介绍一下Yeelink是干什么的。
Yeelink物联网平台简介   
      Yeelink是一个开放的通用物联网平台,主要提供传感器数据的接入、存储和展现服务,为所有的开源软硬件爱好者、制造型企业,提供一个物联网项目的平台。使得硬件和制造业者能够在不关心服务器实现细节和运维的情况下,拥有交付物联网化的电子产品的能力。Yeelink侧重于成为物联网的middleware和Enabler,是传统电子电器制造业者的朋友和伙伴。
     平台已支持数值型、图像型、GPS型和泛型等多种数据的接入,并提供完备的API文档和代码示例。通过API接口,您只需要简单的几步操作就能将传感器接入Yeelink平台,实现传感器数据的远程监控。
     Yeelink独有设计的高并发接入服务器和云存储方案,能够同时完成海量的传感器数据接入和存储任务,确保您的数据能够安全的保存在互联网上,先进的鉴权系统和安全机制,能够确保数据只在您允许的范围内共享。
     当您的数据达到某个设定阈值的时候,Yeelink平台会自动调用您预先设定的规则,发送短信,微博,或者是邮件,您还可以充分利用平台的计算能力,定期的将统计分析数据发送到邮箱内,这一切仅需在网页上简单的点击几个按钮
     Yeelink平台的最大特点,在于不仅仅能够提供数据的上行功能,还能够实现对家庭电器的控制功能,快要到家前想洗个热水澡,还是要提前把空调打开?很简单,用手机的智能App,这些就是举手之劳。
     在Yeelink上,数据不再是孤单的节点,存储在Yeelink的数据,可以简单的被API取回,放置到您的个人博客上,或者根据规则自动转发到您指定的微博上,在这里,您将会感受到数据和人之间的全面融合。

简单地说,就是可以把你采集到的数据提交到Yeelink,同时Yeelink会以一定的形式展现出来。比如我们采集温湿度数据,然后提交上去,这样,无论你人在何方,只要能接入互联网,你就可以实时地在线监测温湿度值。比如下面的这幅图,



这就是我的卧室最近一周的监测结果。图上的几次数据大幅波动是因为我进行数据修正以及家里断电造成的。

在Yeelink的官网(http://www.yeelink.net/),提供了具体的API操作方法以及简单的几个入手的小例子:对于没有网络模块的玩家,可以将采集到的数据通过串口发送到电脑上,然后在电脑上运行客户端软件进行转发,这种方法虽然快捷,但是必须依赖电脑,缺乏实用性;还有一个使用Arduino+W5100模块进行开发的例子,这个例子同样具有局限性,Arduino的售价普遍较高,而且也很少有人将Arduino运用于生产生活实际,Arduino将底层操作进行了高度封装,虽然是方便了开发者,但是却永远学不到核心的知识。

如今以stm32为例的Cortex-M3内核发展得如火如荼,我们就以STM32为核心进行控制。如何让单片机上网呢?很多朋友会联想到EN28J60这款芯片,这款芯片虽然价格低廉,但是不带协议栈,必须由单片机进行处理。移植协议栈是一个繁杂的工程,尽管网上有一些现成的模板,也不能保证一次成功。相比之下,W5100这款芯片具有较高的性价比,不仅自带了TCP  UDP 协议栈,还可以进行PPPoE拨号上网,10M/100M自适应,由于W5100集成了PHY,所以只需外接若干电阻电容以及一个带网络变压器的网线接口座即可。向网站提交数据,属于HTTP报文,这个需要我们自行构造,不熟悉的朋友可以从网上下载抓包软件进行抓包,可以具体看到HTTP报文的样式。HTTP整个协议内容比较多,我们无需做过多了解,够用就行。例如,向Yeelink提交温度值,我们需要构造如下数据包:
POST /v1.0/device/ID/sensor/ID/datapoints HTTP/1.1
Host: api.yeelink.net
Accept: */*
U-ApiKey: acxxxxxxxxxxxxxxxxxxxxxxxxxxxx70
Content-Length: 12
Content-Type: application/x-www-form-urlencoded
Connection: close

{"value":24}

复制代码
这其中,device/ID/sensor/ID 这两处ID 需要你在Yeelink网站上注册得到,一个是设备ID,一个是设备上的传感器的ID,同时,一个设备可以有若干个传感器。U-ApiKey则是你的身份识别码,同样是注册后获得,只有正确提交U-ApiKey才可以在Yeelink上面更新数据。Content-Length:后面的12,指的就是 {"value":24} 的长度,更具体的格式可以翻阅Yeelink的API文档。需要注意的是,在C语言中,双引号 “”需要使用转义字符。

至于传感器,我这里使用的是大家最常见的DHT11。说实话,这款传感器实在是不怎么地,相当不准。不过作为实验,不去深究了。根据Yeelink的限制,两次相邻的数据提交之间须相隔至少10秒,否则返回拒绝。正常提交后,Yeelink会返回如下数据:
HTTP/1.1 200 OK
Server: nginx/1.0.14
Date: Mon, 24 Jun 2013 13:46:49 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: close
X-Powered-By: PHP/5.3.10-1ubuntu3.6
Set-Cookie: CAKEPHP=p7cgsbd1oh5anbh8s3rj7nos31; expires=Tue, 02-Jul-2013 21:46:49 GMT; path=/
P3P: CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"

0

复制代码
对于做实验而言,可以不必关心它。在我的代码中,不对接收到的数据进行处理。

置W5100为客户端模式的调用过程:W5100_Init()-->Socket_Init(s)-->Socket_Connect(s),设置过程即完成,并与远程服务器连接。连接后就可以发送数据,在这里,数据发送完成后,链接会被Yeelink断开,下次发送需要重新进行Socket_Init(s)-->Socket_Connect(s)的过程。由于要提交温度、湿度两种数据,我使用了W5100里的两个socket,分别进行提交过程。

在代码实现上,由于要进行30秒的数据发送间隔,socket切换,W5100状态获取以及温湿度采集和发送,我使用了Protothread多线程状态机,通过构造4个线程,有效地避开了传统前后台+超循环方式带来的弊病。更多关于Protothread 的介绍可以自行百度获取。
int main(void)
{
        PT_INIT(&pt1);     //线程初始化
        PT_INIT(&pt2);
        PT_INIT(&pt3);
        PT_INIT(&pt4);


        i=0;               //先发送湿度
        CompleteDelay=1;   //用以启动线程
        GetHumiture  =0;
        AskForDelay  =0;

        System_Configuration();
        W5100_Initialization();
        Delay_ms(1000);
        while(1)
        {
                protothread1(&pt1);//延时线程
                protothread2(&pt2);//读取温湿度线程
                protothread3(&pt3);//Socket初始化线程
                protothread4(&pt4);//发送线程
                W5100_Interrupt_Process();
        }
}
复制代码
在这里,通过轮询获取W5100状态。

下面是原理图和源代码,欢迎参考。原理图中有其他部分,可忽略。
原理图


原理图中以实际网络标号为准,粉色字体,如“PE5->”之类的不必理会。

源代码



下面来两张板子的照片




调试电路用的是我自制的ST-LINK V2


本文属本人原创(ID:renpeng009)未经本人同意,不得转载!转载

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入中科因仑

本版积分规则

快速回复 返回顶部 返回列表