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


    目录

    元器件类型选择

    接线表设计

    实现过程

     标准库实现

     HAL库实现

    代码下载


    元器件类型选择

    单片机选择:STM32F103

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

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

     

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

    接线表设计

    序号光照度模块单片机STM32
    1VCC3.3V/5V
    2RXDPA2(USART2_TX)
    3TXDPA3(USART2_RX)
    4GNDGND
    5-PA9(USART1_TX)
    6-PA10(USART1_RX)

    串口1是为了在电脑端显示串口2所采集的数据。

    实现过程

    我们将从标准库和HAL库两个方面实现

     标准库实现

    核心代码如下:

    1. void USART2_IRQHandler(void) //串口2中断服务程序
    2. {
    3. int i = 0; // 循环变量
    4. int n = 0; // 循环变量
    5. int Ligth = 0; // 距离
    6. char InStr[20]=""; // 存放整数字符串
    7. if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)
    8. {
    9. USART_ClearITPendingBit(USART2, USART_IT_RXNE);//清除标志位
    10. aRxBuffer =USART_ReceiveData(USART2);//(USART1->DR); //读取接收到的数据
    11. RxBuffer[Uart1_Rx_Cnt++] = aRxBuffer; // 接收数据
    12. if('L' != RxBuffer[0]) // 如果第一个数据接收的不是L,则数据接收错误
    13. {
    14. Uart1_Rx_Cnt = 0;
    15. return;
    16. }
    17. if( 0X0A == RxBuffer[Uart1_Rx_Cnt-1] && 0X0D == RxBuffer[Uart1_Rx_Cnt-2] && 'L' == RxBuffer[0] )
    18. {
    19. USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);//关闭串口接受中断 为了处理数据
    20. if(NULL != strstr(RxBuffer, "Ligth")) // 判断是否是有效数据
    21. {
    22. // for(i=0;i<strlen(RxBuffer);i++) /// 调试代码 可删除
    23. // {
    24. // USART_SendData(USART1, RxBuffer[i]);
    25. // delay_ms(1);
    26. // }
    27. for(i = 0;i<strlen(RxBuffer);i++)
    28. {
    29. if(RxBuffer[i]<='9' && RxBuffer[i]>='0')
    30. {
    31. InStr[n++] = RxBuffer[i];
    32. }
    33. }
    34. Ligth = atoi(InStr); // 距离 一个整数 可以直接使用
    35. ///****调试 串口1 输出**开始**********
    36. sprintf(TxBuffer,"%d\r\n",Ligth);
    37. for(i=0;i<strlen(TxBuffer);i++)
    38. {
    39. USART_SendData(USART1, TxBuffer[i]);
    40. delay_ms(1);
    41. }
    42. ///****调试 串口1 输出**结束**********
    43. }
    44. memset(RxBuffer,0x00,sizeof(RxBuffer)); //清空数组
    45. memset(TxBuffer,0x00,sizeof(TxBuffer)); //清空数组
    46. memset(InStr,0x00,sizeof(InStr)); //清空数组
    47. Uart1_Rx_Cnt = 0;
    48. n = 0;
    49. USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启串口接受中断 为了处理数据
    50. }
    51. }
    52. }

     实现效果:

     HAL库实现

    核心代码如下:

    1. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
    2. {
    3. int i = 0; // 循环变量
    4. int n = 0; // 循环变量
    5. int Dis = 0; // 距离
    6. char InStr[20]=""; // 存放整数字符串
    7. /* Prevent unused argument(s) compilation warning */
    8. UNUSED(huart);
    9. /* NOTE: This function Should not be modified, when the callback is needed,
    10. the HAL_UART_TxCpltCallback could be implemented in the user file
    11. */
    12. if(aRxBuffer != 0)
    13. {
    14. RxBuffer[Uart1_Rx_Cnt++] = aRxBuffer; // 接收数据
    15. if('L' != RxBuffer[0])
    16. {
    17. Uart1_Rx_Cnt = 0;
    18. while(HAL_OK != HAL_UART_Receive_IT(&huart2, (uint8_t *)&aRxBuffer, 1)); //开启接收中断,并保证开启成功
    19. return;
    20. }
    21. }
    22. if( 0X0A == RxBuffer[Uart1_Rx_Cnt-1] && 0X0D == RxBuffer[Uart1_Rx_Cnt-2] && 'L' == RxBuffer[0] )
    23. {
    24. if(NULL != strstr(RxBuffer, "Ligth")) // 判断是否是有效数据
    25. {
    26. // HAL_UART_Transmit(&huart1, (uint8_t *)RxBuffer, strlen(RxBuffer),0xFFFF); //将收到的信息发送出去
    27. // while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX); //检测UART发送结束
    28. // HAL_UART_Transmit(&huart1, (uint8_t *)"\r\n", strlen("\r\n"),0xFFFF); //将收到的信息发送出去
    29. // while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX); //检测UART发送结束
    30. for(i = 0;i<strlen(RxBuffer);i++)
    31. {
    32. if(RxBuffer[i]<='9' && RxBuffer[i]>='0')
    33. {
    34. InStr[n++] = RxBuffer[i];
    35. }
    36. }
    37. Dis = atoi(InStr); // 距离 一个整数 可以直接使用
    38. sprintf(TxBuffer,"%d\r\n",Dis);
    39. HAL_UART_Transmit(&huart1, (uint8_t *)TxBuffer, strlen(TxBuffer),0xFFFF); //将收到的信息发送出去
    40. while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX);//检测UART发送结束
    41. }
    42. memset(RxBuffer,0x00,sizeof(RxBuffer)); //清空数组
    43. memset(TxBuffer,0x00,sizeof(TxBuffer)); //清空数组
    44. memset(InStr,0x00,sizeof(InStr)); //清空数组
    45. Uart1_Rx_Cnt = 0;
    46. n = 0;
    47. }
    48. while(HAL_OK != HAL_UART_Receive_IT(&huart2, (uint8_t *)&aRxBuffer, 1)); //开启接收中断,并保证开启成功
    49. }

    实现效果:

    代码下载

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

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

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

    吾芯电子工作室

  • 相关阅读:
    安装kibana
    Java的IO流-数据流
    面试干货丨Redis缓存数据库,持久化机制有哪几种你知道吗?!
    ts 之 定义 泛型( 泛型的定义、函数中又多个泛型的参数、接口、 类、泛型约束)
    Python接口自动化测试数据驱动DDT使用实战
    JAVA操作Excel(POI、easyPOI、easyExcel)
    【Linux】:Linux中Shell命令及其运行原理/权限的理解
    搞清信息化是什么,让企业转型升级走上正确的道路
    zabbix企业监控
    oCPC实践录 | oCPC转化的设计、选择、归因与成本设置(4)
  • 原文地址:https://blog.csdn.net/XiaoCaiDaYong/article/details/127677513