2016年7月至8月下旬,筆者正逢大一暑假,和兩個大二的師兄一起參加了這個比賽。
現(xiàn)在筆者讀大三,比較有時間便分享一下這段經(jīng)歷,下面主要講整個系統(tǒng)的設(shè)計和之后完善方向。
首先是解題思路:我們查看了官網(wǎng)上有關(guān)這次比賽健康電子專題的資料,資料上提出希望參賽者結(jié)合互聯(lián)網(wǎng)+、物聯(lián)網(wǎng)技術(shù),設(shè)計一個關(guān)于健康電子的作品。于是,我們便有了這個想法,通過無線方式上傳數(shù)據(jù)至云端,監(jiān)測、上傳一些危害人體健康的數(shù)據(jù),并可以實時看到數(shù)據(jù)且通過控制減少危害,這完全切合題意。
系統(tǒng)實現(xiàn)的功能:集云端監(jiān)測、自動化控制(閉環(huán))、遠程控制(開環(huán))于一體,運用WIFI和GPRS技術(shù),將水質(zhì)指標(biāo)數(shù)據(jù)上傳至云端(OneNet物聯(lián)網(wǎng)云服務(wù)平臺),當(dāng)水質(zhì)指標(biāo)值超過設(shè)定值時,系統(tǒng)向用戶發(fā)送手機信息和控制水質(zhì)處理設(shè)備,改善水質(zhì)的質(zhì)量。
詳細介紹:該系統(tǒng)通過傳感器檢測水體中的水溫、水濁度、PH值以及外界的光照強度。經(jīng)過單片機(arduino)的處理,系統(tǒng)將傳感器的數(shù)值轉(zhuǎn)換為對應(yīng)的水體指標(biāo)數(shù)值,經(jīng)過按鍵選擇WIFI和GPRS傳輸模式,將數(shù)據(jù)上傳至ONENET平臺。用戶可通過電腦網(wǎng)頁或手機APP查看數(shù)據(jù)和控制水質(zhì)處理設(shè)備。當(dāng)水質(zhì)指標(biāo)超過設(shè)定值時,系統(tǒng)向用戶發(fā)送手機信息和控制水質(zhì)處理設(shè)備,改善水質(zhì)的養(yǎng)殖質(zhì)量。
采用的方案:
該系統(tǒng)采用WIFI和GPRS相互結(jié)合進行傳感器數(shù)據(jù)的傳輸,通過ONENET平臺進行數(shù)據(jù)的上傳。
功能框圖:
硬件:
單片機:arduino mega2560
傳感器: DS18b20 、PH計、渾濁度傳感器、光照傳感器
模塊:ESP8266、 SIM800、繼電器
主程序框圖:
部分程序框圖:
部分源代碼:
String ssid = "PUSHPULL";//需要連接的自己路由器的無線名稱
String pass = "888******";//無線密碼
#define OneNetAPIKEY "pmWLtnkDBSreKfvg7GsClUXdXa4A'' //ONENET的APIkey
#define OneNetDeviceID 79146 //設(shè)備ID號
#define OneNetSensorID0 "TEMP" //數(shù)據(jù)流名稱
#define OneNetSensorID1 "HUMI"
WIFI wifi;
void setup() {
wifi.begin(ssid,pass);//設(shè)置wifi連接
}
void loop() {
//讀取溫濕度傳感器值,經(jīng)過這個函數(shù)后,myDHT11.TEM_Buffer_Int和myDHT11.HUMI_Buffer_Int被分別填充上了溫度和濕度值
myDHT11.DHT11_Read();
//將數(shù)據(jù)上傳到ONENET對應(yīng)的設(shè)備和傳感器
wifi.postDataToOneNet(OneNetAPIKEY,OneNetDeviceID,OneNetSensorID0,myDHT11.TEM_Buffer_Int);
delay(1000);
wifi.postDataToOneNet(OneNetAPIKEY,OneNetDeviceID,OneNetSensorID1,myDHT11.HUMI_Buffer_Int);
delay(1000);
} //該代碼例程是一位arduino開發(fā)者寫的,底層函數(shù)打包在一個arduino的CPP庫中,WIFI傳輸數(shù)據(jù)全是基于這個代碼。
//以下是GPRS上傳數(shù)據(jù)的函數(shù),我們團隊編寫的。
void postGSMdatatoOneNet(String APIKEY1,unsigned long device_id,String sensor_id,float thisData){
Serial.println("AT+CIPSTART="TCP","api.heclouds.com",80"); //修改為要發(fā)送給的IP和端口
delay(3000);
Serial.println("AT+CIPSEND"); //設(shè)置發(fā)送模式
delay(100);
time = millis(); //返回當(dāng)前CPU時間
String cmd;
//以下按照ONENET通信協(xié)議,發(fā)送字符串
cmd = "POST https://api.heclouds.com/devices/";
cmd += String(device_id);
cmd += "/datapoints HTTP/1.1rn";
cmd += "Host: ";
cmd += "api.heclouds.com";
cmd += "rn";
cmd += "api-key: ";
cmd += APIKEY1;
cmd += "rn";
cmd += "Connection: close";
cmd += "rn";
cmd += "Content-Length: ";
String thisData1=String(thisData);
int length = 53 + sensor_id.length() + thisData1.length(); //算出長度
cmd += String(length);
cmd += "rnrn";
cmd += "{"datastreams":[{"id":"";
cmd += sensor_id;
cmd += "","datapoints":[{"value":";
cmd += String(thisData);
cmd += "}]}]}";
cmd += "rnrnrnrn";
Serial.print(cmd);
delay(200);
Serial.write(26);
delay(500);
Serial.println("AT+CIPCLOSE"); //傳輸關(guān)閉
delay(200);
}
傳感器方面不是我們想體現(xiàn)的主要功能,在有庫函數(shù)的情況下,arduino中傳感器程序比較簡單,我們只是將數(shù)據(jù)做了一些濾波和轉(zhuǎn)換,在這里就不貼出來了。
作品圖片:
網(wǎng)頁版
手機APP
比賽作品
附:ONENET網(wǎng)址: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,用戶免費使用其云端)
該版本的不足:
由于當(dāng)時水平不夠,所以用了編程相對比較簡單的arduino,arduino開發(fā)周期雖然短,但是局限性也比較大,如果要做深入的應(yīng)用開發(fā),還是要用其他單片機,比如STM32等。
完善方向:
該系統(tǒng)可以將單片機換成STM32,芯片為F103RCT6,比完賽后筆者在ONENET官方群上申請了這樣的一塊板,可以做后期的應(yīng)用開發(fā)。除了使用WIFI,GPRS這些無線方式,近年來比較火的NB-iot也是一個很好的方向。此外,應(yīng)用場景很廣泛,各種監(jiān)測都能使用,如果個人使用,ONENET已經(jīng)足夠了;企業(yè)使用的話,可以開發(fā)企業(yè)專屬云端和配套的網(wǎng)站、APP。
附一些資料,代碼等。