基於Yeelink+STM32+W5100的溫溼度網路監測系統
首先我來介紹一下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/147/sensor/162/datapoints HTTP/1.1
Host: api.yeelink.net
Accept: */*
U-ApiKey: ac87b7ac7432ce2d5daf560c672ad370
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,有興趣的朋友歡迎到我的淘寶店鋪購買 http://item.taobao.com/item.htm?id=17516390362
本文屬本人原創(ID:renpeng009672)未經本人同意,不得轉載!