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。笔者大一下学期开始接触电子,大一大二主要玩无线传输比较多,目前大三方向为嵌入式自动化控制,主要研究四旋翼和平衡车。笔者小白,第一次发博客,如有哪里错误,希望大家海涵并指出。