搜索
bottom↓
回复: 14

基于W5500+Yeelink的远程灯光控制设计

[复制链接]

出0入0汤圆

发表于 2014-12-1 10:54:56 | 显示全部楼层 |阅读模式
本帖最后由 傻彪5213 于 2014-12-1 13:39 编辑

基于W5500的远程灯光控制设计
概述
工具:物联网云平台Yeelink  DHT11温湿度传感器   W5500EVB
编译环境:Keil4
目的:通过以太网实时监控远程某个位置的温度和湿度
    在W5500EVB端连接LED灯,通过W5500与网络连接,并与物联网云平台Yeelink中添加设备建立连接;之后系统会将读取的温度和湿度上传到物联网云平台Yeelink,这样就可以随时通过网络观察温度和湿度变化。 物联网云平台Yeelink还提供了一个简单的手机,登陆 Yeelink账号,也可以随时随地的观察温度和湿度的变化。

一、物联网云平台Yeelin
物联网云平台Yeelink在之前发的帖子里有简单的介绍,官方网站也有详细的介绍,在此就不再多讲了。如果有问题的可以回复我,谢谢。
图1是设备添加号以后自动生成的一个开关模型,点击它可以控制LED灯的亮灭。

图1 开关设备
二、W5500简介
韩国WIZnet公司生产的以太网控制芯片W5500整合了五层结构中的前四层,即物理层、数据链路层、网络层和传输层,并在内部利用硬件实现了TCP/IP协议栈。开发者无需专业的网络知识,使用W5500如同控制外部存储器一样简单,为用户提供了最简单的网络接入方法。全硬件TCP/IP协议栈完全独立于主控芯片,可以降低主芯片负载且无需移植繁琐的TCP/IP协议栈,便于产品实现网络化更新。

以太网控制芯片W5500具有以下特点:
1、W5500支持硬件TCP/IP协议,包括TCP、UDP、ICMP、IPv4、ARP、IGMP、PPPoE和以太网的PHY和MAC层,TCP/IP协议的硬件实现,使得应用协议的实现更简单容易;
2、支持8个独立的SOCKET同时工作,可同时工作在不同的工作模式;
3、支持掉电模式,并支持网络唤醒,最大程度地减少功率消耗和发热;
4、支持高速SPI接口(SPI MODE 0,3),SPI的时钟最高可达到80MHz,极大地提高了网络通信的数据传输速率;
5、内部集成32KB存储器用于发送/接收缓存;
6、内嵌10BaseT/100BaseTX以太网物理层(PHY);
7、支持自动协商(10/100-Based全双工/半双工);
8、不支持IP分片;
9、工作电压为3.3V,但I/O信号口可承受5V电压;
10、具有多功能LED指示输出(全双工/半双工,网络连接,网络速度,活动状态等);
11、48引脚LQFP无铅封装(7x7mm, 0.5mm 间距)。


三、系统设计
1. 电路设计
电路很简单,在W5500EVB板上有STM32最小系统电路,所有引脚引出,我们只要在任何一个未被占用的端口接入一个LED登就可以。好多爱好者可能没有这个板子,不过没关系。淘宝上有好多W5500的模块,通过SPI方式于你们自己的最小系统连接,再在程序中相应的引脚对应好,就可以方便控制
2. 程序分析
char postT[]={//提交温度
"GET /v1.0/device/15804/sensor/27168/datapoints HTTP/1.1\r\n"
"Host:api.yeelink.net\r\n"
"Accept:*/*\r\n"
"U-ApiKey:fea57b9cc1ed5ad34d48430785b44e8f\r\n"
"Content-Length:12\r\n"
"Content-Type:application/x-www-form-urlencoded\r\n"
"Connection:close\r\n"
"\r\n"
"{\"value\":x}\r\n"
};//xx用来填充数值

