打印
[活动专区]

【AT-START-L021测评】+光照强度检测与记录

[复制链接]
131|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 jinglixixi 于 2024-11-29 01:36 编辑

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

图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)

对所用引脚的进行功能配置函数为:
void BH1750_Init(void)
{
  gpio_init_type gpio_init_struct;
  crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
  gpio_default_para_init(&gpio_init_struct);
  gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
  gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
  gpio_init_struct.gpio_pins = GPIO_PINS_5|GPIO_PINS_6;
  gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  gpio_init(GPIOA, &gpio_init_struct);
}

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

光照传感器发送字节数据的函数为:
void BH1750_SendByte(char data)
{
        char i;
        IIC_OUTPUT_MODE_SET();
        SCL_Clr();
        delay_us(2);
        for (i=0;i<8;i++)
        {
                if(data&0x80) SDA_Set();
                else SDA_Clr();
                data <<= 1;
                SCL_Set();  
                delay_us(2);
                SCL_Clr();
                delay_us(2);
        }
}

光照传感器接收字节数据的函数为:
char BH1750_RecvByte()
{
        char i;
        char data = 0;
        IIC_INPUT_MODE_SET();
        for (i=0;i<8;i++)
        {
                SCL_Clr();
                delay_us(2);
                SCL_Set();
                data <<= 1;
                SCL_Set();
                if(IIC_SDA_IN) data|=0x01;               
                delay_us(2);
        }
        SCL_Clr();
        return data;
}

光照传感器发送指令的函数为:
void Single_Write_BH1750(char REG_Address)
{
        BH1750_Start();
        BH1750_SendByte(SlaveAddress);
        BH1750_RecvACK();
        BH1750_SendByte(REG_Address);
        BH1750_RecvACK();
        BH1750_Stop();
}

光照传感器接收数据的函数为:
void Multiple_Read_BH1750()
{   
        BH1750_Start();
        BH1750_SendByte(SlaveAddress+1);
        BH1750_RecvACK();
        BUF[0] = BH1750_RecvByte();
        BH1750_SendACK(0);
        BUF[1] = BH1750_RecvByte();
        BH1750_SendACK(1);
        BH1750_Stop();
        delay_ms(5);
}

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

进行光照强度检测的主程序为:
int main(void)
{
  system_clock_config();
  at32_board_init();
  uart_print_init(115200);
  printf("BH1750:\r\n");
  BH1750_Init();
  while(1)
  {
       Get_Sunlight_Value();
       delay_ms(1000 );
  }
}

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

图3 光照响应

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

图4  实物连接

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


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

463

主题

2771

帖子

38

粉丝