STM32L151RCT6 BC20 采集温湿度DHT11 采集GPS定位 和ADC发送到最新版本ONENET物联网开放平台
文档结尾有代码下载链接
🎯 实现效果图片










🎯实物图



注意:GPS天线需放置室外
📌驱动思路
- 首先通过引入 STM32 核心库及各外设驱动头文件,为外设操作提供基础定义,并设计全局变量实现中断与主循环的数据共享,其中 Timer2_Count 作为定时器 2 中断计数变量用于 35 秒定时触发,gpsDatalat/gpsDatalon 缓存 GPS 经纬度数据,adc_value 存储处理后的 ADC 数值,cnt 用于控制数据上传频率,sendMutiData 则拼接待上传至 OneNET 的传感器数据。
- 进入 main 函数后,先完成系统层面的初始化工作,整体遵循 "基础外设→功能外设→业务配置" 的顺序:先配置 NVIC 中断优先级分组 2,避免中断冲突;再初始化延时函数、两路串口(串口 1 用于调试打印,串口 2 用于与 BC26 模块通信);随后初始化 DHT11 温湿度传感器、OLED 显示屏、指示灯等功能外设,同时初始化 ADC+DMA 以非阻塞方式采集模拟量数据,降低 CPU 占用;针对 BC26 模块完成初始化、PDP 上下文激活、GNSS 功能开启及 OneNET 平台注册连接,确保 NB-IoT 通信链路就绪;最后初始化定时器 2(1 秒中断一次)并清空 OLED 屏幕,为后续数据显示做准备。
- 主循环采用条件触发式执行逻辑,而非轮询,仅当 Timer2_Count 累计达到 35 秒时才执行核心操作:先通过 memset 清空各类数据缓冲区,避免脏数据残留;调用 Get_GPS_RMC 函数获取纠偏后的 GPS 经纬度,若未获取到有效数据则使用默认经纬度,保证数据完整性,同时将经纬度按 OneNET 平台格式拼接至 sendMutiData 缓冲区;通过 cnt 变量计数,每累计 2 次 35 秒触发(即 70 秒)调用 BC26_ONENETSendData 函数完成数据上传;随后读取 DMA 采集的 ADC 值并转换为 0-100 的百分比值,调用 DHT11_Read_Data 读取温湿度数据,最后将温度、湿度、ADC 值更新至 OLED 屏对应位置,完成数据显示。
- 定时器 2 中断服务函数是整个定时逻辑的核心,每次中断触发时先检查更新中断标志避免误触发,随后将 Timer2_Count 累加实现 1 秒级计数,最后清除中断标志确保下一次中断正常触发,以此为整个系统提供稳定的 35 秒定时基准,支撑数据采集与上传的时间控制。
📢单片机程序代码
main.c
cpp
#include "stm32l1xx.h" // Device header
#include "delay.h"
#include "usart.h"
#include "string.h"
#include "dht11.h"
#include "sersor.h"
#include "bc26.h"
#include "Timer.h"
#include "oled.h"
#include "adc.h"
uint16_t Timer2_Count =0;
uint8_t BC20_Step = 0;
uint8_t GPSGet_Count = 100;
char *str;int cnt=0;
char gpsDatalat[64];
char gpsDatalon[64];
uint16_t adc_value=0;
int main(void)
{
char *gpsStr; //GPS指向的位置
char sendMutiData[BUFLEN]; //发送数据到服务
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断分组
delay_init();
Usart1_Init(115200);
printf("USART1 init Success \r\n");
Usart2_Init(115200);
DHT11_Init(); OLED_Init();
Led_Init();
BC26_Init();
BC26_PDPACT();
BC20_INITGNSS();
BC26_RegONENETIOT();
TIM2_Init(1000,3200);
OLED_Clear();ADC_DMA_Init();
while(1)
{
OLED_ShowString(0,2,"Temp:");//
OLED_ShowString(0,4,"Humi:");//
OLED_ShowString(0,6," ADC:");//
if(Timer2_Count >= 35)
{
memset(sendMutiData,0,BUFLEN);//发送多传感器数据到服务器
memset(gpsDatalat,0,64);//维度
memset(gpsDatalon,0,64);//经度
strcat(sendMutiData,"latitude=");//传递维度
gpsStr=Get_GPS_RMC(1);//获取维度 这个是经过纠偏的纬度
if(gpsStr) //如果获取到了
{
strcat(sendMutiData,gpsStr);//传递维度
strcat(gpsDatalat,gpsStr);//传递维度
}
else //还没定位好
{
strcat(sendMutiData,"39.897445");//传递维度
strcat(gpsDatalat,"39.897445");//传递维度
}
strcat(sendMutiData,"&longitude="); //传递经度
gpsStr=Get_GPS_RMC(2);//获取维度 这个是经过纠偏的经度
if(gpsStr) //获取到了经度
{
strcat(sendMutiData,gpsStr);//传递经度
strcat(gpsDatalon,gpsStr);//传递经度
}
else //还没定位好
{
strcat(sendMutiData,"116.331398");//传递经度
strcat(gpsDatalon,"116.331398");//传递经度
}
cnt++;
if(cnt>=2)
{
cnt=0;
BC26_ONENETSendData();
}
adc_value=(uint16_t)(((float)ADC_Read[0]/4095)*100);
DHT11_Read_Data(&Sersor.Temp,&Sersor.Humi);
OLED_ShowNum(48,2,Sersor.Temp,4,16);
OLED_ShowNum(48,4,Sersor.Humi,4,16);
OLED_ShowNum(48,6,adc_value,4,16);
}
}
}
void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET){
Timer2_Count++;
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);//清除 TIM7 溢出中断标志
}
}
BC20.c
cpp
#include "BC26.h"
#include "string.h"
///AT+NSOCL=0
#include "string.h"
#include "oled.h"
#include "sersor.h"
char atstr[BUFLEN];
int err; //全局变量
char atbuf[BUFLEN];
char objtnum[BUFLEN];//观察号
char distnum[BUFLEN];//观察号
BC26 BC26_Status;
uint8_t Onenet_Success = 0;
uint8_t ERROR_Count = 0;
////////////////////////只要修改三要素/////////////////////////////////
#define PRODUCEID "U2giKUOn4J"//产品ID
#define DEVICENAME "L151"//设备ID
#define TOKEN "version=2018-10-31&res=products%2FU2giKUOn4J%2Fdevices%2FL151&et=4859849405&method=md5&sign=Sc02wU5pgdizNIruZsVTmQ%3D%3D"//token
///////////////////////////////////////////////////////////////////////
void IWDG_Init(uint8_t Prc,uint16_t Reload);
void IWDG_Init(uint8_t Prc,uint16_t Reload)
{
/*IWDG初始化*/
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //独立看门狗写使能
IWDG_SetPrescaler(Prc); //设置预分频为16
IWDG_SetReload(Reload); //设置重装值为2499,独立看门狗的超时时间为1000ms
IWDG_ReloadCounter(); //重装计数器,喂狗
IWDG_Enable(); //独立看门狗使能
}
void BC26_Clear_Buffer(void)//清空串口2缓存
{
printf("%s",buf_uart2.buf); //清空前打印信息
if(Onenet_Success == 1)
{
if(strstr(buf_uart2.buf,"ERROR"))
{
ERROR_Count++;
if(ERROR_Count >= 10)
{
NVIC_SystemReset();
}
}
}
buf_uart2.rx_flag = 0;
delay_ms(300);
buf_uart2.index=0;
memset(buf_uart2.buf,0,BUFLEN);
IWDG_ReloadCounter(); //重装计数器,喂狗
}
int BC26_Init(void)
{
char *strx,*extstrx;
int errcount = 0;
err = 0; //判断模块卡是否就绪最重要
printf("start init BC26\r\n");
BC26_Clear_Buffer();
Uart2_SendStr("ATi\r\n");
delay_ms(3000);
printf("%s",buf_uart2.buf); //打印收到的串口信息
printf("get back BC26\r\n");
strx=strstr((const char*)buf_uart2.buf,(const char*)"OK");//返回OK
while(strx==NULL)
{
printf("\r\n单片机正在连接到模块...\r\n");
BC26_Clear_Buffer();
Uart2_SendStr("ATi\r\n");
delay_ms(300);
strx=strstr((const char*)buf_uart2.buf,(const char*)"OK");//返回OK
}
OLED_ShowString(0,2,"ATi OK");
Uart2_SendStr("AT+CIMI\r\n");//获取卡号,类似是否存在卡的意思,比较重要。
delay_ms(300);
strx=strstr((const char*)buf_uart2.buf,(const char*)"ERROR");//只要卡不错误 基本就成功
if(strx==NULL)
{
printf("我的卡号是 : %s \r\n",&buf_uart2.buf[8]);
BC26_Clear_Buffer();
delay_ms(300);
}
else
{
err = 1;
printf("卡错误 : %s \r\n",buf_uart2.buf);
BC26_Clear_Buffer();
delay_ms(300);
}
OLED_Clear();OLED_ShowString(0,2,"AT+CIMI OK");
Uart2_SendStr("AT+CGSN=1\r\n");//激活网络,PDP
delay_ms(300);
strx=strstr((const char*)buf_uart2.buf,(const char*)"OK");//返OK
BC26_Clear_Buffer();
if(strx)
{
BC26_Clear_Buffer();
printf("GET IMEI OK\r\n");
delay_ms(300);
}
Uart2_SendStr("AT+CGATT?\r\n");//查询激活状态
delay_ms(300);
strx=strstr((const char*)buf_uart2.buf,(const char*)"+CGATT: 1");//返1 表明激活成功 获取到IP地址了
BC26_Clear_Buffer();
errcount = 0;
while(strx==NULL)
{
errcount++;
BC26_Clear_Buffer();
Uart2_SendStr("AT+CGATT?\r\n");//获取激活状态
delay_ms(300);
strx=strstr((const char*)buf_uart2.buf,(const char*)"+CGATT: 1");//返回1,表明注网成功
if(errcount>100) //防止死循环
{
err=1;
errcount = 0;
NVIC_SystemReset();
break;
}
}
OLED_Clear();OLED_ShowString(0,2,"+CGATT: 1");
Uart2_SendStr("AT+QBAND?\r\n"); //允许错误值
delay_ms(300);
strx=strstr((const char*)buf_uart2.buf,(const char*)"OK");//返回OK
if(strx)
{
printf("========BAND========= \r\n %s \r\n",buf_uart2.buf);
BC26_Clear_Buffer();
delay_ms(300);
}
Uart2_SendStr("AT+CSQ\r\n");//查看获取CSQ值
delay_ms(300);
strx=strstr((const char*)buf_uart2.buf,(const char*)"+CSQ");//返回CSQ
if(strx)
{
printf("信号质量:%s\r\n",buf_uart2.buf);
BC26_Clear_Buffer();
delay_ms(300);
}
Uart2_SendStr("AT+CEREG?\r\n");
delay_ms(300);
strx=strstr((const char*)buf_uart2.buf,(const char*)"+CEREG: 0,1");//返回注册状态
extstrx=strstr((const char*)buf_uart2.buf,(const char*)"+CEREG: 1,1");//返回注册状态
BC26_Clear_Buffer();
errcount = 0;
while(strx==NULL&&extstrx==NULL)//两个返回值都没有
{
errcount++;
BC26_Clear_Buffer();
Uart2_SendStr("AT+CEREG?\r\n");//判断运营商
delay_ms(300);
strx=strstr((const char*)buf_uart2.buf,(const char*)"+CEREG: 0,1");//返回注册状态
extstrx=strstr((const char*)buf_uart2.buf,(const char*)"+CEREG: 1,1");//返回注册状态
if(errcount>100) //防止死循环
{
err=1;
errcount = 0;
break;
}
}
OLED_Clear();OLED_ShowString(0,2,"+CEREG: 0,1");
return err;
}
void BC26_PDPACT(void)//激活场景,为连接服务器做准备
{
int errcount = 0;
char *strx;
Uart2_SendStr("AT+CGPADDR=1\r\n");//激活场景
delay_ms(300);
BC26_Clear_Buffer();
Uart2_SendStr("AT+CGSN=1\r\n");//激活场景
delay_ms(300);
BC26_Clear_Buffer();
Uart2_SendStr("AT+CGATT?\r\n");//激活场景
delay_ms(300);
strx=strstr((const char*)buf_uart2.buf,(const char*)"+CGATT: 1");//注册上网络信息
BC26_Clear_Buffer();
while(strx==NULL)
{
errcount++;
BC26_Clear_Buffer();
Uart2_SendStr("AT+CGATT?\r\n");//激活场景
delay_ms(300);
strx=strstr((const char*)buf_uart2.buf,(const char*)"+CGATT: 1");//一定要终端入网
if(errcount>100) //防止死循环
{
errcount = 0;
break;
}
}
BC26_Clear_Buffer();
}
void BC20_INITGNSS(void)//启动GPS
{
int errcount = 0;
char *strx;
Uart2_SendStr("AT+QGNSSC=1\r\n");//激活GPS 要等待很久启动GNSS
delay_ms(1000);delay_ms(1000);delay_ms(1000);
BC26_Clear_Buffer();
Uart2_SendStr("AT+QGNSSC?\r\n");//查询GPS激活情况
delay_ms(300);
strx=strstr((const char*)buf_uart2.buf,(const char*)"+QGNSSC: 1");//启动成功
BC26_Clear_Buffer();
while(strx==NULL)
{
errcount++;
BC26_Clear_Buffer();
Uart2_SendStr("AT+QGNSSC?\r\n");//查询
delay_ms(1000);
strx=strstr((const char*)buf_uart2.buf,(const char*)"+QGNSSC: 1");//启动成功
if(errcount>100) //防止死循环
{
errcount = 0;
break;
}
}
BC26_Clear_Buffer();
Uart2_SendStr("AT+QGNSSRD=\"NMEA/RMC\"\r\n");
delay_ms(300);
BC26_Clear_Buffer();
}
char GPRMCSTR[128]; //转载GPS信息 GPRMC 经纬度存储的字符串
char latStrAF[64]; //存放数据经纬度用来发送
char lonStrAF[64]; //存放数据经纬度用来显示
typedef struct
{
char UtcDate[6];
char longitude[11];//经度原数据
char Latitude[10];//纬度源数据
char longitudess[4];//整数部分
char Latitudess[3];
char longitudedd[8];//小数点部分
char Latitudedd[8];
char Truelongitude[12];//转换过数据
char TrueLatitude[11];//转换过数据
char getstautus;//获取到定位的标志状态
float gpsdata[2];
}LongLatidata;
LongLatidata latdata;
char *Get_GPS_RMC(char type)
{
uint8_t WaitCount = 0;
char *strx;
BC26_Clear_Buffer();
memset(GPRMCSTR,0,128);
Uart2_SendStr("AT+QGNSSRD=\"NMEA/RMC\"\r\n");//查询激活状态
delay_ms(300);
strx=strstr((const char*)buf_uart2.buf,(const char*)"$GNRMC");//返1
//printf("buf_uart2.buf=%s",buf_uart2.buf);
while(strx==NULL)
{
//printf("buf_uart2.buf=%s",buf_uart2.buf);
BC26_Clear_Buffer();
Uart2_SendStr("AT+QGNSSRD=\"NMEA/RMC\"\r\n");//获取激活状态
delay_ms(300);
strx=strstr((const char*)buf_uart2.buf,(const char*)"$GNRMC");//返回1,表明注网成功
WaitCount++;
if(WaitCount >= 10)
{
break;
}
}
sprintf(GPRMCSTR,"%s",strx);
//BC26_Clear_Buffer(); //打印收到的GPS信息
GPRMCSTR[2]= 'P';
printf("============GETGPRMC==============\r\n%s====",GPRMCSTR); //打印GPRMC
printf("%s",GPRMCSTR);
if(GPRMCSTR[17]=='A')
{
memset(latStrAF,0,64);
memset(lonStrAF,0,64);
Get_GPSdata();
if(type==1)
return latStrAF;
if(type==2)
return lonStrAF;
}
return 0;
}
/*****************************************************
下面是矫正火星坐标的
AT+QGNSSRD="NMEA/RMC"
+QGNSSRD: $GNRMC,091900.00,A,2603.9680,N,11912.4174,E,0.189,,201022,,,A,V*1A
OK
*****************************************************/
//解GPS析函数
// $GNRMC,091900.00,A,2603.9680,N,11912.4174,E,0.189,,201022,,,A,V*1A
int Get_GPSdata(void )
{
int i=0;
char *strx;
strx=strstr((const char*)GPRMCSTR,(const char*)"A,");//获取纬度的位置
if(strx)
{
for(i=0;i<9;i++)
{
latdata.Latitude[i]=strx[i+2];//获取纬度值2603.9576
}
strx=strstr((const char*)GPRMCSTR,(const char*)"N,");//获取经度值
if(strx)
{
for(i=0;i<10;i++) //获取经度 11912.4098
{
latdata.longitude[i]=strx[i+2];
}
}
printf("latdata.Latitude ,%s \r\n",latdata.Latitude);
printf("latdata.longitude ,%s \r\n",latdata.longitude);
latdata.getstautus=1;//
}
else
{
latdata.getstautus=0;
}
Getdata_Change(latdata.getstautus);//数据换算
BC26_Clear_Buffer();
return 0;
}
/*************解析出经纬度数据,然后直接提交数据*******************/
void Getdata_Change(char status)
{
unsigned char i;
if (status)
{
float GPS_Latitude = 0.0;
float GPS_Longitude = 0.0;
for (i = 0; i < 3; i++)
latdata.longitudess[i] = latdata.longitude[i];
for (i = 3; i < 10; i++)
latdata.longitudedd[i - 3] = latdata.longitude[i];
GPS_Longitude = (latdata.longitudess[0] - 0x30) * 100 + (latdata.longitudess[1] - 0x30) * 10 + (latdata.longitudess[2] - 0x30) + ((latdata.longitudedd[0] - 0x30) * 10 + (latdata.longitudedd[1] - 0x30) + (float)(latdata.longitudedd[3] - 0x30) / 10 + (float)(latdata.longitudedd[4] - 0x30) / 100 + (float)(latdata.longitudedd[5] - 0x30) / 1000 + (float)(latdata.longitudedd[6] - 0x30) / 10000) / 60.0; // 获取完整的数据
///////////////////////////////////////////
for (i = 0; i < 2; i++)
latdata.Latitudess[i] = latdata.Latitude[i];
for (i = 2; i < 9; i++)
latdata.Latitudedd[i - 2] = latdata.Latitude[i];
GPS_Latitude = (float)(latdata.Latitudess[0] - 0x30) * 10 + (latdata.Latitudess[1] - 0x30) + ((latdata.Latitudedd[0] - 0x30) * 10 + (latdata.Latitudedd[1] - 0x30) + (float)(latdata.Latitudedd[3] - 0x30) / 10 + (float)(latdata.Latitudedd[4] - 0x30) / 100 + (float)(latdata.Latitudedd[5] - 0x30) / 1000 + (float)(latdata.Latitudedd[6] - 0x30) / 10000) / 60.0; // 获取完整的数据b
memset(lonStrAF, 0, 64);
memset(latStrAF, 0, 64);
sprintf(latStrAF, "%f", GPS_Latitude);
sprintf(lonStrAF, "%f", GPS_Longitude);
printf("latStrAF,%s \r\n", latStrAF);
printf("lonStrAF,%s \r\n", lonStrAF);
}
else
{
latdata.gpsdata[0] = 0;
latdata.gpsdata[1] = 0;
}
}
//#define SUBSCRIBE "/a1NqBFdnqec/NBLX/user/get" //订阅入口
//#define ISSUE "/sys/a1NqBFdnqec/NBLX/thing/event/property/post"
void BC26_RegONENETIOT(void)//平台注册
{
uint8_t BC20_IMEI[20],i;//IMEI值
char *strx;
int errcount = 0;
Uart2_SendStr("AT+QMTDISC=0\r\n");//Disconnect a client from MQTT server
delay_ms(300);
BC26_Clear_Buffer();
Uart2_SendStr("AT+QMTCLOSE=0\r\n");//删除句柄
delay_ms(300);
BC26_Clear_Buffer();
memset(atstr,0,BUFLEN);
sprintf(atstr,"AT+QMTCFG=\"version\",0,4\r\n");
printf("atstr = %s \r\n",atstr);
Uart2_SendStr(atstr);//发送ONENET配置参数
delay_ms(300); //等待300ms反馈OK
strx=strstr((const char*)buf_uart2.buf,(const char*)"OK");//返OK
while(strx==NULL)
{
strx=strstr((const char*)buf_uart2.buf,(const char*)"OK");//返OK
}
BC26_Clear_Buffer();
Uart2_SendStr("AT+CGSN=1\r\n");//获取模块的IMEI号
delay_ms(300);
strx=strstr((const char*)buf_uart2.buf,(const char*)"+CGSN:");//返+CGSN:
while(strx==NULL)
{
strx=strstr((const char*)buf_uart2.buf,(const char*)"+CGSN:");//返+CGSN:
}
for(i=0;i<15;i++)
BC20_IMEI[i]=strx[i+7];
BC20_IMEI[15]=0;
BC26_Clear_Buffer();
printf("我的模块IMEI是:%s\r\n\r\n\r\n",BC20_IMEI);
delay_ms(1000);
Uart2_SendStr("AT+QMTOPEN=0,\"mqtts.heclouds.com\",1883\r\n");//登录ONENET平台
delay_ms(300);
strx=strstr((const char*)buf_uart2.buf,(const char*)"+QMTOPEN: 0,0");//返+QMTOPEN: 0,0
while(strx==NULL)
{
errcount++;
delay_ms(2000);
// Uart2_SendStr("AT+QMTOPEN=0,\"mqtts.heclouds.com\",1883\r\n");//登录ONENET平台
strx=strstr((const char*)buf_uart2.buf,(const char*)"+QMTOPEN: 0,0");//返回OK
printf("%s",buf_uart2.buf);
if(errcount>15) //防止死循环
{
GPIO_SetBits(GPIOC,GPIO_Pin_3); //模块重启
delay_ms(500);
GPIO_ResetBits(GPIOC,GPIO_Pin_3);
delay_ms(300);
NVIC_SystemReset(); //没有创建TCP SOCKET就重启系统等到服务器就绪
}
}
OLED_Clear();OLED_ShowString(0,2,"AT+QMTOPEN OK");
BC26_Clear_Buffer();
memset(atstr,0,BUFLEN);
sprintf(atstr,"AT+QMTCONN=0,\"%s\",\"%s\",\"%s\"\r\n",DEVICENAME,PRODUCEID,TOKEN);
// printf("atstr = %s \r\n",atstr);
Uart2_SendStr(atstr);//发送链接到ONENET
delay_ms(300);
strx=strstr((const char*)buf_uart2.buf,(const char*)"+QMTCONN: 0,0,0");//返+QMTCONN: 0,0,0
while(strx==NULL)
{
printf("%s",buf_uart2.buf);
delay_ms(1000);
strx=strstr((const char*)buf_uart2.buf,(const char*)"+QMTCONN: 0,0,0");//返+QMTCONN: 0,0,0
}
BC26_Clear_Buffer();
OLED_Clear();OLED_ShowString(0,2,"AT+QMTCONN OK");
memset(atstr,0,BUFLEN);
sprintf(atstr,"AT+QMTSUB=0,1,\"$sys/%s/%s/thing/property/set\",2\r\n",PRODUCEID,DEVICENAME);
printf("atstr = %s \r\n",atstr);
Uart2_SendStr(atstr);//发送链接到ONENET
delay_ms(300);
strx=strstr((const char*)buf_uart2.buf,(const char*)"+QMTSUB: 0,1,0,0");//返OK
while(strx==NULL)
{
delay_ms(2000);
strx=strstr((const char*)buf_uart2.buf,(const char*)"+QMTSUB: 0,1,0,0");//返OK
}
BC26_Clear_Buffer();
Onenet_Success = 1;
OLED_Clear();OLED_ShowString(0,2,"AT+QMTSUB OK");
}
//新整理发送格式
//\"map\":{\"value\":{\"lon\":\"%s\",\"lat\":\"%s\"}}
extern char gpsDatalat[64];
extern char gpsDatalon[64];
extern uint16_t adc_value;
void BC26_ONENETSendData(void)
{
static char SendArray[512];
static char Text[128];
memset(SendArray,0,512);
memset(Text,0,sizeof(Text));
sprintf(Text,"AT+QMTPUB=0,0,0,0,\"$sys/%s/%s/thing/property/post\",{\"id\":\"123\",\"version\":\"1.0\",\"params\":{", PRODUCEID,DEVICENAME);
strcat(SendArray,Text);
memset(Text,0,sizeof(Text));
sprintf(Text,"\"temp\":{\"value\":%d},",Sersor.Temp);
strcat(SendArray,Text);
memset(Text,0,sizeof(Text));
sprintf(Text ,"\"humi\":{\"value\":%d},",Sersor.Humi);
strcat(SendArray,Text);
memset(Text,0,sizeof(Text));
sprintf(Text ,"\"ADC\":{\"value\":%d},",adc_value);
strcat(SendArray,Text);
memset(Text,0,sizeof(Text));
sprintf(Text ,"\"map\":{\"value\":{\"lon\":\"%s\",\"lat\":\"%s\"}}",gpsDatalon,gpsDatalat);
strcat(SendArray,Text);
sprintf(Text,"}}\"\r\n");
strcat(SendArray,Text);
Uart2_SendStr(SendArray);
printf("%s",SendArray);
//Clear_Buffer();
}