【RISC-V MCU CH32V103测评】BH1750光强检测
[复制链接]
BH1750是一款数字式光强度传感器,相较于光敏电阻与A/D转换器所构成的光强检测,基于使用简便无需进行标度处理等特点。
BH1750是采用I2C接口来工作的,在使用时,可通过2个I/O口来模拟I2C通讯来进行环境光的检测。
BH1750与开发板的连接及显示效果如下图所示:
在模拟I2C通讯的过程中,对其输出高低电平及读取输入信号的相关定义如下:
#define SCL_Set() GPIO_WriteBit(GPIOA, GPIO_Pin_11, Bit_SET)
#define SCL_Clr() GPIO_WriteBit(GPIOA, GPIO_Pin_11, Bit_RESET)
#define SDA_Set() GPIO_WriteBit(GPIOA, GPIO_Pin_12, Bit_SET)
#define SDA_Clr() GPIO_WriteBit(GPIOA, GPIO_Pin_12, Bit_RESET)
配置BH1750相关引脚的初始化函数为:
void BH1750_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //定义一个GPIO_InitTypeDef类型的结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能与LED相关的GPIO端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11|GPIO_Pin_12; //配置GPIO引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置GPIO模式为推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; //设置GPIO口输出速度 GPIO_Speed_50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //调用库函数,初始化GPIOA
}
将相关引脚设置为输入功能的函数为:
void IIC_INPUT_MODE_SET()
{
GPIO_InitTypeDef GPIO_InitStructure; //定义一个GPIO_InitTypeDef类型的结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能与LED相关的GPIO端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //配置GPIO引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //设置GPIO模式为输入 GPIO_Mode_IPD GPIO_Mode_IPU
GPIO_InitStructure.GPIO_Speed =GPIO_Speed_10MHz ; //设置GPIO口输出速度 GPIO_Speed_50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //调用库函数,初始化GPIOA
}
将相关引脚设置为输出功能的函数为:
void IIC_OUTPUT_MODE_SET()
{
GPIO_InitTypeDef GPIO_InitStructure; //定义一个GPIO_InitTypeDef类型的结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能与LED相关的GPIO端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //配置GPIO引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置GPIO模式为推挽输出
GPIO_InitStructure.GPIO_Speed =GPIO_Speed_10MHz ; //设置GPIO口输出速度GPIO_Speed_50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //调用库函数,初始化GPIOA
}
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_Ms(5);
}
读取光强度值得函数为:
void Get_Sunlight_Value()
{
int dis_data=0;
float temp;
char i=0;
int sd;
Single_Write_BH1750(0x01); // power on
Single_Write_BH1750(0x10); // H- resolution mode
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=(int)temp;
if(sd<54612) OLED_ShowNum(0,2,sd,5,16);
}
实现显示效果的主程序为:
int main(void)
{
uint8_t senflag;
Delay_Init(); //延时函数初始化
app_OLED_Init();
OLED_Init();
OLED_Clear();
OLED_ShowString(0,0,"CH32V103 TEST",16);
OLED_ShowString(0,2,"OLED & BH1750",16);
BH1750_Init();
Delay_Ms(2000);
OLED_Clear();
OLED_ShowString(0,0,"Sunlight=",16);
OLED_ShowString(48,2,"lx",16);
while(1)
{
Get_Sunlight_Value();
Delay_Ms(500);
}
}
|