找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8663|回复: 13
打印 上一主题 下一主题
收起左侧

OneNet平台传感器监测设计 51单片机+GPRS+DHT11 附源码

  [复制链接]
跳转到指定楼层
楼主
基于OneNet平台的传感器监测使用说明(以dht11为例)

1. 将电话卡(SIM900A使用的是标准SIM卡,SIM800C使用的是micro-SIM卡,这里的“卡”指的是联通、移动卡,电信卡不支持)插入GPRS模块后,上点启动,会出现以下画面,提示正在初始化连接,确保已退出其它连接

2.连接OneNet平台,会出现以下画面,表明正在连接Onenet平台
   
3.如果Onenet连接成功,LCD1602显示屏上会显示“Onenet Is Ready”,但是正常情况下“Onenet Is Ready”字样会一闪而过,被后面的“Data Is Ready”很快覆盖,所以如果长期卡在”Onenet Is Ready”表明传感器的数据读取出现了问题,请检查传感器是否完好。因此正常情况下,我们会看到以下画面

4.紧接着我们会看到上传的进度条显示,像这样(我共分为7步来标识上传进度,具体每步所做工作参照代码)




出现“7 of 7”表明我们的数据上传工作完成,我们将进入下一步
5.判断数据上传是否成功,如果数据上传成功,会出现“SEND OK”,如果上传失败,会出现“SEND FAIL”。当然,上传结果的判断不能保证完全准确,但是经过测试在大多数情况下是准确的,因为跟网络情况有关,有时不能成功检测到成功的标志。(就像原本有检测是否连上网络功能的,但是检测太耗时,故后面删除了相关代码)
6.最后,LCD1602会显示本次上传的传感器数据值,像下图
以上就是基于OneNet平台的传感器监测使用说明,以DHT11温湿度传感器为例,其它的操作方法类似
代码:
  1. //C库
  2. #include <reg52.h>
  3. #include <stdio.h>
  4. #include <string.h>
  5. //硬件驱动
  6. #include "lcd.h" //lcd1602
  7. #include "dht11.h" //dht11温湿度传感器
  8. //#define FOSC_110592M //看你使用的晶振是什么,选择启用的宏定义
  9. #define FOSC_12M
  10. #define DEVID        "25336321"
  11. #define APIKEY        "v5lJaPvQHj=qjBUSYmGOVnA5TX8="

  12. //以下用于保存单片机收到模块发来的AT指令,通过这些指令单片机可以判断模块的状态
  13. uchar GsmRcv[50] = {0};
  14. uchar GsmRcvAt[50] = {0};
  15. uchar GsmRcvCnt = 0;
  16. uchar GsmAtFlag = 0;
  17. Sensor_Structure Sensor_Data;
  18. void SerialInti()//串口初始化程序
  19. {
  20.         TMOD=0x20;//定时器1操作模式2:8位自动重载定时器

  21. #ifdef FOSC_12M                   //在这里根据晶振大小设置不同的数值初始化串口,
  22.                            //如果用的12M晶振的话装下面两种值都可以,但
  23.                            //个人推荐用6250,能有效减小误码率,保证对GPRS模块返回信息的准确判断
  24.         TH1=0xfb;//装入初值,波特率6250
  25.         TL1=0xfb;        

  26. //  TH1=0xf3;//装入初值,波特率2400
  27. //        TL1=0xf3;
  28. #else         
  29.         TH1=0xfd;//装入初值,波特率9600
  30.         TL1=0xfd;
  31. #endif //
  32.         
  33.         TR1=1;//打开定时器
  34.         SM0=0;//设置串行通讯工作模式
  35.         SM1=1;//(同上)在此模式下,定时器溢出一次就发送一个位的数据
  36.         REN=1;//串行接收允许位(要先设置sm0sm1再开串行允许)
  37.         EA=1;//开总中断
  38.         ES=1;//开串行口中断        
  39. }

  40. /*串行通讯中断,收发完成将进入该中断*/
  41. void Serial_interrupt() interrupt 4
  42. {
  43.         uchar i = 0;

  44.         if(RI == 1)        //收到信息
  45.         {

  46.                 RI=0;//接收中断信号清零,表示将继续接收
  47.                
  48.                 GsmRcv[GsmRcvCnt] = SBUF;
  49.                 GsmRcvCnt++;
  50.                 //收到了完整的AT指令,完整的AT指令是以0x0d 0x0a结尾的。故作此判断,在接收的过程中是否收到0x0d 0x0a
  51.                 if(GsmRcv[GsmRcvCnt-2] == 0x0d && GsmRcv[GsmRcvCnt-1] == 0x0a && GsmRcvCnt >= 4)
  52.                 {
  53.                         //一旦收到0x0d 0x0a,就将数据保存起来。用户主函数的判断。                        
  54.                         for(i=0; i<GsmRcvCnt; i++)
  55.                         {
  56.                                 GsmRcvAt[i] = GsmRcv[i];
  57.                                 GsmRcv[i] = 0;        
  58.                         }
  59.                         GsmRcvCnt = 0;
  60.                         GsmAtFlag = 1;//收到了完整的at指令,通过这个标志位置1,这样主函数就知道去判断了。
  61.                                                                                 
  62.                 }
  63.                 else if(GsmRcvCnt >= 50)//因为内存有限,收到了50个字符还是没有看到0x0a 0x0d的话,就重新开始接收吧。
  64.                 {
  65.                         GsmRcvCnt = 0;
  66.                 }
  67.                
  68.         }
  69. }


  70. void Uart1Send(uchar c)
  71. {
  72.         SBUF=c;
  73.         while(!TI);//等待发送完成信号(TI=1)出现
  74.         TI=0;        
  75. }

  76. //串行口连续发送char型数组,遇到终止号/0将停止
  77. void Uart1Sends(uchar *str)
  78. {
  79.         while(*str!='\0')
  80.         {
  81.                 SBUF=*str;
  82.                 while(!TI);//等待发送完成信号(TI=1)出现
  83.                 TI=0;
  84.                 str++;
  85.         }
  86. }

  87. //延时函数大概是1s钟,不过延时大的话不准...
  88. void DelaySec(int sec)
  89. {
  90.         uint i , j= 0;

  91.         for(i=0; i<sec; i++)
  92.         {
  93.                 for(j=0; j<65535; j++)
  94.                 {        
  95.                 }
  96.         }
  97. }

  98. //判断是否上传成功
  99. void OneNet_RevPro(unsigned char *GsmRcvAt)
  100. {
  101.         if(strstr((char *)GsmRcvAt, "CLOSED"))
  102.         {
  103.   LcdWriteString("TCP CLOSED",strlen("TCP CLOSED"),0x80+0x40,0);               
  104.         }
  105.         else
  106.         {
  107.                 //这里用来检测是否发送成功
  108.                 if(strstr((char *)GsmRcvAt, "succ"))
  109.                 {
  110.                         LcdWriteString("SEND OK",strlen("SEND OK"),0x80+0x40,0);
  111.                 }
  112.                 else
  113.                 {
  114.                   LcdWriteString("SEND FAIL",strlen("SEND FAIL"),0x80+0x40,0);
  115.                 }
  116.         }
  117. }

  118. void main()
  119. {
  120.         uchar i = 0;
  121.         char xdata text[28];
  122.         char xdata buf1[60];
  123.         SerialInti(); //串口初始化
  124.   LcdInit(); //LCD1602初始化
  125.         
  126.         GsmAtFlag = 0;
  127.         while(GsmAtFlag == 0) //确保波特率同步良好
  128.         {
  129.                 Uart1Sends("ATI\r\n");
  130.                 DelaySec(1);//延时1秒
  131.         }
  132.         GsmAtFlag = 0;

  133.         while(1)
  134.         {
  135.                 LcdWriteString("Init Connection",strlen("Init Connection"),0x80,1);
  136.                 Uart1Sends("AT+CIPCLOSE\r\n");
  137.                 DelaySec(1);
  138.                 Uart1Sends("AT+CIPSHUT\r\n");        
  139.                 DelaySec(1);
  140.                 LcdWriteString("Connect Onenet",strlen("Connect Onenet"),0x80,1);
  141.                 Uart1Sends("AT+CLPORT=\"TCP\",\"2000\"\r\n");//发送指令指定本地端口
  142.                 DelaySec(1);
  143.                 Uart1Sends("AT+CIPSTART=\"TCP\",\"183.230.40.33\",\"80\"\r\n");//此处修改你建立服务器的IP,服务器端口号8080
  144.                 DelaySec(2);
  145.                 if(GsmAtFlag == 1 && strstr(GsmRcvAt, "CONNECT OK") )//检测是否收到 CONNECT OK ,如果这连接成功
  146.                 {
  147.                         LcdWriteString("Onenet Is Ready",strlen("Onenet Is Ready"),0x80,1);
  148.       Sensor_Data=DHT11_receive();
  149.                         LcdWriteString("Data Is Ready",strlen("Data Is Ready"),0x80,1);
  150.                         Uart1Sends("AT+CIPSEND\r\n");
  151.                         DelaySec(1);
  152.                         LcdWriteString("Start Upload",strlen("Start Upload"),0x80,1);
  153.                         memset(buf1, 0, sizeof(buf1));
  154.                         LcdWriteString("Schedule:",strlen("Schedule:"),0x80,1);
  155.                         sprintf(buf1,"POST /devices/%s/datapoints?type=3 HTTP/1.1\r\n",DEVID);
  156.                         LcdWriteString("1 of 7",strlen("1 of 7"),0x80+0x40,0);
  157.                         Uart1Sends(buf1);//向服务器发送数据
  158.                         DelaySec(1);
  159.                         memset(buf1, 0, sizeof(buf1));
  160.                         sprintf(buf1,"api-key:%s\r\n",APIKEY);
  161.                         LcdWriteString("2 of 7",strlen("2 of 7"),0x80+0x40,0);
  162.                         Uart1Sends(buf1);
  163.                         DelaySec(1);
  164.                         LcdWriteString("3 of 7",strlen("3 of 7"),0x80+0x40,0);
  165.                         Uart1Sends("Host:api.heclouds.com\r\n");
  166.                         DelaySec(1);
  167.                         memset(text, 0, sizeof(text));
  168.             memset(buf1, 0, sizeof(buf1));
  169.             strcpy(buf1, "{");
  170.             memset(text, 0, sizeof(text));
  171.             sprintf(text, "\"Temperature\":%f,",Sensor_Data.temp_l*0.01+Sensor_Data.temp_h);
  172.             strcat(buf1, text);
  173.       memset(text, 0, sizeof(text));
  174.             sprintf(text, "\"Humidity\":%f",Sensor_Data.humi_l*0.01+Sensor_Data.humi_h);
  175.             strcat(buf1, text);
  176.             strcat(buf1, "}");
  177.                         memset(text, 0, sizeof(text));
  178.                         sprintf(text,"Content-Length:%d\r\n",strlen(buf1));
  179.                         LcdWriteString("4 of 7",strlen("4 of 7"),0x80+0x40,0);
  180.                         Uart1Sends(text);
  181.                         LcdWriteString("5 of 7",strlen("5 of 7"),0x80+0x40,0);
  182.                         Uart1Sends("\r\n");
  183.                         DelaySec(1);
  184.                         LcdWriteString("6 of 7",strlen("6 of 7"),0x80+0x40,0);
  185.                         Uart1Sends(buf1);
  186.                         DelaySec(1);
  187.                         LcdWriteString("7 of 7",strlen("7 of 7"),0x80+0x40,0);
  188.                         Uart1Send(0x1a);//以0x1a结束
  189.                         DelaySec(1);
  190.                         LcdWriteString("Upload Result:",strlen("Upload Result:"),0x80,1);
  191.                         while(GsmAtFlag==0);
  192.             OneNet_RevPro(GsmRcv);
  193.                         DelaySec(6);
  194.                 }                        
  195.         
  196.         }


  197. }
