久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 9889|回復: 13
收起左側

OneNet平臺傳感器監測設計 51單片機+GPRS+DHT11 附源碼

  [復制鏈接]
ID:229491 發表于 2018-11-9 00:50 | 顯示全部樓層 |閱讀模式
基于OneNet平臺的傳感器監測使用說明(以dht11為例)

1. 將電話卡(SIM900A使用的是標準SIM卡,SIM800C使用的是micro-SIM卡,這里的“卡”指的是聯通、移動卡,電信卡不支持)插入GPRS模塊后,上點啟動,會出現以下畫面,提示正在初始化連接,確保已退出其它連接
圖片1.png
2.連接OneNet平臺,會出現以下畫面,表明正在連接Onenet平臺
    圖片2.png
3.如果Onenet連接成功,LCD1602顯示屏上會顯示“Onenet Is Ready”,但是正常情況下“Onenet Is Ready”字樣會一閃而過,被后面的“Data Is Ready”很快覆蓋,所以如果長期卡在”Onenet Is Ready”表明傳感器的數據讀取出現了問題,請檢查傳感器是否完好。因此正常情況下,我們會看到以下畫面
圖片3.png
4.緊接著我們會看到上傳的進度條顯示,像這樣(我共分為7步來標識上傳進度,具體每步所做工作參照代碼)

圖片4.png
圖片5.png
圖片6.png
出現“7 of 7”表明我們的數據上傳工作完成,我們將進入下一步
5.判斷數據上傳是否成功,如果數據上傳成功,會出現“SEND OK”,如果上傳失敗,會出現“SEND FAIL”。當然,上傳結果的判斷不能保證完全準確,但是經過測試在大多數情況下是準確的,因為跟網絡情況有關,有時不能成功檢測到成功的標志。(就像原本有檢測是否連上網絡功能的,但是檢測太耗時,故后面刪除了相關代碼)
6.最后,LCD1602會顯示本次上傳的傳感器數據值,像下圖
圖片7.png
以上就是基于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. }
復制代碼

0.png
全部資料51hei下載地址:
GSM +DHT11.zip (88.47 KB, 下載次數: 200)



回復

使用道具 舉報

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都沒錯,郁悶了啊。。。。
回復

使用道具 舉報

ID:63317 發表于 2018-12-26 20:12 | 顯示全部樓層
感謝分享!下了學習學習
回復

使用道具 舉報

ID:496317 發表于 2019-3-23 20:37 | 顯示全部樓層
你好,謝謝您的分享,我粗略地學習了一下,想問問……您是用的TCP透傳接入的OneNET么?
回復

使用道具 舉報

ID:249062 發表于 2019-4-27 19:44 | 顯示全部樓層
剛哥哥 發表于 2018-12-14 19:26
DEVID
APIKEY
都修改為自己的了為啥總是上傳失敗???

是不是IP和端口沒改
回復

使用道具 舉報

ID:249062 發表于 2019-4-27 20:06 | 顯示全部樓層
樓主能介紹一下onenet這里嗎,第一次做物聯網這邊,不太懂
回復

使用道具 舉報

ID:315093 發表于 2020-1-16 13:50 | 顯示全部樓層
感謝分享!下了學習學習
回復

使用道具 舉報

ID:279295 發表于 2020-4-12 22:55 | 顯示全部樓層
想問一下,本地端口2000是怎么確定的
回復

使用道具 舉報

ID:767423 發表于 2020-6-9 09:03 | 顯示全部樓層
有沒有教程分享出來,讓大家一起學習學習。
回復

使用道具 舉報

ID:604052 發表于 2020-6-11 20:12 | 顯示全部樓層
有protus仿真程序嗎?
回復

使用道具 舉報

ID:604052 發表于 2020-6-11 20:46 | 顯示全部樓層
能夠實現自動上傳嗎
回復

使用道具 舉報

ID:796585 發表于 2020-7-3 16:04 | 顯示全部樓層

能夠實現自動上傳嗎
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本 欧美 国产 | 精品视频在线观看 | 成人福利在线视频 | 国产精品久久久久久久久久久久久 | 99精品99| 欧美精品一区在线发布 | 精品色 | 精品久久伊人 | 黄色三级免费网站 | 久久精品一区二区 | 99re国产精品 | 日韩高清中文字幕 | 精品美女久久久 | 欧美高清一区 | 国产高清在线观看 | 久久精品亚洲欧美日韩精品中文字幕 | 欧美日韩在线免费观看 | 男女一区二区三区 | 网站黄色在线 | 国产一二区免费视频 | 久久久高清 | 精品国产乱码久久久久久丨区2区 | 色黄爽| 日韩精品一区二区三区中文在线 | 一级aaaaaa毛片免费同男同女 | 国产精品明星裸体写真集 | 亚洲高清一区二区三区 | 四虎影院一区二区 | 亚洲福利av | 在线播放亚洲 | 国内精品一区二区三区 | 亚洲成人第一页 | 精品国产99 | 伊人免费在线观看 | 久久久久国产精品午夜一区 | 国产精品久久午夜夜伦鲁鲁 | 三级免费毛片 | 国产 日韩 欧美 在线 | 日日夜夜狠狠操 | 亚洲精品中文字幕 | h片在线观看网站 |