这其中,device/ID/sensor/ID 这两处ID 已经在Yeelink网站上注册得到,一个是设备ID,一个是设备上的传感器的ID,同时,一个设备可以有若干个传感器。U-ApiKey则是你的身份识别码,同样是注册后获得,只有正确提交U-ApiKey才可以在Yeelink上面更新数据。Content-Length:后面的12,指的就是 {"value":24} 的长度,更具体的格式可以翻阅Yeelink的API文档。需要注意的是,在C语言中,双引号 “”需要使用转义字符。
    在分析细节代码之前,按照惯例我们还是先来看一下主函数。在这里完成了对W5500EVB的初始化,并在主循环里面完成了向Yeelink提交数据。由于这个程序需要访问Yeelink平台,也就要求W5500EVB能访问外网,因此这里我们要确保给W5500配置IP地址能访问外网。
    置W5500为客户端模式的调用过程:W5500_Init()-->Socket_Init(s)-->Socket_Connect(s),设置过程即完成,并与远程服务器连接。连接后就可以发送数据,在这里,数据发送完成后,链接会被Yeelink断开,下次发送需要重新进行Socket_Init(s)-->Socket_Connect(s)的过程。
主程序第7行到第19行实现W5500EVB的初始化,初始化工作完成之后,单片机就可以读取数据和向Yeelink发送数据了。W5500EVB作为Yeelink客户端,在向Yeelink上传数据时为TCP连接,所以这里按照TCP的状态机模式写程序。
第25行,socket初始化之后,W5500EVB就向Yeelink发送连接请求,从而完成了每分钟向Yeelink提交一次开关状态。27到50行是建立连接后数据的读取和灯光控制过程。第27行,socket连接建立建立完成,首先把Sn_IR的第0位置1来清空中断,然后向物联网平台提交报文/请求命令,发送成功以后再通过网络读Yeelink平台开关的状态并保存在Buffer中。读到开关状态以后就可以轻松控制LED灯了。。第42行是socket等待关闭状态,这个状态很简单,由于这个状态是一方断开连接,还能够继续向服务器发送数据,所以就和socket建立连接状态基本相同了。第53行,socket关闭状态,打开socket并初始化TCP模式。


  • int main(void)
  • {  
  •   static uint8 i=0;
  •   uint8 ch=SOCK_HUMTEM;
  •   uint16 anyport=3000;
  •   uint8 server_ip[4]={42,96,164,52};//  api.yeelink.net  的ip地址
  •   RCC_Configuration(); /* 配置单片机系统时钟*/
  •   GPIO_Configuration();/* 配置GPIO*/
  •   NVIC_Configuration();/* 配置嵌套中断向量*/
  • //  Timer_Configuration();
  •   Systick_Init(72);/* 初始化Systick工作时钟*/
  •   USART1_Init(); /*初始化串口通信:115200@8-n-1*/
  •   at24c16_init();/*初始化eeprom*/
  • //  printf("W5500 EVB initialization over.\r\n");
  •   Reset_W5500();/*硬重启W5500*/
  •   WIZ_SPI_Init();/*初始化SPI接口*/
  • //  printf("W5500 initialized!\r\n");  
  •   set_default();
  •   set_network();
  •   while(1)
  •   {
  •     switch(getSn_SR(ch))
  •     {
  •       case SOCK_INIT:
  •          connect(ch, server_ip ,80);
  •         break;
  •       case SOCK_ESTABLISHED:
  •        //case SOCK_CLOSE_WAIT:
  •         if(getSn_IR(ch) & Sn_IR_CON)
  •         {
  •           setSn_IR(ch, Sn_IR_CON);
  •         }
  •                   memcpy(Buffer,post,strlen(post));
  •                   send(ch,(const uint8 *)Buffer,sizeof(Buffer));
  •                   memset(Buffer,0,sizeof(Buffer));
  • //                  printf("%d:Socket Send OK\r\n",ch);
  •                   recv(ch,Buffer,405);/*W5500接收来自Sever的数据*/                      
  • //          printf("%s\r\n",Buffer);
  •                   Buffer[401]=Buffer[401]-48;
  •                   if(Buffer[401]==0)
  •                   {
  •                    LED3 =1;
  •                    printf("LED OFF\r\n");
  •                    }
  •                    else
  •                    {  
  •                    LED3 =0;
  •                    printf("LED ON\r\n");
  •                    }
  •                             Delay_ms(200);
  •                    close(ch);
  • //               disconnect(ch);
  •         break;
  •       case SOCK_CLOSE_WAIT:   
  •                    printf("Send to Yeelink:OK\r\n");
  •         break;
  •       case SOCK_CLOSED:  
  •         socket(ch, Sn_MR_TCP,anyport++ , 0x00);   
  •         break;
  •       default:
  •         break;
  •    }   
  • }
  • }