复制代码


全部资料51hei下载地址:
GSM +DHT11.zip (88.47 KB, 下载次数: 194)



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏11 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:97588 发表于 2018-11-18 19:24 | 只看该作者
感谢分享!下了学习学习
回复

使用道具 举报

板凳
ID:138273 发表于 2018-12-14 19:26 | 只看该作者
DEVID
APIKEY
都修改为自己的了为啥总是上传失败???
回复

使用道具 举报

地板
ID:138273 发表于 2018-12-18 13:14 | 只看该作者
我的最后服务器返回Content-Type: application/json
Content-Length: 58
Connection: keep-alive
Serveroyotg/1.1
Pragma: no-cache

{"errno":3,"error":"auth failed: not found device:172639"}
产品ID和APIKEY都没错,郁闷了啊。。。。
回复

使用道具 举报

5#
ID:63317 发表于 2018-12-26 20:12 | 只看该作者
感谢分享!下了学习学习
回复

使用道具 举报

6#
ID:496317 发表于 2019-3-23 20:37 | 只看该作者
你好,谢谢您的分享,我粗略地学习了一下,想问问……您是用的TCP透传接入的OneNET么?
回复

使用道具 举报

7#
ID:249062 发表于 2019-4-27 19:44 | 只看该作者
刚哥哥 发表于 2018-12-14 19:26
DEVID
APIKEY
都修改为自己的了为啥总是上传失败???

是不是IP和端口没改
回复

使用道具 举报

8#
ID:249062 发表于 2019-4-27 20:06 | 只看该作者
楼主能介绍一下onenet这里吗,第一次做物联网这边,不太懂
回复

使用道具 举报

9#
ID:315093 发表于 2020-1-16 13:50 | 只看该作者
感谢分享!下了学习学习
回复

使用道具 举报

10#
ID:279295 发表于 2020-4-12 22:55 | 只看该作者
想问一下,本地端口2000是怎么确定的
回复

使用道具 举报

11#
ID:767423 发表于 2020-6-9 09:03 | 只看该作者
有没有教程分享出来,让大家一起学习学习。
回复

使用道具 举报

12#
ID:604052 发表于 2020-6-11 20:12 | 只看该作者
有protus仿真程序吗?
回复

使用道具 举报

13#
ID:604052 发表于 2020-6-11 20:46 | 只看该作者
能够实现自动上传吗
回复

使用道具 举报

14#
ID:796585 发表于 2020-7-3 16:04 | 只看该作者

能够实现自动上传吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表