目录
单片机选择:STM32F103
光照度模块:维特智能出品的 BH1750
模块被企业封装过,将采集的光照度数据直接串口显示,显示效果如下:
我们需要实现的就比较简单了,只需要将串口数据通过单片机采集出来即可。
序号 | 光照度模块 | 单片机STM32 |
1 | VCC | 3.3V/5V |
2 | RXD | PA2(USART2_TX) |
3 | TXD | PA3(USART2_RX) |
4 | GND | GND |
5 | - | PA9(USART1_TX) |
6 | - | PA10(USART1_RX) |
串口1是为了在电脑端显示串口2所采集的数据。
我们将从标准库和HAL库两个方面实现
核心代码如下:
- void USART2_IRQHandler(void) //串口2中断服务程序
- {
- int i = 0; // 循环变量
- int n = 0; // 循环变量
- int Ligth = 0; // 距离
- char InStr[20]=""; // 存放整数字符串
-
- if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)
- {
- USART_ClearITPendingBit(USART2, USART_IT_RXNE);//清除标志位
- aRxBuffer =USART_ReceiveData(USART2);//(USART1->DR); //读取接收到的数据
- RxBuffer[Uart1_Rx_Cnt++] = aRxBuffer; // 接收数据
-
- if('L' != RxBuffer[0]) // 如果第一个数据接收的不是L,则数据接收错误
- {
- Uart1_Rx_Cnt = 0;
- return;
- }
-
- if( 0X0A == RxBuffer[Uart1_Rx_Cnt-1] && 0X0D == RxBuffer[Uart1_Rx_Cnt-2] && 'L' == RxBuffer[0] )
- {
- USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);//关闭串口接受中断 为了处理数据
- if(NULL != strstr(RxBuffer, "Ligth")) // 判断是否是有效数据
- {
- // for(i=0;i<strlen(RxBuffer);i++) /// 调试代码 可删除
- // {
- // USART_SendData(USART1, RxBuffer[i]);
- // delay_ms(1);
- // }
-
- for(i = 0;i<strlen(RxBuffer);i++)
- {
- if(RxBuffer[i]<='9' && RxBuffer[i]>='0')
- {
- InStr[n++] = RxBuffer[i];
- }
- }
- Ligth = atoi(InStr); // 距离 一个整数 可以直接使用
- ///****调试 串口1 输出**开始**********
- sprintf(TxBuffer,"%d\r\n",Ligth);
- for(i=0;i<strlen(TxBuffer);i++)
- {
- USART_SendData(USART1, TxBuffer[i]);
- delay_ms(1);
- }
- ///****调试 串口1 输出**结束**********
- }
- memset(RxBuffer,0x00,sizeof(RxBuffer)); //清空数组
- memset(TxBuffer,0x00,sizeof(TxBuffer)); //清空数组
- memset(InStr,0x00,sizeof(InStr)); //清空数组
- Uart1_Rx_Cnt = 0;
- n = 0;
-
- USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启串口接受中断 为了处理数据
- }
-
- }
- }
实现效果:
核心代码如下:
- void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
- {
- int i = 0; // 循环变量
- int n = 0; // 循环变量
- int Dis = 0; // 距离
- char InStr[20]=""; // 存放整数字符串
- /* Prevent unused argument(s) compilation warning */
- UNUSED(huart);
- /* NOTE: This function Should not be modified, when the callback is needed,
- the HAL_UART_TxCpltCallback could be implemented in the user file
- */
- if(aRxBuffer != 0)
- {
- RxBuffer[Uart1_Rx_Cnt++] = aRxBuffer; // 接收数据
- if('L' != RxBuffer[0])
- {
- Uart1_Rx_Cnt = 0;
- while(HAL_OK != HAL_UART_Receive_IT(&huart2, (uint8_t *)&aRxBuffer, 1)); //开启接收中断,并保证开启成功
- return;
- }
- }
-
- if( 0X0A == RxBuffer[Uart1_Rx_Cnt-1] && 0X0D == RxBuffer[Uart1_Rx_Cnt-2] && 'L' == RxBuffer[0] )
- {
- if(NULL != strstr(RxBuffer, "Ligth")) // 判断是否是有效数据
- {
- // HAL_UART_Transmit(&huart1, (uint8_t *)RxBuffer, strlen(RxBuffer),0xFFFF); //将收到的信息发送出去
- // while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX); //检测UART发送结束
- // HAL_UART_Transmit(&huart1, (uint8_t *)"\r\n", strlen("\r\n"),0xFFFF); //将收到的信息发送出去
- // while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX); //检测UART发送结束
-
- for(i = 0;i<strlen(RxBuffer);i++)
- {
- if(RxBuffer[i]<='9' && RxBuffer[i]>='0')
- {
- InStr[n++] = RxBuffer[i];
- }
- }
- Dis = atoi(InStr); // 距离 一个整数 可以直接使用
- sprintf(TxBuffer,"%d\r\n",Dis);
- HAL_UART_Transmit(&huart1, (uint8_t *)TxBuffer, strlen(TxBuffer),0xFFFF); //将收到的信息发送出去
- while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX);//检测UART发送结束
- }
- memset(RxBuffer,0x00,sizeof(RxBuffer)); //清空数组
- memset(TxBuffer,0x00,sizeof(TxBuffer)); //清空数组
- memset(InStr,0x00,sizeof(InStr)); //清空数组
- Uart1_Rx_Cnt = 0;
- n = 0;
- }
-
- while(HAL_OK != HAL_UART_Receive_IT(&huart2, (uint8_t *)&aRxBuffer, 1)); //开启接收中断,并保证开启成功
-
- }
实现效果:
如有问题或需求可私信交流
源码链接(标准库与HAL库)