標題: OneNet平臺傳感器監(jiān)測設計 51單片機+GPRS+DHT11 附源碼 [打印本頁]
作者: hjz1217283866 時間: 2018-11-9 00:50
標題: OneNet平臺傳感器監(jiān)測設計 51單片機+GPRS+DHT11 附源碼
基于OneNet平臺的傳感器監(jiān)測使用說明(以dht11為例)
1. 將電話卡(SIM900A使用的是標準SIM卡,SIM800C使用的是micro-SIM卡,這里的“卡”指的是聯(lián)通、移動卡,電信卡不支持)插入GPRS模塊后,上點啟動,會出現(xiàn)以下畫面,提示正在初始化連接,確保已退出其它連接
圖片1.png (128.78 KB, 下載次數(shù): 135)
下載附件
2018-11-9 00:45 上傳
2.連接OneNet平臺,會出現(xiàn)以下畫面,表明正在連接Onenet平臺
圖片2.png (970.75 KB, 下載次數(shù): 114)
下載附件
2018-11-9 00:46 上傳
3.如果Onenet連接成功,LCD1602顯示屏上會顯示“Onenet Is Ready”,但是正常情況下“Onenet Is Ready”字樣會一閃而過,被后面的“Data Is Ready”很快覆蓋,所以如果長期卡在”O(jiān)nenet Is Ready”表明傳感器的數(shù)據(jù)讀取出現(xiàn)了問題,請檢查傳感器是否完好。因此正常情況下,我們會看到以下畫面
圖片3.png (847.3 KB, 下載次數(shù): 114)
下載附件
2018-11-9 00:46 上傳
4.緊接著我們會看到上傳的進度條顯示,像這樣(我共分為7步來標識上傳進度,具體每步所做工作參照代碼)
圖片4.png (626.65 KB, 下載次數(shù): 108)
下載附件
2018-11-9 00:46 上傳
圖片5.png (593.79 KB, 下載次數(shù): 110)
下載附件
2018-11-9 00:46 上傳
圖片6.png (747.15 KB, 下載次數(shù): 118)
下載附件
2018-11-9 00:46 上傳
出現(xiàn)“7 of 7”表明我們的數(shù)據(jù)上傳工作完成,我們將進入下一步
5.判斷數(shù)據(jù)上傳是否成功,如果數(shù)據(jù)上傳成功,會出現(xiàn)“SEND OK”,如果上傳失敗,會出現(xiàn)“SEND FAIL”。當然,上傳結(jié)果的判斷不能保證完全準確,但是經(jīng)過測試在大多數(shù)情況下是準確的,因為跟網(wǎng)絡情況有關(guān),有時不能成功檢測到成功的標志。(就像原本有檢測是否連上網(wǎng)絡功能的,但是檢測太耗時,故后面刪除了相關(guān)代碼)
6.最后,LCD1602會顯示本次上傳的傳感器數(shù)據(jù)值,像下圖
圖片7.png (773.79 KB, 下載次數(shù): 112)
下載附件
2018-11-9 00:46 上傳
以上就是基于OneNet平臺的傳感器監(jiān)測使用說明,以DHT11溫濕度傳感器為例,其它的操作方法類似
代碼:
- //C庫
- #include <reg52.h>
- #include <stdio.h>
- #include <string.h>
- //硬件驅(qū)動
- #include "lcd.h" //lcd1602
- #include "dht11.h" //dht11溫濕度傳感器
- //#define FOSC_110592M //看你使用的晶振是什么,選擇啟用的宏定義
- #define FOSC_12M
- #define DEVID "25336321"
- #define APIKEY "v5lJaPvQHj=qjBUSYmGOVnA5TX8="
- //以下用于保存單片機收到模塊發(fā)來的AT指令,通過這些指令單片機可以判斷模塊的狀態(tài)
- uchar GsmRcv[50] = {0};
- uchar GsmRcvAt[50] = {0};
- uchar GsmRcvCnt = 0;
- uchar GsmAtFlag = 0;
- Sensor_Structure Sensor_Data;
- void SerialInti()//串口初始化程序
- {
- TMOD=0x20;//定時器1操作模式2:8位自動重載定時器
- #ifdef FOSC_12M //在這里根據(jù)晶振大小設置不同的數(shù)值初始化串口,
- //如果用的12M晶振的話裝下面兩種值都可以,但
- //個人推薦用6250,能有效減小誤碼率,保證對GPRS模塊返回信息的準確判斷
- TH1=0xfb;//裝入初值,波特率6250
- TL1=0xfb;
- // TH1=0xf3;//裝入初值,波特率2400
- // TL1=0xf3;
- #else
- TH1=0xfd;//裝入初值,波特率9600
- TL1=0xfd;
- #endif //
-
- TR1=1;//打開定時器
- SM0=0;//設置串行通訊工作模式
- SM1=1;//(同上)在此模式下,定時器溢出一次就發(fā)送一個位的數(shù)據(jù)
- REN=1;//串行接收允許位(要先設置sm0sm1再開串行允許)
- EA=1;//開總中斷
- ES=1;//開串行口中斷
- }
- /*串行通訊中斷,收發(fā)完成將進入該中斷*/
- void Serial_interrupt() interrupt 4
- {
- uchar i = 0;
- if(RI == 1) //收到信息
- {
- RI=0;//接收中斷信號清零,表示將繼續(xù)接收
-
- GsmRcv[GsmRcvCnt] = SBUF;
- GsmRcvCnt++;
- //收到了完整的AT指令,完整的AT指令是以0x0d 0x0a結(jié)尾的。故作此判斷,在接收的過程中是否收到0x0d 0x0a
- if(GsmRcv[GsmRcvCnt-2] == 0x0d && GsmRcv[GsmRcvCnt-1] == 0x0a && GsmRcvCnt >= 4)
- {
- //一旦收到0x0d 0x0a,就將數(shù)據(jù)保存起來。用戶主函數(shù)的判斷。
- for(i=0; i<GsmRcvCnt; i++)
- {
- GsmRcvAt[i] = GsmRcv[i];
- GsmRcv[i] = 0;
- }
- GsmRcvCnt = 0;
- GsmAtFlag = 1;//收到了完整的at指令,通過這個標志位置1,這樣主函數(shù)就知道去判斷了。
-
- }
- else if(GsmRcvCnt >= 50)//因為內(nèi)存有限,收到了50個字符還是沒有看到0x0a 0x0d的話,就重新開始接收吧。
- {
- GsmRcvCnt = 0;
- }
-
- }
- }
- void Uart1Send(uchar c)
- {
- SBUF=c;
- while(!TI);//等待發(fā)送完成信號(TI=1)出現(xiàn)
- TI=0;
- }
- //串行口連續(xù)發(fā)送char型數(shù)組,遇到終止號/0將停止
- void Uart1Sends(uchar *str)
- {
- while(*str!='\0')
- {
- SBUF=*str;
- while(!TI);//等待發(fā)送完成信號(TI=1)出現(xiàn)
- TI=0;
- str++;
- }
- }
- //延時函數(shù)大概是1s鐘,不過延時大的話不準...
- void DelaySec(int sec)
- {
- uint i , j= 0;
- for(i=0; i<sec; i++)
- {
- for(j=0; j<65535; j++)
- {
- }
- }
- }
- //判斷是否上傳成功
- void OneNet_RevPro(unsigned char *GsmRcvAt)
- {
- if(strstr((char *)GsmRcvAt, "CLOSED"))
- {
- LcdWriteString("TCP CLOSED",strlen("TCP CLOSED"),0x80+0x40,0);
- }
- else
- {
- //這里用來檢測是否發(fā)送成功
- if(strstr((char *)GsmRcvAt, "succ"))
- {
- LcdWriteString("SEND OK",strlen("SEND OK"),0x80+0x40,0);
- }
- else
- {
- LcdWriteString("SEND FAIL",strlen("SEND FAIL"),0x80+0x40,0);
- }
- }
- }
- void main()
- {
- uchar i = 0;
- char xdata text[28];
- char xdata buf1[60];
- SerialInti(); //串口初始化
- LcdInit(); //LCD1602初始化
-
- GsmAtFlag = 0;
- while(GsmAtFlag == 0) //確保波特率同步良好
- {
- Uart1Sends("ATI\r\n");
- DelaySec(1);//延時1秒
- }
- GsmAtFlag = 0;
- while(1)
- {
- LcdWriteString("Init Connection",strlen("Init Connection"),0x80,1);
- Uart1Sends("AT+CIPCLOSE\r\n");
- DelaySec(1);
- Uart1Sends("AT+CIPSHUT\r\n");
- DelaySec(1);
- LcdWriteString("Connect Onenet",strlen("Connect Onenet"),0x80,1);
- Uart1Sends("AT+CLPORT=\"TCP\",\"2000\"\r\n");//發(fā)送指令指定本地端口
- DelaySec(1);
- Uart1Sends("AT+CIPSTART=\"TCP\",\"183.230.40.33\",\"80\"\r\n");//此處修改你建立服務器的IP,服務器端口號8080
- DelaySec(2);
- if(GsmAtFlag == 1 && strstr(GsmRcvAt, "CONNECT OK") )//檢測是否收到 CONNECT OK ,如果這連接成功
- {
- LcdWriteString("Onenet Is Ready",strlen("Onenet Is Ready"),0x80,1);
- Sensor_Data=DHT11_receive();
- LcdWriteString("Data Is Ready",strlen("Data Is Ready"),0x80,1);
- Uart1Sends("AT+CIPSEND\r\n");
- DelaySec(1);
- LcdWriteString("Start Upload",strlen("Start Upload"),0x80,1);
- memset(buf1, 0, sizeof(buf1));
- LcdWriteString("Schedule:",strlen("Schedule:"),0x80,1);
- sprintf(buf1,"POST /devices/%s/datapoints?type=3 HTTP/1.1\r\n",DEVID);
- LcdWriteString("1 of 7",strlen("1 of 7"),0x80+0x40,0);
- Uart1Sends(buf1);//向服務器發(fā)送數(shù)據(jù)
- DelaySec(1);
- memset(buf1, 0, sizeof(buf1));
- sprintf(buf1,"api-key:%s\r\n",APIKEY);
- LcdWriteString("2 of 7",strlen("2 of 7"),0x80+0x40,0);
- Uart1Sends(buf1);
- DelaySec(1);
- LcdWriteString("3 of 7",strlen("3 of 7"),0x80+0x40,0);
- Uart1Sends("Host:api.heclouds.com\r\n");
- DelaySec(1);
- memset(text, 0, sizeof(text));
- memset(buf1, 0, sizeof(buf1));
- strcpy(buf1, "{");
- memset(text, 0, sizeof(text));
- sprintf(text, "\"Temperature\":%f,",Sensor_Data.temp_l*0.01+Sensor_Data.temp_h);
- strcat(buf1, text);
- memset(text, 0, sizeof(text));
- sprintf(text, "\"Humidity\":%f",Sensor_Data.humi_l*0.01+Sensor_Data.humi_h);
- strcat(buf1, text);
- strcat(buf1, "}");
- memset(text, 0, sizeof(text));
- sprintf(text,"Content-Length:%d\r\n",strlen(buf1));
- LcdWriteString("4 of 7",strlen("4 of 7"),0x80+0x40,0);
- Uart1Sends(text);
- LcdWriteString("5 of 7",strlen("5 of 7"),0x80+0x40,0);
- Uart1Sends("\r\n");
- DelaySec(1);
- LcdWriteString("6 of 7",strlen("6 of 7"),0x80+0x40,0);
- Uart1Sends(buf1);
- DelaySec(1);
- LcdWriteString("7 of 7",strlen("7 of 7"),0x80+0x40,0);
- Uart1Send(0x1a);//以0x1a結(jié)束
- DelaySec(1);
- LcdWriteString("Upload Result:",strlen("Upload Result:"),0x80,1);
- while(GsmAtFlag==0);
- OneNet_RevPro(GsmRcv);
- DelaySec(6);
- }
-
- }
- }
復制代碼
0.png (45.57 KB, 下載次數(shù): 114)
下載附件
2018-11-9 01:07 上傳
全部資料51hei下載地址:
GSM +DHT11.zip
(88.47 KB, 下載次數(shù): 200)
2018-11-9 00:49 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者: taozl 時間: 2018-11-18 19:24
感謝分享!下了學習學習
作者: 剛哥哥 時間: 2018-12-14 19:26
DEVID
APIKEY
都修改為自己的了為啥總是上傳失???
作者: 剛哥哥 時間: 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"}
產(chǎn)品ID和APIKEY都沒錯,郁悶了啊。。。。
作者: WFX777888 時間: 2018-12-26 20:12
感謝分享!下了學習學習
作者: HANANE 時間: 2019-3-23 20:37
你好,謝謝您的分享,我粗略地學習了一下,想問問……您是用的TCP透傳接入的OneNET么?
作者: diexue74110 時間: 2019-4-27 19:44
是不是IP和端口沒改
作者: diexue74110 時間: 2019-4-27 20:06
樓主能介紹一下onenet這里嗎,第一次做物聯(lián)網(wǎng)這邊,不太懂
作者: dyhrdy 時間: 2020-1-16 13:50
感謝分享!下了學習學習
作者: 臉盲啊 時間: 2020-4-12 22:55
想問一下,本地端口2000是怎么確定的
作者: hsl32 時間: 2020-6-9 09:03
有沒有教程分享出來,讓大家一起學習學習。
作者: maikenjifuyi 時間: 2020-6-11 20:12
有protus仿真程序嗎?
作者: maikenjifuyi 時間: 2020-6-11 20:46
能夠?qū)崿F(xiàn)自動上傳嗎
作者: wyzxzx 時間: 2020-7-3 16:04
能夠?qū)崿F(xiàn)自動上傳嗎
歡迎光臨 (http://www.torrancerestoration.com/bbs/) |
Powered by Discuz! X3.1 |