STM32L151RCT6 BC20 采集温湿度DHT11 采集GPS定位 和ADC发送到最新版本ONENET物联网开放平台

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();
}

📦代码下载链接

https://download.csdn.net/download/qq_41954594/92555490
相关推荐
__万波__2 小时前
STM32建立完全空白的工程
stm32·单片机·嵌入式硬件
MINGNUO明诺2 小时前
科技赋能洁净生活 北京龙威物业引入智能清洁设备升级服务品质
物联网
松涛和鸣2 小时前
51、51单片机
c语言·网络·单片机·嵌入式硬件·tcp/ip·51单片机
麒qiqi3 小时前
51 单片机入门详解:从基础概念到实战开发
单片机·嵌入式硬件
兆龙电子单片机设计3 小时前
【STM32项目开源】STM32单片机充电桩安全监测系统
stm32·单片机·物联网·开源·毕业设计
@good_good_study3 小时前
STM32 C语言函数
stm32
周周记笔记12 小时前
ESP32 初识:WiFi MCU 新时代与国产芯片生态(一)
单片机·嵌入式硬件
驴友花雕13 小时前
【花雕学编程】Arduino BLDC 之群体机器人协同探索
c++·单片机·嵌入式硬件·arduino bldc·群体机器人协同探索
驴友花雕13 小时前
【花雕学编程】Arduino BLDC 之仿人机器人膝关节稳定系统
c++·单片机·嵌入式硬件·arduino bldc·仿人机器人膝关节稳定系统