STM32实现光照强度传感器(BH1750)(标准库与HAL库实现)
Posted 小材大用
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32实现光照强度传感器(BH1750)(标准库与HAL库实现)相关的知识,希望对你有一定的参考价值。
目录
元器件类型选择
单片机选择: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);//开启串口接受中断 为了处理数据
实现效果:
HAL库实现
核心代码如下:
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库)
(1条消息) STM32实现光照强度传感器(BH1750)(标准库与HAL库实现)-C文档类资源-CSDN文库
以上是关于STM32实现光照强度传感器(BH1750)(标准库与HAL库实现)的主要内容,如果未能解决你的问题,请参考以下文章
( zigbee)CC2530+BH1750光敏传感器获取光照强度