【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;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11|GPIO_Pin_12;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- }
将相关引脚设置为输入功能的函数为:
- void IIC_INPUT_MODE_SET()
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
- GPIO_InitStructure.GPIO_Speed =GPIO_Speed_10MHz ;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- }
将相关引脚设置为输出功能的函数为:
- void IIC_OUTPUT_MODE_SET()
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Speed =GPIO_Speed_10MHz ;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- }
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);
- 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=(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);
- }
- }
|