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