11441| 2
|
[高级教程] 【DFRobot SIM808板卡测试报告】之三《MQTT上送LM35温度至物联网 |
【时间】2016-春节期间 【硬件】 1、DFRobot SIM808板卡 1块 (来自DF评测) 2、arduino leonardo 1块 (来自DF评测) 3、LM35温度传感器 1只 4、LED一只(带220欧姆限流电阻) 5、包板、杜邦线 若干 硬件接线: (1)SIM808板卡与UNO叠装,外加9V独立电源。 (2)A4为LM35温度传感器模拟输入 (3)LED接D13,用于显示数据上送 【软件】 1、来自:https://github.com/Gabriellavoura/Mqtt-and-Sim800-900 之Basic MQTTexample。进行了修改以及补充完善。其中库,各位玩家可以去以上链接下载。 2、因为使用Arduino leonardo,所以使用了serial1,在库中修改了一处。即:默认波特率改为9600。(原库为115300,导致连接失败),另外例题中的声明有误,我已经改过来了,一共这两处,在代码中有备注。 3、关于物联网网站,在我的第一篇报告中已经介绍,这次为了本报告,我又增设了一个设备、增加了一个传感器(LM352),当然又获取了一个新的设备序列号,同时设置了协议为MQTT。 【软件的基本想法】 【软件代码】 [mw_shl_code=cpp,true]/* * from: https://github.com/Gabriellavoura/Mqtt-and-Sim800-900 Basic MQTT example - connects to an MQTT server - publishes "hello world" to the topic "test/out" - subscribes to the topic "test/in" ******************************* * 2017-01-31 * 采用sim808+leo板,lm35接入,mqtt协议测试,为gps数据上送做准备 * 序列号:4G***********OBH(请用您申请到的设备序列号,个人用户是免费的) * json格式:{"sensorDatas":[{"value":23.04}]} * 上送间隔:20S * LED13显示上送过程,闪动一次上送一次,如果灯灭则本次十组数据上送完毕 */ //定义数据接入点,本例采用中国移动 #define GSMAPN "cmnet" #define GSMUSER "" #define GSMPASSWORD "" //定义库,重点是 <sim800Client.h> #include <Time.h> #include <sim800Client.h> #include <PubSubClientHotlog.h> //此处做了修改,原例题为#include <PubSubClien.h>编译报错 #include <TimeAlarms.h> //原例题使用,本文未用,但为了编译顺利,没有去除 sim800Client s800;//定义一个client实例 char imeicode[16]; char server[] = "t.tlink.io"; //*********关于连接的管理 unsigned long lastConnectionTime = 0; // last time you connected to the server, in milliseconds const unsigned long postingInterval = 10*2000; // delay between 2 datapoints, 20s int sendnum=1; //发送次数 int sendsum=10;//发送总次数,10次 //关于LM35变量*************温度传感器部分设置 int potPin = 4; //设置模拟口4为LM35的信号输入端口 float temperature = 0; //设置temperature为浮点变量 long val=0; //设置val为长整数变量 void callback(char* topic, byte* payload, unsigned int length) { // handle message arrived char mypl[48]; Serial.println(length); memcpy(mypl,payload,length); mypl[length]=char(0); Serial.print("receive: "); Serial.print(topic); Serial.print("->"); Serial.println(mypl); } PubSubClient client(server, 1883, callback, s800); //设置一个client实例,命名为s800,连接.tlink.io:1883 void setup() { Serial.begin(9600); Serial.println("SIM800 Shield testing."); pinMode(13, OUTPUT); //用于显示数据上送 for (int i=0; i<10; i++){ delay(5000); Serial.println("try to init sim800"); //判断是否是硬串口,leo采用serial1 #ifdef HARDWARESERIAL if (s800.init( 7, 6)) break; #else if (s800.init(&Serial1 , 7, 6)) break; #endif } Serial.println("try to setup sim800"); s800.setup(); s800.stop(); s800.TCPstop(); s800.getIMEI(imeicode); Serial.print("IMEI: "); Serial.println(imeicode); //建立TCP连接,接入点cmnet while (!s800.TCPstart("cmnet","","")) { Serial.println("TCPstart failed"); s800.TCPstop(); delay(1000); } Serial.println("TCPstart started"); while (!client.connect(imeicode)) { Serial.println("connect failed"); delay(1000); } Serial.println("connected"); } void loop() { val=analogRead(potPin);//温度传感器LM35接到模拟PIN4上;val变量为从LM35信号口读取到的数值 delay(200); if((millis() - lastConnectionTime > postingInterval)&(sendnum<sendsum)) { //达到发送间隔时间且不到sendsum次,则发送 temperature = (val*0.0048828125*100);//温度转换,系数基于5V--1024的比例关系,详见极客工坊温度传感器笔记,本文未做标定 sendData(temperature); sendnum=sendnum+1; } client.loop(); } void sendData(float thisData) { String msg = "{\"sensorDatas\":[{\"value\":"; //mqtt head char s_temp[5]; dtostrf(thisData,2,2,s_temp);//把温度值转换为两位整数,两位小数的字符串 msg+= s_temp; msg+="\" }] }";//结束符,具体在tlink中API定义 char mqttmsg[40]; msg.toCharArray(mqttmsg,40); //Copies the string's characters to the supplied buffer. delay(1000); //发布一组数据,标题是设备序列号,内容是json格式的传感器数据 client.publish("4G***********OBH",mqttmsg); lastConnectionTime = millis(); Serial.println(mqttmsg); digitalWrite(13, HIGH); // LED13闪动,显示数据上送 delay(1000); digitalWrite(13, LOW); }[/mw_shl_code] 【效果】 效果如下如图,其中跳变的那一个点是用手指触碰后的结果。 微信告警是来自于对阈值告警的设置,是在网站侧完成的。我最初申请评测时的GPS电子围栏完全可以用类似思路实现。技术没有任何问题。 【评测感想】 1、用sim808上送物联网,我写了两篇。目的就是希望尝试sim808对于物联网不同的玩法。如第二篇报告所说,现存的遗憾就是没有实现sim808读取gps数据后,用mqtt协议送至物联网。 但我坚信一定是可以做到的,我在https://www.adafruit.com/看到了类似的物联网应用,对此有信心,也希望和各位玩家交流。 2、这款sim808,是融合度很高的板子(GSM\GPS\GPRS),支持2G网络,玩玩语音,做一个很酷的复古手机,我想都可以进一步尝试,网上也有类似的作品(含3D打印外壳)。 但是,DF出品的这款SIM808,我猜想是希望对标adafruit的FONA以及seeed的同类产品。www.adafruit.com已经在物联网布局上走了很远,做了很多扎实的工作。https://io.adafruit.com/无论从文档\API还是教程、物联网产品都做得很不错。建议DF可以借鉴。比如结合树莓派的相机(照片上传物联网),gps位置上送等。 https://learn.adafruit.com/search?q=mqtt& 客官点击一下这个链接,就可以看到adafruit已经做了很多工作了。 在此并非给adafruit做广告,恰恰相反,我衷心希望国产一线品牌dfrobot能够做得更好,走得更远。 一共三篇的评测到此暂时告一段落。感谢这次arduino.cn社区、DF官方提供评测的机会。除了DF库的所有基础例题外,还尝试了两种方法数据上送物联网以及短信和GPS相结合的玩法。其中一键发送位置短信是完成度较高的一个小玩具。 这次评测中,关于DFsim808库的咨询,感谢得到了andy zhou(DF产品经理)的指导,令我感受到专业精神。有这样的团队,使我对DF充满信心。 祝DF、arduino.cn社区以及孝肃师兄和各位sim808评测小伙伴春节快乐。假日结束了,也是我的放松之旅、减压之旅。充电结束,即将奔赴丁酉年的漫漫旅途。 沧海抱拳。 |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed