jinglixixi 发表于 2025-7-30 11:09

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

本帖最后由 jinglixixi 于 2025-7-30 14:08 编辑

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

图1I2C接口

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

图2 加入I2C和UART

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

图3 配置I2C


图4 配置UART

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

void sci_i2c_master_callback(i2c_master_callback_args_t *p_args)
{
      if(p_args->event==I2C_MASTER_EVENT_TX_COMPLETE)
      {
            i2c_tx_complete = true;
      }
      else if(p_args->event==I2C_MASTER_EVENT_RX_COMPLETE)
      {
            i2c_rx_complete = true;
      }
}

void I2CWaitRX(void)
{
      uint16_t t = 1000;
      while(!i2c_rx_complete && t)
      {
            t--;
            R_BSP_SoftwareDelay(10, BSP_DELAY_UNITS_MICROSECONDS);
      }
      i2c_rx_complete = false;
}

void I2CWaitTX(void)
{
      uint16_t t = 1000;
      while(!i2c_tx_complete && t)
      {
             t--;
             R_BSP_SoftwareDelay(10, BSP_DELAY_UNITS_MICROSECONDS);
      }
      i2c_tx_complete = false;
}



测试光照强度检测的主程序为:
void hal_entry(void)
{
      err = R_SCI_UART_Open(&g_uart9_ctrl, &g_uart9_cfg);
      assert(FSP_SUCCESS == err);      
      printf("I2C-BH1750\r\n");
      R_SCI_I2C_Open(&g_i2c0_ctrl, &g_i2c0_cfg);      
      uint8_t cmd = 0x01;
      R_SCI_I2C_Write(&g_i2c0_ctrl, &cmd, 1, false);
      I2CWaitTX();
      cmd = 0x10;      
      R_SCI_I2C_Write(&g_i2c0_ctrl, &cmd, 1, false);
      I2CWaitTX();
      uint8_t data={0};
      while(1)
      {
               R_SCI_I2C_Read(&g_i2c0_ctrl, &data, 2, false);
               I2CWaitRX();
               int temp=(data<<8)+data;
               double light=temp/1.2;
               printf("light: %.1f lux\r\n",light);
               R_BSP_SoftwareDelay(500,BSP_DELAY_UNITS_MILLISECONDS);               
       }
}


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

图5 串口测试结果

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

图6J4接口

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

图7 引脚配置

打开新生成Keil工程,在主程序文件中加入相应的OLED屏驱动函数后,其显示的主程序为:
void hal_entry(void)
{
    err = R_SCI_UART_Open(&g_uart9_ctrl, &g_uart9_cfg);
    assert(FSP_SUCCESS == err);               
    R_SCI_I2C_Open(&g_i2c0_ctrl, &g_i2c0_cfg);      
      uint8_t cmd = 0x01;
      R_SCI_I2C_Write(&g_i2c0_ctrl, &cmd, 1, false);      
    I2CWaitTX();
    cmd = 0x10;      
    R_SCI_I2C_Write(&g_i2c0_ctrl, &cmd, 1, false);
    I2CWaitTX();
    uint8_t data={0};         
      OLED_Initd();
      OLED_Clear();
      OLED_ShowString(0,0,"BH1750 ",16);
      OLED_ShowString(0,2,"light=   Lx",16);
      while(1)
      {
      R_SCI_I2C_Read(&g_i2c0_ctrl, &data, 2, false);
      I2CWaitRX();
      int temp=(data<<8)+data;
      double light=temp/1.2;
            OLED_ShowNum(50,2,light,4,16);
      R_BSP_SoftwareDelay(500,BSP_DELAY_UNITS_MILLISECONDS);               
    }
}



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

图8 器件连接


图9 显示效果


页: [1]
查看完整版本: 在RA-Eco-RA6M4开发板上实现光照强度的检测及显示