【ACM32G103RCT6开发板测评】+光照强度检测篇
[复制链接]
BH1750是一种I2C接口的光照强度传感器,可使用扩展接口JP4来连接它。
具体的连接关系为:
SCL----PB8
SDA----PB9
图1 扩展接口
对所用引脚进行配置的函数为:
void BH1750_Init(void)
{
GPIO_InitTypeDefGPIO_InitStruct;
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Drive = GPIO_DRIVE_LEVEL3;
GPIO_InitStruct.Alternate = GPIO_FUNCTION_0;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
实现引脚输出高低电平及检测引脚状态的语句定义为:
#define SCL_Clr1() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET)
#define SCL_Set1() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET)
#define SDA_Clr1() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_RESET)
#define SDA_Set1() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_SET)
#define IIC_SDA_IN1 HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_9)
BH1750发送字节数据的函数为:
void BH1750_SendByte(char data)
{
chari;
IIC_OUTPUT_MODE();
SCL_Clr1();
HAL_DelayUs(2);
for (i=0;i<8;i++)
{
if(data&0x80) SDA_Set1();
else SDA_Clr1();
data<<= 1;
SCL_Set1();
HAL_DelayUs(2);
SCL_Clr1();
HAL_DelayUs(2);
}
}
BH1750接收字节数据的函数为:
char BH1750_RecvByte()
{
chari;
char data = 0;
IIC_INPUT_MODE();
for(i=0;i<8;i++)
{
SCL_Clr1();
HAL_DelayUs(2);
SCL_Set1();
data<<= 1;
SCL_Set1();
if(IIC_SDA_IN1) data|=0x01;
HAL_DelayUs(2);
}
SCL_Clr1();
return data;
}
写寄存器的函数为:
void Single_Write_BH1750(char REG_Address)
{
BH1750_Start();
BH1750_SendByte(SlaveAddress);
BH1750_RecvACK();
BH1750_SendByte(REG_Address);
BH1750_RecvACK();
BH1750_Stop();
}
读取BH1750数据的函数为:
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(5);
}
读取并显示光照强度的函数为:
voidGet_Sunlight_Value()
{
intdis_data=0;
float temp;
unsignedintsd;
Single_Write_BH1750(0x01);
Single_Write_BH1750(0x10);
HAL_DelayMs(180);
Multiple_Read_BH1750();
dis_data=BUF[0];
dis_data=(dis_data<<8)+BUF[1];
temp=(float) dis_data/1.2;
sd=temp;
if(sd<54612) OLED_ShowNum(20,6,sd,5,16);
}
实现光强检测与显示的主程序为:
int main(void)
{
HAL_Init();
SystemClock_Config();
get_reset_source();
BSP_MCO_Init();
BSP_OLED_Init();
Init_OLED();
OLED_Clear();
OLED_ShowString(20,0,"ACM32G103",16);
OLED_ShowString(20,2,"BH1750 Test",16);
BH1750_Init();
OLED_ShowString(20,4,"Sunlight:",16);
OLED_ShowString(68,6,"lx",16);
while(1)
{
Get_Sunlight_Value();
HAL_DelayMs(500);
}
}
经程序的编译与下载,其运行效果如图2所示。
图2 光强检测效果
|