STM32实现光照强度传感器(BH1750)(标准库与HAL库实现)

目录

元器件类型选择

接线表设计

实现过程

 标准库实现

 HAL库实现

代码下载


元器件类型选择

单片机选择:STM32F103

STM32实现光照强度传感器(BH1750)(标准库与HAL库实现)_第1张图片

光照度模块:维特智能出品的 BH1750

STM32实现光照强度传感器(BH1750)(标准库与HAL库实现)_第2张图片

模块被企业封装过,将采集的光照度数据直接串口显示,显示效果如下:

 STM32实现光照强度传感器(BH1750)(标准库与HAL库实现)_第3张图片

 我们需要实现的就比较简单了,只需要将串口数据通过单片机采集出来即可。

接线表设计

序号 光照度模块 单片机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库两个方面实现

 标准库实现

STM32实现光照强度传感器(BH1750)(标准库与HAL库实现)_第4张图片

核心代码如下:

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='0')
					{
						InStr[n++] = RxBuffer[i];
					}
				}
				Ligth = atoi(InStr);					//	距离 一个整数 可以直接使用
				///****调试 串口1 输出**开始**********
				sprintf(TxBuffer,"%d\r\n",Ligth); 
				for(i=0;i

 实现效果:

STM32实现光照强度传感器(BH1750)(标准库与HAL库实现)_第5张图片

STM32实现光照强度传感器(BH1750)(标准库与HAL库实现)_第6张图片

 HAL库实现

STM32实现光照强度传感器(BH1750)(标准库与HAL库实现)_第7张图片

核心代码如下:

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='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));   //开启接收中断,并保证开启成功
	
}

实现效果:

STM32实现光照强度传感器(BH1750)(标准库与HAL库实现)_第8张图片

代码下载

如有问题或需求可私信交流

源码链接(标准库与HAL库)

(1条消息) STM32实现光照强度传感器(BH1750)(标准库与HAL库实现)-C文档类资源-CSDN文库

吾芯电子工作室

你可能感兴趣的:(单片机c语言,stm32,BH1750,光照度传感器,标准库与HAL库实现)