2016年7月至8月下旬,筆者正逢大一暑假,和兩個大二的師兄一起參加了這個比賽。比賽作品中,筆者主要負責整個系統的硬件部分,軟件部分負責WIFI部分和部分傳感器處理,約佔程序的50%。而我的隊友之一黃師兄負責了SIM800模塊的GSM和GPRS部分,還有傳感器處理的算法部分。另外一個隊友張師兄主要負責答辯和後勤支持。可以說,我們三個缺一不可,各自付出了努力纔有了成績。
現在筆者讀大三,比較有時間便分享一下這段經歷,下面主要講整個系統的設計和之後完善方向。
首先是解題思路:我們查看了官網上有關這次比賽健康電子專題的資料,資料上提出希望參賽者結合互聯網+、物聯網技術,設計一個關於健康電子的作品。於是,我們便有了這個想法,通過無線方式上傳數據至雲端,監測、上傳一些危害人體健康的數據,並可以實時看到數據且通過控制減少危害,這完全切合題意。
系統實現的功能:集雲端監測、自動化控制(閉環)、遠程控制(開環)於一體,運用WIFI和GPRS技術,將水質指標數據上傳至雲端(OneNet物聯網雲服務平臺),當水質指標值超過設定值時,系統向用戶發送手機信息和控制水質處理設備,改善水質的質量。
詳細介紹:該系統通過傳感器檢測水體中的水溫、水濁度、PH值以及外界的光照強度。經過單片機(arduino)的處理,系統將傳感器的數值轉換爲對應的水體指標數值,經過按鍵選擇WIFI和GPRS傳輸模式,將數據上傳至ONENET平臺。用戶可通過電腦網頁或手機APP查看數據和控制水質處理設備。當水質指標超過設定值時,系統向用戶發送手機信息和控制水質處理設備,改善水質的養殖質量。
採用的方案:
該系統採用WIFI和GPRS相互結合進行傳感器數據的傳輸,通過ONENET平臺進行數據的上傳。
功能框圖:
硬件:
單片機:arduino mega2560
傳感器: DS18b20 、PH計、渾濁度傳感器、光照傳感器
模塊:ESP8266、 SIM800、繼電器
主程序框圖:
部分程序框圖:
部分源代碼:
String ssid = "PUSHPULL";//需要連接的自己路由器的無線名稱
String pass = "888******"; //無線密碼
#define OneNetAPIKEY "pmWLtnkDBSreKfvg7GsClUXdXa4A'' //ONENET的APIkey
#define OneNetDeviceID 79146 //設備ID號
#define OneNetSensorID0 "TEMP" //數據流名稱
#define OneNetSensorID1 "HUMI"
WIFI wifi;
void setup() {
wifi.begin(ssid,pass);//設置wifi連接
}
void loop() {
//讀取溫溼度傳感器值,經過這個函數後,myDHT11.TEM_Buffer_Int和myDHT11.HUMI_Buffer_Int被分別填充上了溫度和溼度值
myDHT11.DHT11_Read();
//將數據上傳到ONENET對應的設備和傳感器
wifi.postDataToOneNet(OneNetAPIKEY,OneNetDeviceID,OneNetSensorID0,myDHT11.TEM_Buffer_Int);
delay(1000);
wifi.postDataToOneNet(OneNetAPIKEY,OneNetDeviceID,OneNetSensorID1,myDHT11.HUMI_Buffer_Int);
delay(1000);
} //該代碼例程是一位arduino開發者寫的,底層函數打包在一個arduino的CPP庫中,WIFI傳輸數據全是基於這個代碼。
//以下是GPRS上傳數據的函數,我們團隊編寫的。
void postGSMdatatoOneNet(String APIKEY1,unsigned long device_id,String sensor_id,float thisData){
Serial.println("AT+CIPSTART=\"TCP\",\"api.heclouds.com\",80"); //修改爲要發送給的IP和端口
delay(3000);
Serial.println("AT+CIPSEND"); //設置發送模式
delay(100);
time = millis(); //返回當前CPU時間
String cmd;
//以下按照ONENET通信協議,發送字符串
cmd = "POST http://api.heclouds.com/devices/";
cmd += String(device_id);
cmd += "/datapoints HTTP/1.1\r\n";
cmd += "Host: ";
cmd += "api.heclouds.com";
cmd += "\r\n";
cmd += "api-key: ";
cmd += APIKEY1;
cmd += "\r\n";
cmd += "Connection: close";
cmd += "\r\n";
cmd += "Content-Length: ";
String thisData1=String(thisData);
int length = 53 + sensor_id.length() + thisData1.length(); //算出長度
cmd += String(length);
cmd += "\r\n\r\n";
cmd += "{\"datastreams\":[{\"id\":\"";
cmd += sensor_id;
cmd += "\",\"datapoints\":[{\"value\":";
cmd += String(thisData);
cmd += "}]}]}";
cmd += "\r\n\r\n\r\n\r\n";
Serial.print(cmd);
delay(200);
Serial.write(26);
delay(500);
Serial.println("AT+CIPCLOSE"); //傳輸關閉
delay(200);
}
傳感器方面不是我們想體現的主要功能,在有庫函數的情況下,arduino中傳感器程序比較簡單,我們只是將數據做了一些濾波和轉換,在這裏就不貼出來了。
作品圖片:
網頁版
手機APP
比賽作品
附:ONENET網址:https://open.iot.10086.cn/?utm_source=baidu&utm_campaign=%E5%93%81%E7%89%8C&utm_adgroup=onenet-%E6%A0%B8%E5%BF%83&utm_term=onenet&utm_medium=search_cpc
(可以註冊賬號和下載app,用戶免費使用其雲端)
該版本的不足:
由於當時水平不夠,所以用了編程相對比較簡單的arduino,arduino開發週期雖然短,但是侷限性也比較大,如果要做深入的應用開發,還是要用其他單片機,比如STM32等。
完善方向:
該系統可以將單片機換成STM32,芯片爲F103RCT6,比完賽後筆者在ONENET官方羣上申請了這樣的一塊板,可以做後期的應用開發。除了使用WIFI,GPRS這些無線方式,近年來比較火的NB-iot也是一個很好的方向。此外,應用場景很廣泛,各種監測都能使用,如果個人使用,ONENET已經足夠了;企業使用的話,可以開發企業專屬雲端和配套的網站、APP。
下期預告:
下回筆者會將這次比賽相關資料整理下,上傳到百度雲盤,方便大家學習。同時,筆者在寒假開發ONENET申請的麒麟板,嘗試做出V2.0版本,有新的進展再更新博客。如果大家有更多更好的方案解決,或者有好的模塊介紹,可以聯繫本人QQ23154762。筆者大一下學期開始接觸電子,大一大二主要玩無線傳輸比較多,目前大三方向爲嵌入式自動化控制,主要研究四旋翼和平衡車。筆者小白,第一次發博客,如有哪裏錯誤,希望大家海涵並指出。