目录
模块选择
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);
}
订阅发布和上报报文,根据自己创建的产品设备的报文进行修改。
最终结果展示
最终当接收到数据之后,就可以在阿里云的物模型上显示啦!
由于博主我也才是在校大学生,缺少经验,如有不足,希望网友多多指正。