基于4G模组的人体体征数据监测发送至云平台(阿里云)

目录

模块选择

4G模块选择

4G模组我选择了广和通的L6104G通信模组,在微信小程序广和通生态商场中购买,单价两百多,其模块搭配有多种功能,4G,TTL,定位,电话,短信,串口通信等等。开发可通过最简单的AT指令实现功能。

传感器模块

 本项目采用了体温,血氧,毫米波雷达,温湿度模块,语音模块

1.4G模组自配的TTL语音播报模块,直接利用AT指令来设置想要播报的内容

2.血氧模块,采用了i2c通信来获取数据

3.体温模块,通过AD转换获取数据

毫米波模块,通过串口通信获取数据

温湿度模块

 想知道毫米波雷达的购买方式请查看这篇博客

STM32基于毫米波雷达的生命体征检系统_研究如何轻松学习的博客-CSDN博客

硬件连接示意图

usb-ttl连接4G可监视stm32与4G之间的通信过程,方便排查问题

获取传感器信息及4G初始化代码

4G模块的初始化代码

首先初始化串口

void USART3_Init(unsigned int BPS, void Tx_Over(void), void (*RxFunction)(unsigned char RX_Data))
{
	  GPIO_InitTypeDef GPIO_InitStruct = {0};
   
		//´®¿Ú3³õʼ»¯
    __HAL_RCC_GPIOB_CLK_ENABLE();
    __HAL_RCC_USART3_CLK_ENABLE();		
	 
    Usart_ISR.U3TXOver = Tx_Over;   	     
	  Usart_ISR.U3RXOperation = RxFunction;  
		
		GPIO_InitStruct.Pin = GPIO_PIN_10;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_11;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_INPUT;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
		
		huart3.Instance = USART3;
    huart3.Init.BaudRate = BPS;
    huart3.Init.WordLength = UART_WORDLENGTH_8B;
    huart3.Init.StopBits = UART_STOPBITS_1;
    huart3.Init.Parity = UART_PARITY_NONE;
    huart3.Init.Mode = UART_MODE_TX_RX;
    huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;
    huart3.Init.OverSampling = UART_OVERSAMPLING_16;
    if (HAL_UART_Init(&huart3) != HAL_OK)
    {
     Error_Handler();
    }

4G代码(需要自己修改对应的物联网平台三元组)

void L610_GPIO_Init()
{
	 GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOB_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
  /*Configure GPIO pin : PB5 */
  GPIO_InitStruct.Pin = GPIO_PIN_5;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
	
}
/*****************************************************************

		Ä£¿é¿ª»úº¯Êý
		Ä£¿éÉϵçºóĬÈÏÊǹػú״̬£¬ÐèÒª¿ØÖÆIO¿ÚÊä³öµçƽ¿ØÖÆÄ£¿é¿ª»ú

*******************************************************************/
void OPEN_MOUDLE(void)
{
	L610_RST_HIGH_LEVEL();
	HAL_Delay(2000);
	L610_RST_LOW_LEVEL();

}
/*L610Ä£¿éµÄ½ÓÊÜ´¦ÀíÄ£¿é*/
void L610_RX_ISR(u8 RX_Data)
{
	if(L610_rx_index < RECV_MAX_LEN)
	{
		L610_recv_buff[L610_rx_index++] = RX_Data; 
	}
	
	L610_recv_timeout = 0;      //³¬Ê±¼ÆÊýÆ÷ÇåÁã
}

/*******************************************************************************
* Function Name  : L610_Init
* Description    : 4GÄ£¿é³õʼ»¯
* Input          : None
* Output         : None
* Return         : None
* Note			 : None
*******************************************************************************/
void L610_Init(void)
{
	L610_GPIO_Init();
	USART3_Init(115200, NULL, L610_RX_ISR); 
}
/*******************************************************************************
* Function Name  : L610_Send
* Description    : 4G·¢ËÍ
* Input          : buff  ´ý·¢ËÍÊý¾Ý    len      ·¢ËÍÊý¾Ý³¤¶È
* Output         : None
* Return         : None
* Note			 : None
*******************************************************************************/
void L610_Send(uint8_t *buff, uint16_t len)
{
		USART3_Send_Poll(buff,len); 
}
/*******************************************************************************
* Function Name  : L610_UartSend
* Description    : 4G´®¿ÚATÖ¸Áî·¢ËÍ,Óû§ÒÆÖ²½Ó¿Ú
* Input          : s ´ý·¢ËÍ×Ö·û´®
* Output         : None
* Return         : None
* Note			 : ²»ÄÜ·¢ËÍ0x00
*******************************************************************************/
void L610_UartSend(unsigned char *s) 
{
  USART3_SendString((char *)s);
}
/*******************************************************************************
* Function Name  : L610_str_find
* Description    : ²éÕÒÆ¥Åä×Ö·û´®
* Input          : buff   ²éÕÒ»º´æ    str  Òª²éÕÒÆ¥ÅäµÄ×Ö·û´®
* Output         : None
* Return         : 0  ÕÒµ½Æ¥Åä   1  δÕÒµ½Æ¥Åä
* Note			 : None
*******************************************************************************/
u8 L610_str_find(u8 *buff, u8 *str)
{
	u8 *p,*q;
	
	p=buff;
	q=str;
	while(*p != '\0')
	{
		if(*p == *q)
		{
			q++;
			p++;
			if(*q == '\0')   //Æ¥Åä½áÊø
			{
				return 0;
			}
		}
		else
		{
			q=str;
			if(*p != *q)
        p++;
		}
	}
	return 1;
}
/*******************************************************************************
* Function Name  : L610_strstr
* Description    : ²éÕÒÆ¥Åä×Ö·û´®
* Input          : buff   ²éÕÒ»º´æ    str  Òª²éÕÒÆ¥ÅäµÄ×Ö·û´®  buff_len  ²éÕÒ»º´æ³¤¶È
* Output         : None
* Return         : 0  ÕÒµ½Æ¥Åä   1  δÕÒµ½Æ¥Åä
* Note			 : None
*******************************************************************************/
u8 L610_strstr(u8 *buff, u8 *str, u16 buff_len)
{
	u8 *p,*q;
	u16 i;
	
	p=buff;
	q=str;
	//while(*p != '\0')
	for(i = 0; i < buff_len; i++)
	{
		if(*p == *q)
		{
			q++;
			if(*q == '\0')   //Æ¥Åä½áÊø
			{
				return 0;
			}
		}
		else
		{
			q=str;
		}
		p++;
	}
	return 1;
}
/*******************************************************

	¼ì²âÄ£¿éATÖ¸Áî״̬£¬»Ø¸´OK¿ÉÒÔÕý³£·¢ËÍATÖ¸Á½áÊøºó
	Çå³ýbuffer¡£
	¶ÔÓ¦ATÖ¸ÁAT

*******************************************************/

u8 L610_Cmd_Send(u8 *cmd, u8 *ack, u16 timeout)
{
  u8 res = L610_ACK_ERR;
	
	Clear_Buffer();             //Çå¿ÕÓ¦´ð»º´æ
	
	delay_ms(10);
	L610_UartSend(cmd);         //·¢ËÍÃüÁî

	//µÈ´ýÓ¦´ð
	if(ack == NULL) 
	{
		res = L610_ACK_OK;
		goto CMD_END;   //ÎÞÓ¦´ð
	}
	else
	{
		while(--timeout)
		{
			delay_ms(1);    //ÑÓʱ1mS,µÈ´ý½ÓÊÕÍê³É
			if(L610_str_find(L610_recv_buff,(u8 *)ack) == L610_ACK_OK)  //ÊÕµ½Ó¦´ð
			{	
				res = L610_ACK_OK;
				break;    //Ìø³öÑ­»·
			}
			else
			{	
				res = L610_ACK_ERR;
			}
		}
	}
	
CMD_END:
	return res;
 
}

/********************************************************

	Çå¿ÕBufferÖеÄÊý¾Ý

*********************************************************/

void Clear_Buffer(void)//Çå¿Õ»º´æ
{
     u16 i;
		for(i=0;i<sizeof(L610_recv_buff);i++)
    L610_recv_buff[i]=0;//»º´æ
    Rxcouter=0;
}


/********************************************************
L610Ó²¼þÐÅϢȷÈÏ

*********************************************************/
void Fibcom_L610_Realy(void)
{	
	L610_UartSend((u8*)"ATI\r\n");
	printf("L610 is ready\r\n");
}


/***************************************************

	¼ì²éÄ£¿éÐźÅÖµ£¬Èç¹ûÐźÅֵ̫²î¿ÉÄܻᵼÖÂÁªÍøʧ°Ü
	¶ÔÓ¦ATÖ¸ÁAT+CSQ?

***************************************************/

void CSQ_check(void)
{
	L610_UartSend((u8*)"AT+CSQ?\r\n");
	//strx=strstr((const char*)L610_recv_buff,(const char*)"+CPIN: READY");//²é¿´ÊÇ·ñ·µ»Øready
		printf("signal is ok\r\n");
	HAL_Delay(1000);
	Clear_Buffer();	
	
}

/****************************************************

	¼ì²éSIM¿¨×´Ì¬£¬Èç¹ûSIM¿¨×´Ì¬²»Õý³££¬Ä£¿é¾ÍÎÞ·¨Õý³£½¨Á¢ÎÞÏßͨÐÅ
	¶ÔÓ¦ATÖ¸Áî £ºAT+CPIN?

*****************************************************/

void  CPIN_check(void)
{
	L610_UartSend((u8*)"AT+CPIN?\r\n");//¼ì²éSIM¿¨ÊÇ·ñÔÚλ,¿¨µÄȱ¿Ú³¯Íâ·ÅÖà 
	HAL_Delay(500);
//	strx=strstr((const char*)L610_recv_buff,(const char*)"+CPIN: READY");//²é¿´ÊÇ·ñ·µ»Øready
//	/*µÈ´ý·µ»ØOK*/
//	while(strx==NULL)
//	{
//		Clear_Buffer();
//		L610_UartSend((u8*)"AT+CPIN?\r\n");
//		strx=strstr((const char*)L610_recv_buff,(const char*)"+CPIN: READY");//Ôٴγ¢ÊÔ·¢ËÍ
//		
//	}
//	if(strx!=NULL)
//	{
		printf("SIM is OK\r\n");
//}
	Clear_Buffer();
}


/******************************************************

  ²éѯGPRS·þÎñÊÇ·ñ¿ÉÓÃ,¼ì²éÄ£¿éÍøÂçÊÇ·ñÕý³£
	¶ÔÓ¦ATÖ¸ÁAT+CGREG?	

*******************************************************/

void GPRS_check(void)
{
	L610_UartSend((u8*)"AT+CGREG?\r\n");
	HAL_Delay(500);
//	strx=strstr((const char*)L610_recv_buff,(const char*)"+CGREG: 0,1");//·µ»ØÕý³£
//	extstrx=strstr((const char*)L610_recv_buff,(const char*)"+CGREG: 0,5");//·µ»ØÕý³££¬ÂþÓÎ
//	
//	while(strx==NULL&&extstrx==NULL)
//	{		
//		Clear_Buffer();
//		L610_UartSend((u8*)"AT+CGREG?\r\n");//²é¿´ÊÇ·ñ×¢²áÍøÂç
//		HAL_Delay(500);
//		strx=strstr((const char*)L610_recv_buff,(const char*)"+CGREG: 0,1");//·µ»ØÕý³£
//		extstrx=strstr((const char*)L610_recv_buff,(const char*)"+CGREG: 0,5");//·µ»ØÕý³££¬ÂþÓÎ
//	}
//	if(strx!=NULL&&extstrx!=NULL)
//	{
//		printf("%s\r\n",strx);
//		printf("%s\r\n",extstrx);
//	}
	printf("internet is ok\r\n");
	Clear_Buffer();
}

/******************************************************

  ²éѯEPS·þÎñÊÇ·ñ¿ÉÓÃ,¼ì²éÄ£¿éÍøÂçÊÇ·ñÕý³£
	¶ÔÓ¦ATÖ¸ÁAT+CEREG?	

*******************************************************/

void EPS_check(void)
{	
	L610_UartSend((u8*)"AT+CEREG?\r\n");
	HAL_Delay(500);
//	strx=strstr((const char*)L610_recv_buff,(const char*)"+CEREG: 0,1");//·µ»ØÕý³£
//	extstrx=strstr((const char*)L610_recv_buff,(const char*)"+CEREG: 0,5");//·µ»ØÕý³££¬ÂþÓÎ
//	while(strx==NULL&&extstrx==NULL)
//	{
//		Clear_Buffer();
//		L610_UartSend((u8*)"AT+CGREG?\r\n");//²é¿´ÊÇ·ñ×¢²áGSMÍøÂç
//		HAL_Delay(500);
//		strx=strstr((const char*)L610_recv_buff,(const char*)"+CEREG: 0,1");//·µ»ØÕý³£
//		extstrx=strstr((const char*)L610_recv_buff,(const char*)"+CEREG: 0,5");//·µ»ØÕý³££¬ÂþÓÎ
//	}
//	if(strx!=NULL&&extstrx!=NULL)
//	{
//		printf("%s\r\n",strx);
//		printf("%s\r\n",extstrx);
//	}
	printf("eps is ok\r\n");
	Clear_Buffer();
}


/******************************************************************

	ÉèÖõ±Ä£¿éÊÕµ½·þÎñÆ÷µÄÊý¾Ýʱ£¬Éϱ¨Êý¾ÝµÄµÄ¸ñʽ¡£Ä¬ÈÏ 0£¬µôµç±£´æ¡£
	¶ÔÓ¦ATÖ¸ÁAT+GTSET="IPRFMT",0
	
******************************************************************/

void Hex_set(void)
{
	
	L610_UartSend((u8*)"AT+GTSET=\"IPRFMT\",0\r\n");
	HAL_Delay(500);
//		strx=strstr((const char*)L610_recv_buff,(const char*)"OK");//²é¿´ÊÇ·ñ·µ»ØOK
//	/*µÈ´ý·µ»ØOK*/
//	while(strx==NULL&&i<=2)
//	{ i++;
//		Clear_Buffer();
//		L610_UartSend((u8*)"AT+GTSET=\"IPRFMT\",0\r\n");
//		HAL_Delay(500);
//		strx=strstr((const char*)L610_recv_buff,(const char*)"OK");//²é¿´ÊÇ·ñ·µ»ØOK
//	}
//	if(strx==NULL)
//	{
//		printf("server is error");
//	}
	printf("server is ok\r\n");
	Clear_Buffer();	
	
}
//ÓïÒô²¥±¨
void TTL(void)
{
	
	L610_UartSend((u8*)"AT+GTTS=1,\"4g×¼±¸Íê±Ï\",1\r\n");
	printf("TTL is ok\r\n");
}
/*****************************************************

	ÇëÇóÔËÓªÉÌ·ÖÅäIP
	¶ÔÓ¦ATÖ¸ÁAT+mipcall = 
	ÔËÓªÉ̲»Í¬±¾ÌõÖ¸ÁîÓÐÇø±ð

******************************************************/

void IP_allo(void)
{	
	L610_UartSend((u8*)"AT+CGREG? \r\n");//²éѯPS×¢²áÇé¿ö
	//L610_UartSend((u8*)"AT+mipcall=1,\"ctnet\"\r\n");//ÇëÇóÔËÓªÉÌ·ÖÅä IP
	HAL_Delay(3000);
	L610_UartSend((u8*)"AT+mipcall?\r\n");//¼ì²éÊÇ·ñ·ÖÅäIP
	HAL_Delay(3000);
//	strx=strstr((const char*)L610_recv_buff,(const char*)"+MIPCALL: 1");//ÅжϽá¹ûÓÐ+MIPCALL:1 ²ÅÄÜ×öÏÂÒ»²½¡£

//	while(strx==NULL)
//	{
//		Clear_Buffer();
//		L610_UartSend((u8*)"AT+mipcall=0\r\n");
//		HAL_Delay(2000);
//		L610_UartSend((u8*)"AT+mipcall=1,\"ctnet\"\r\n");
//		HAL_Delay(3000);
//		L610_UartSend((u8*)"AT+mipcall?\r\n");//¼ì²éÊÇ·ñ·ÖÅäIP
//		HAL_Delay(3000);
//		strx=strstr((const char*)L610_recv_buff,(const char*)"+MIPCALL: 1");//ÅжϽá¹ûÓÐ+MIPCALL:1 ²ÅÄÜ×öÏÂÒ»²½¡£
//	}
	printf("IP is ok\r\n");
	HAL_Delay(1000);
	Clear_Buffer();
}
//´´½¨TCPÁ¬½Ó
void Connect_Tcp(void)
{
	char buff[100];
	
	Clear_Buffer();
		sprintf((char*)buff,"AT+CLOUDAUTH=\"%s\",\"%s\",\"%s\",\"iot-as-mqtt.cn-shanghai.aliyuncs.com\"\r\n",Test1ProductKey,Test1DeviceName,Test1DeviceSecret);
		delay_us(1000);
	L610_UartSend((u8*)buff);
	delay_ms(500);
		L610_UartSend((u8*)"AT+CLOUDCONN=80,0,4\r\n");
	printf("Connect is ok\r\n");
}
//¶©ÔÄÊôÐÔ·¢²¼±¨ÎÄ
void Subs_TCP(void)
{	//char buff[100];
	Clear_Buffer();
	L610_UartSend((u8*)"AT+CLOUDSUB=\"/sys/i7qmPCNrjbX/test1/thing/event/property/post\",1\r\n");
	printf("publish is ok");
	//sprintf((char*)buff,"AT+CLOUDSUB=\"%s\",1\r\n",TOPic_FB);
	//L610_UartSend((u8*)buff);
}
//¶©ÔÄÊý¾ÝÉϱ¨
void Send_TCP(void)
{	//char buff[100];
	Clear_Buffer();
	L610_UartSend((u8*)"AT+CLOUDSUB=\"/sys/i7qmPCNrjbX/test1/thing/service/property/set\",1\r\n");
	
	//sprintf((char*)buff,"AT+CLOUDSUB=\"%s\",1\r\n",TOPic_SendDate);
	//L610_UartSend((u8*)buff);
}

/**************************************************************

	·¢ËÍÊý¾Ý£ºÔÚTCPÁ¬½Ó½¨Á¢ºóµ÷ÓòÅÓÐЧ£¬¿ÉÒÔÏò·þÎñÆ÷·¢ËÍÊý¾Ý
	ÐèÒª´«Èë±£´æÊý¾ÝµÄÊý×é
	¶ÔÓ¦ATÖ¸ÁAT+MIPSEND

***************************************************************/

void Send_Data(uint8_t* Date)
{
	
	char buff[100];
	Clear_Buffer();
	HAL_Delay(2000);
	sprintf((char*)buff,"AT+CLOUDPUB=\"/sys/i7qmPCNrjbX/test1/thing/event/property/post\",1,\"%s\"\r\n",Date);
	//printf("send date");
	L610_UartSend((u8*)buff);
	HAL_Delay(2000);
	Clear_Buffer();
}




void IP_release(void)
{
	Clear_Buffer();
	HAL_Delay(2000);
	L610_UartSend((u8*)"AT+MIPCALL=0\r\n");
	
	strx=strstr((const char*)L610_recv_buff,(const char*)"+MIPCALL: 0");
	while(strx==NULL)
	{
		HAL_Delay(1000);
		strx=strstr((const char*)L610_recv_buff,(const char*)"+MIPCALL: 0");
	}
	Clear_Buffer();
	
	
}

4G模组上云解析

在阿里云平台创建好自己的产品设备

sprintf((char*)buff,"AT+CLOUDAUTH=\"%s\",\"%s\",\"%s\",\"iot-as-mqtt.cn-shanghai.aliyuncs.com\"\r\n",Test1ProductKey,Test1DeviceName,Test1DeviceSecret);
        delay_us(1000);
    L610_UartSend((u8*)buff);
    delay_ms(500);
        L610_UartSend((u8*)"AT+CLOUDCONN=80,0,4\r\n");

这样就激活了云平台设备

void Subs_TCP(void)
{    //char buff[100];
    Clear_Buffer();
    L610_UartSend((u8*)"AT+CLOUDSUB=\"/sys/i7qmPCNrjbX/test1/thing/event/property/post\",1\r\n");
    printf("publish is ok");
    //sprintf((char*)buff,"AT+CLOUDSUB=\"%s\",1\r\n",TOPic_FB);
    //L610_UartSend((u8*)buff);
}
void Send_TCP(void)
{    //char buff[100];
    Clear_Buffer();
    L610_UartSend((u8*)"AT+CLOUDSUB=\"/sys/i7qmPCNrjbX/test1/thing/service/property/set\",1\r\n");
    
    //sprintf((char*)buff,"AT+CLOUDSUB=\"%s\",1\r\n",TOPic_SendDate);
    //L610_UartSend((u8*)buff);
}

订阅发布和上报报文,根据自己创建的产品设备的报文进行修改。

最终结果展示

最终当接收到数据之后,就可以在阿里云的物模型上显示啦!

由于博主我也才是在校大学生,缺少经验,如有不足,希望网友多多指正。

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值