[活动专区] 【AT-START-L021测评】+光照强度检测与记录

[复制链接]
1829|0
 楼主| jinglixixi 发表于 2024-11-29 01:31 | 显示全部楼层 |阅读模式
本帖最后由 jinglixixi 于 2024-11-29 01:36 编辑

BH1750是一种用于光照强度检测的传感器,它相较于用光敏器件来检测光照强度具有集成度高,检测值无需自行标度的优点。
该传感器采用I2C接口来工作,故十分节省引脚资源。
通过扩展接口,光照传感器与开发板的实物连接如图1所示。

242696748a62e49663.png
图1 实物连接

光照传感器所连接的引脚关系为:
CLK---- PA5
DIN ---- PA6

实现相关引脚输出高低电平的语句定义为:
#define SCL_Set()        gpio_bits_write(GPIOA,GPIO_PINS_5,TRUE)
#define SCL_Clr()        gpio_bits_write(GPIOA,GPIO_PINS_5,FALSE)

#define SDA_Set()        gpio_bits_write(GPIOA,GPIO_PINS_6,TRUE)
#define SDA_Clr()        gpio_bits_write(GPIOA,GPIO_PINS_6,FALSE)

读取数据引脚状态的语句定义为:
#define IIC_SDA_IN      gpio_input_data_bit_read(GPIOA, GPIO_PINS_6)

对所用引脚的进行功能配置函数为:
  1. void BH1750_Init(void)
  2. {
  3.   gpio_init_type gpio_init_struct;
  4.   crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
  5.   gpio_default_para_init(&gpio_init_struct);
  6.   gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  7.   gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
  8.   gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
  9.   gpio_init_struct.gpio_pins = GPIO_PINS_5|GPIO_PINS_6;
  10.   gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  11.   gpio_init(GPIOA, &gpio_init_struct);
  12. }

将数据引脚设置为输入模式的函数为:
  1. void IIC_INPUT_MODE_SET()
  2. {
  3.   gpio_init_type gpio_init_struct;
  4.   crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
  5.   gpio_default_para_init(&gpio_init_struct);
  6.   gpio_init_struct.gpio_mode = GPIO_MODE_INPUT;
  7.   gpio_init_struct.gpio_pins = GPIO_PINS_6;
  8.   gpio_init_struct.gpio_pull = GPIO_PULL_UP;
  9.   gpio_init(GPIOA, &gpio_init_struct);
  10. }

光照传感器发送字节数据的函数为:
  1. void BH1750_SendByte(char data)
  2. {
  3.         char i;
  4.         IIC_OUTPUT_MODE_SET();
  5.         SCL_Clr();
  6.         delay_us(2);
  7.         for (i=0;i<8;i++)
  8.         {
  9.                 if(data&0x80) SDA_Set();
  10.                 else SDA_Clr();
  11.                 data <<= 1;
  12.                 SCL_Set();  
  13.                 delay_us(2);
  14.                 SCL_Clr();
  15.                 delay_us(2);
  16.         }
  17. }

光照传感器接收字节数据的函数为:
  1. char BH1750_RecvByte()
  2. {
  3.         char i;
  4.         char data = 0;
  5.         IIC_INPUT_MODE_SET();
  6.         for (i=0;i<8;i++)
  7.         {
  8.                 SCL_Clr();
  9.                 delay_us(2);
  10.                 SCL_Set();
  11.                 data <<= 1;
  12.                 SCL_Set();
  13.                 if(IIC_SDA_IN) data|=0x01;               
  14.                 delay_us(2);
  15.         }
  16.         SCL_Clr();
  17.         return data;
  18. }

光照传感器发送指令的函数为:
  1. void Single_Write_BH1750(char REG_Address)
  2. {
  3.         BH1750_Start();
  4.         BH1750_SendByte(SlaveAddress);
  5.         BH1750_RecvACK();
  6.         BH1750_SendByte(REG_Address);
  7.         BH1750_RecvACK();
  8.         BH1750_Stop();
  9. }

光照传感器接收数据的函数为:
  1. void Multiple_Read_BH1750()
  2. {   
  3.         BH1750_Start();
  4.         BH1750_SendByte(SlaveAddress+1);
  5.         BH1750_RecvACK();
  6.         BUF[0] = BH1750_RecvByte();
  7.         BH1750_SendACK(0);
  8.         BUF[1] = BH1750_RecvByte();
  9.         BH1750_SendACK(1);
  10.         BH1750_Stop();
  11.         delay_ms(5);
  12. }

光照传感器输出检测值的函数为:
  1. void Get_Sunlight_Value()
  2. {
  3.         int dis_data=0;
  4.         float temp;
  5.         char i=0;
  6.         unsigned int sd;
  7.         Single_Write_BH1750(0x01);
  8.         Single_Write_BH1750(0x10);
  9.         delay_ms(180);
  10.         Multiple_Read_BH1750();
  11.         for(i=0;i<3;i++)        dis_data=BUF[0];
  12.         dis_data=(dis_data<<8)+BUF[1];
  13.         temp=(float)dis_data/1.2;
  14.         sd=temp;
  15.         printf("BH1750: %d\r\n",sd);
  16. }

进行光照强度检测的主程序为:
  1. int main(void)
  2. {
  3.   system_clock_config();
  4.   at32_board_init();
  5.   uart_print_init(115200);
  6.   printf("BH1750:\r\n");
  7.   BH1750_Init();
  8.   while(1)
  9.   {
  10.        Get_Sunlight_Value();
  11.        delay_ms(1000 );
  12.   }
  13. }

经程序编译与运行,其效果如图2和图3所示。
632406748a87b93004.png
图2 光照检测

620756748a89b707e6.png
图3 光照响应

数据记录模块是一种通过串口来接收数据并存入TF卡的记录器件,在连接该模块的情况下如图4所示。

952406748a8b9216ff.png
图4  实物连接

经修改,其记录形式如图5所示。
17716748a8d5b9517.png
图5  数据记录形式


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

本版积分规则

521

主题

2949

帖子

39

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