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

概述 web

工具:物聯網雲平臺Yeelink  DHT11溫溼度傳感器   W5500EVBapi

編譯環境:Keil4緩存

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

在W5500EVB端鏈接LED燈。經過W5500與網絡鏈接。並與物聯網雲平臺Yeelink中加入設備創建鏈接;以後系統會將讀取的溫度和溼度上傳到物聯網雲平臺Yeelink。這樣就可以隨時經過網絡觀察溫度和溼度變化。 物聯網雲平臺Yeelink還提供了一個簡單的手機。登錄 Yeelink帳號,也可以隨時隨地的觀察溫度和溼度的變化。app

1、物聯網雲平臺Yeelink

物聯網雲平臺Yeelink在以前發的帖子裏有簡單的介紹。官方站點也有具體的介紹。在此就再也不多講了。socket

假設有問題的可以回覆我。謝謝。函數

圖1是設備加入號之後本身主動生成的一個開關模型。點擊它可以控制LED燈的亮滅。工具

 Yeelink-LED1圖1 開關設備post

 

2、W5500簡單介紹

韓國WIZnet公司生產的以太網控制芯片W5500整合了五層結構中的前四層,即物理層、數據鏈路層、網絡層和傳輸層。並在內部利用硬件實現了TCP/IP協議棧。ui

開發人員無需專業的網絡知識,使用W5500如同控制外部存儲器同樣簡單。爲用戶提供了最簡單的網絡接入方法。

全硬件TCP/IP協議棧全然獨立於主控芯片,可以減小主芯片負載且無需移植繁瑣的TCP/IP協議棧。便於產品實現網絡化更新。

 

以太網控制芯片W5500具備下面特色:

一、W5500支持硬件TCP/IP協議,包含TCP、UDP、ICMP、IPv四、ARP、IGMP、PPPoE和以太網的PHY和MAC層,TCP/IP協議的硬件實現,使得應用協議的實現更簡單easy;

二、支持8個獨立的SOCKET同一時候工做,可同一時候工做在不一樣的工做模式;

三、支持掉電模式。並支持網絡喚醒,最大程度地下降功率消耗和發熱;

四、支持快速SPI接口(SPI MODE 0,3),SPI的時鐘最高可達到80MHz,極大地提升了網絡通訊的傳輸數據速率。

五、內部集成32KB存儲器用於發送/接收緩存;

六、內嵌10BaseT/100BaseTX以太網物理層(PHY)。

七、支持本身主動協商(10/100-Based全雙工/半雙工);

八、不支持IP分片;

九、工做電壓爲3.3V,但I/O信號口可承受5V電壓;

十、具備多功能LED指示輸出(全雙工/半雙工。網絡鏈接,網絡速度,活動狀態等);

十一、48引腳LQFP無鉛封裝(7x7mm, 0.5mm 間距)。

 

3、系統設計

1. 電路設計

電路很是easy,在W5500EVB板上有STM32最小系統電路,所有引腳引出,咱們僅僅要在不論什麼一個未被佔用的port接入一個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爲client模式的調用過程:W5500_Init()–>Socket_Init(s)–>Socket_Connect(s),設置過程即完畢,並與遠程server鏈接。鏈接後就可以發送數據,在這裏,數據發送完畢後。連接會被Yeelink斷開,下次發送需要又一次進行Socket_Init(s)–>Socket_Connect(s)的過程。

主程序第7行到第19行實現W5500EVB的初始化,初始化工做完畢以後,單片機就可以讀取數據和向Yeelink發送數據了。

W5500EVB做爲Yeelinkclient。在向Yeelink上傳數據時爲TCP鏈接。因此這裏依照TCP的狀態機模式敲代碼。

第25行。socket初始化以後,W5500EVB就向Yeelink發送鏈接請求,從而完畢了每分鐘向Yeelink提交一次開關狀態。

27到50行是創建鏈接後數據的讀取和燈光控制過程。第27行,socket鏈接創建創建完畢。首先把Sn_IR的第0位置1來清空中斷,而後向物聯網平臺提交報文/請求命令,發送成功之後再經過網絡讀Yeelink平臺開關的狀態並保存在Buffer中。讀到開關狀態之後就行輕鬆控制LED燈了。。

第42行是socket等待關閉狀態。這個狀態很是easy,由於這個狀態是一方斷開鏈接,還能夠繼續向server發送數據。因此就和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++ , 0×00);

break;

default:

break;

}

}

}

4、測試效果

下面視屏是我本身實驗的效果,經過點擊開關可以看到LED燈的變化。也可以經過手機APP來控制,效果仍是可以的。

點擊開關發現開關顏色會發生變化,假設是綠色就是開。假設是灰色就是關。手機APP端控制button標有ON/OFF,可以一目瞭然。

5、注意事項

1.在申請帳號時要注意API KEY,加入設備時會生成一個URL請求,裏面提供了設備ID device,傳感器ID sensor。

2. 要理解Http方法:Get請求與Post請求的差異

Get是向server發送索取數據的一種請求。Get是獲取信息。而不是改動信息。而Post是向server提交數據的一種請求。Post請求則做爲http消息的實際內容發送給webserver,數據放置在HTML Header內提交,Post沒有限制提交的數據。

控制燈光是W5500做爲client向物聯網平臺獲取信息,獲取開關狀態來控制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後再打開。

演示視頻:http://www.iwiznet.cn/blog/?

p=6677

By Andy


不少其它交流:

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

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

相關文章
相關標籤/搜索