四、测试效果
以下视屏是我自己实验的效果,通过点击开关可以看到LED灯的变化。也可以通过手机APP来控制,效果还是可以的。点击开关发现开关颜色会发生变化,如果是绿色就是开,如果是灰色就是关。手机APP端控制按钮标有ON/OFF,可以一目了然。
http://v.youku.com/v_show/id_XODM5MDg1MzQw.html
五、注意事项
1.在申请账号时要注意API KEY,添加设备时会生成一个URL请求,里面提供了设备ID device,传感器ID sensor。
2. 要理解Http方法:Get请求与Post请求的区别
Get是向服务器发送索取数据的一种请求,Get是获取信息,而不是修改信息。而Post是向服务器提交数据的一种请求,Post请求则作为http消息的实际内容发送给web服务器,数据放置在HTML Header内提交,Post没有限制提交的数据。
控制灯光是W5500作为客户端向物联网平台获取信息,获取开关状态来控制LED的亮与灭,所以选用GET请求。
3.把之前得到的API KEY、设备ID、传感器ID添加到程序中的请求报文中
4.好多人可能会发现,得到的开关状态不知道去哪了,也不知道如何得到,我可以给大家提供一个比较简单的方法,当我们从物联网平台Yeelink端得到状态并保存在Buffer后,可以通过串口打印Buffer信息。如下图所示,{"timestamp":"2014-11-21T17:39:24","value":0}的value后就是开关状态,然后通过打开的测试就可以的到具体的开关状态。


5.在读取数据的过程中,每读一次数据Socket就要关闭在开一次,但是测试发现在等待关闭的情况读取几次以后就不能正常关闭,如果出现这种问题可以直接关闭Socket后再打开。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2014-12-1 12:31:12 | 显示全部楼层
帮顶,学习了     

出0入0汤圆

发表于 2014-12-1 12:31:44 | 显示全部楼层
有原理图  连接图就更好了

出0入0汤圆

 楼主| 发表于 2014-12-1 13:33:53 | 显示全部楼层
seeyou2013 发表于 2014-12-1 12:31
有原理图  连接图就更好了

不好意思 ,板子是配套的,没什么连接图。原理图如下。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2014-12-4 21:24:19 | 显示全部楼层

出0入0汤圆

发表于 2014-12-4 22:05:23 | 显示全部楼层
我也试过,问题是当你要控制的东西多了就比较麻烦了,每个都需要不停的去询问,实时性降低很多,只能玩玩。

出0入0汤圆

发表于 2014-12-5 08:32:56 | 显示全部楼层
广告吗?卤煮

出0入0汤圆

发表于 2014-12-29 21:15:48 | 显示全部楼层
貌似比W5100发热改善了些

出0入0汤圆

 楼主| 发表于 2014-12-31 10:00:56 | 显示全部楼层
本帖最后由 傻彪5213 于 2014-12-31 13:56 编辑
lionsg 发表于 2014-12-29 21:15
貌似比W5100发热改善了些


我看了技术文档,功耗更低了、RX/TX缓存增至32k,有8个Socket。
我觉得改善还是比较大的。

出0入0汤圆

发表于 2014-12-31 15:51:16 | 显示全部楼层
是吧,价格也水涨船高了,看看长期稳定性怎么样

出0入0汤圆

 楼主| 发表于 2015-1-4 09:18:13 | 显示全部楼层
lionsg 发表于 2014-12-31 15:51
是吧,价格也水涨船高了,看看长期稳定性怎么样

不是吧,我在淘宝上看了一下,W5500的价格还是相对很合理的。它相对于W5100、W5200等也是很稳定的。

出0入0汤圆

发表于 2015-2-12 09:10:59 | 显示全部楼层
mark ,有空看一下Yeelin

出0入0汤圆

发表于 2015-2-12 09:34:08 | 显示全部楼层
好东西,关注一下yeelink

出0入0汤圆

发表于 2015-2-12 14:38:49 | 显示全部楼层
楼主,知道怎么一个请求上传多个传感器数据或者获取多个开关的状态吗,实际应用不可能只用一个开关或者传感器,要分次读取实时性就会下降,请教了

出0入0汤圆

发表于 2015-5-10 18:15:30 | 显示全部楼层
很牛的资料啊,谢谢分享给大家,点赞一个
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-18 16:43

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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