[M33] 在RA-Eco-RA6M4开发板上实现光照强度的检测及显示

[复制链接]
 楼主| jinglixixi 发表于 2025-7-30 11:09 | 显示全部楼层 |阅读模式
本帖最后由 jinglixixi 于 2025-7-30 14:08 编辑

#申请原创#
@21小跑堂

在前面曾介绍过在RA-Eco-RA6M4开发板上实现RTC电子时钟功能,以此为基础这次介绍一下用I2C来实现光照强度的检测,所用的传感器为BH1750。
为进行光照强度的检测,所用的引脚由I2C接口引出,见图1所示。
c157b4c9582eef5929544c80a3db28cb
图1  I2C接口

此外,为了调试的方便还使用到串口UART9,为此需在RASC的Stack中加入I2C和UART,见图2所示。
01a86d6e10ae5804768d89f180bc62f4
图2 加入I2C和UART

相应的属性配置见图3和图4所示,随后点击“Generate Project Content”以生成Keil工程。
9f3dc0db1ef53130f32b22692f3a8ce1
图3 配置I2C

70c3dde7f92ed54bd42fba45692bf935
图4 配置UART

然后,回到KEIL中进行程序的设计。
此时,需在主程序的文件中添加以下内容:
  1. volatile bool i2c_tx_complete = false;
  2. volatile bool i2c_rx_complete = false;

  3. void sci_i2c_master_callback(i2c_master_callback_args_t *p_args)
  4. {
  5.         if(p_args->event==I2C_MASTER_EVENT_TX_COMPLETE)
  6.         {
  7.               i2c_tx_complete = true;
  8.         }
  9.         else if(p_args->event==I2C_MASTER_EVENT_RX_COMPLETE)
  10.         {
  11.               i2c_rx_complete = true;
  12.         }
  13. }

  14. void I2CWaitRX(void)
  15. {
  16.         uint16_t t = 1000;
  17.         while(!i2c_rx_complete && t)
  18.         {
  19.               t--;
  20.               R_BSP_SoftwareDelay(10, BSP_DELAY_UNITS_MICROSECONDS);
  21.         }
  22.         i2c_rx_complete = false;
  23. }

  24. void I2CWaitTX(void)
  25. {
  26.         uint16_t t = 1000;
  27.         while(!i2c_tx_complete && t)
  28.         {
  29.              t--;
  30.              R_BSP_SoftwareDelay(10, BSP_DELAY_UNITS_MICROSECONDS);
  31.         }
  32.         i2c_tx_complete = false;
  33. }



测试光照强度检测的主程序为:
  1. void hal_entry(void)
  2. {
  3.         err = R_SCI_UART_Open(&g_uart9_ctrl, &g_uart9_cfg);
  4.         assert(FSP_SUCCESS == err);        
  5.         printf("I2C-BH1750\r\n");
  6.         R_SCI_I2C_Open(&g_i2c0_ctrl, &g_i2c0_cfg);        
  7.         uint8_t cmd = 0x01;
  8.         R_SCI_I2C_Write(&g_i2c0_ctrl, &cmd, 1, false);
  9.         I2CWaitTX();
  10.         cmd = 0x10;        
  11.         R_SCI_I2C_Write(&g_i2c0_ctrl, &cmd, 1, false);
  12.         I2CWaitTX();
  13.         uint8_t data[2]={0};
  14.         while(1)
  15.         {
  16.                R_SCI_I2C_Read(&g_i2c0_ctrl, &data[0], 2, false);
  17.                I2CWaitRX();
  18.                int temp=(data[0]<<8)+data[1];
  19.                double light=temp/1.2;
  20.                printf("light: %.1f lux\r\n",light);
  21.                R_BSP_SoftwareDelay(500,BSP_DELAY_UNITS_MILLISECONDS);               
  22.        }
  23. }


经程序的编译和下载,其测试效果如图5所示,说明光照强度检测有效。
47859f857886888e1a5fd6ea52369d9b
图5 串口测试结果

以此为基础,就可以添加OLED屏的显示功能。
由于I2C接口已被占用,可以模拟的方式来驱动OLED屏,为省去连线的麻烦,可直接利用接口J4来连接OLED屏,该接口见图6所示。
1f6aadd81f3ea71b4f2cea2e99050887
图6  J4接口

对所用引脚的配置见图7所示,并要重新生成Keil工程。
451bc8835921803d5c176a60de394094
图7 引脚配置

打开新生成Keil工程,在主程序文件中加入相应的OLED屏驱动函数后,其显示的主程序为:
  1. void hal_entry(void)
  2. {
  3.     err = R_SCI_UART_Open(&g_uart9_ctrl, &g_uart9_cfg);
  4.     assert(FSP_SUCCESS == err);               
  5.     R_SCI_I2C_Open(&g_i2c0_ctrl, &g_i2c0_cfg);        
  6.         uint8_t cmd = 0x01;
  7.         R_SCI_I2C_Write(&g_i2c0_ctrl, &cmd, 1, false);        
  8.     I2CWaitTX();
  9.     cmd = 0x10;        
  10.     R_SCI_I2C_Write(&g_i2c0_ctrl, &cmd, 1, false);
  11.     I2CWaitTX();
  12.     uint8_t data[2]={0};         
  13.         OLED_Initd();
  14.         OLED_Clear();
  15.         OLED_ShowString(0,0,"BH1750 ",16);
  16.         OLED_ShowString(0,2,"light=     Lx",16);
  17.         while(1)
  18.         {
  19.         R_SCI_I2C_Read(&g_i2c0_ctrl, &data[0], 2, false);
  20.         I2CWaitRX();
  21.         int temp=(data[0]<<8)+data[1];
  22.         double light=temp/1.2;
  23.             OLED_ShowNum(50,2,light,4,16);
  24.         R_BSP_SoftwareDelay(500,BSP_DELAY_UNITS_MILLISECONDS);               
  25.     }
  26. }



经程序的编译和下载,其测试效果如图9所示,说明显示功能正常。
c6ff5436d71e38fbe90bd4a5211e263c
图8 器件连接

34dd4f793096534b54d4c7c6b9f62238
图9 显示效果


您需要登录后才可以回帖 登录 | 注册

本版积分规则

517

主题

2932

帖子

39

粉丝
快速回复 在线客服 返回列表 返回顶部

517

主题

2932

帖子

39

粉丝
快速回复 在线客服 返回列表 返回顶部