基於W5500+Yeelink的遠程燈光控制設計

概述 

工具:物聯網雲平台Yeelink  DHT11溫濕度傳感器   W5500EVB

編譯環境:Keil4

目的:通過以太網實時監控遠程某個位置的溫度和濕度

在W5500EVB端連接LED燈,通過W5500與網絡連接,並與物聯網雲平台Yeelink中添加設備建立連接;之後系統會將讀取的溫度和濕度上傳到物聯網雲平台Yeelink,這樣就可以隨時通過網絡觀察溫度和濕度變化。 物聯網雲平台Yeelink還提供了一個簡單的手機,登陸 Yeelink賬號,也可以隨時隨地的觀察溫度和濕度的變化。

一、物聯網雲平台Yeelink

物聯網雲平台Yeelink在之前發的帖子里有簡單的介紹,官方網站也有詳細的介紹,在此就不再多講了。如果有問題的可以回復我,謝謝。

圖1是設備添加號以後自動生成的一個開關模型,點擊它可以控制LED燈的亮滅。

 Yeelink-LED1圖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(); /*初始化串口通信:[email protected]*/

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信息。如圖2所示,{“timestamp”:”2014-11-21T17:39:24″,”value”:0}的value後就是開關狀態,然後通過打開的測試就可以的到具體的開關狀態。

 Yeelink-LED2

圖2  串口打印信息

 5.在讀取數據的過程中,每讀一次數據Socket就要關閉在開一次,但是測試發現在等待關閉的情況讀取幾次以後就不能正常關閉,如果出現這種問題可以直接關閉Socket後再打開。

By Andy

更多交流:

WIZnet中文官方網站:http://www.iwiznet.cn

WIZnet企業微博:http://weibo.com/wiznet2012