本帖最后由 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 数据记录形式
|