芯源半导体CW32
直播中

jinglixixi

8年用户 1558经验值
擅长:嵌入式技术 光电显示 接口/总线/驱动 控制/MCU
私信 关注
[经验]

【CW32饭盒派开发板试用体验】+光照强度检测

BH1750是一种用于光照强度检测的传感器,它采用I2C接口的方式来工作,可借助板载的I2C接口来进行连接。

image.png

图1 传感器

板上的I2C接口有多个,见图2所示。但由于BH1750传感器模块的引脚排列比较随意,因此无法实现直接的插接使用,所以只好以杜邦线来对应连接。

image.png

图2 传感器接口

BH1750与开发板的连接关系为:

SCL---PB6

SDA---PB7

为便于引脚来输出高低电平及读取引脚的状态,为其引脚所作的相应定义为:

#define SCL_Set() GPIO_WritePin(CW_GPIOB,
GPIO_PIN_6,GPIO_Pin_SET)

#define SCL_Clr() GPIO_WritePin(CW_GPIOB,
GPIO_PIN_6,GPIO_Pin_RESET)

#define SDA_Set() GPIO_WritePin(CW_GPIOB,
GPIO_PIN_7,GPIO_Pin_SET)

#define SDA_Clr() GPIO_WritePin(CW_GPIOB,
GPIO_PIN_7,GPIO_Pin_RESET)

#define IIC_SDA_IN GPIO_ReadPin(CW_GPIOB, GPIO_PIN_7)

配置所用引脚工作模式的函数为:

void BH1750_Init(void)
{ 
GPIO_InitTypeDef GPIO_InitStruct;
__RCC_GPIOB_CLK_ENABLE(); 
GPIO_InitStruct.IT = GPIO_IT_NONE;  
GPIO_InitStruct.Mode= GPIO_MODE_OUTPUT_PP; 
GPIO_InitStruct.Pins = GPIO_PIN_6| GPIO_PIN_7; 
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
GPIO_Init(CW_GPIOB,&GPIO_InitStruct);
}

以GPIO口实现字节数据发送的函数为:

void BH1750_SendByte(char data)
{   
char i;   
IIC_OUTPUT_MODE_SET();   
SCL_Clr();   
for (i=0;i<8;i++)   
{       
if(data&0x80) SDA_Set();       
else SDA_Clr();       
data <<= 1;       
SCL_Set();       
SCL_Clr();   
}
}

以GPIO口实现字节数据接收的函数为:

char BH1750_RecvByte()
{   
char i;   
char data = 0;   
IIC_INPUT_MODE_SET();   
for (i=0;i<8;i++)  
{       
SCL_Clr();       
SCL_Set();       
data <<= 1;       
SCL_Set();       
if(IIC_SDA_IN==GPIO_Pin_SET) data|=0x01;   
}   
SCL_Clr();   
return data;
}

实现光照强度读取的函数为:

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(0xFFFF);   
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;   
ShowNum(20,100,GRAY0,RED,sd,3);
}

在TFT显示屏上,为了实现检测结果的显示所配置的数值显示函数为:

void ShowNum(uint8_t x,uint8_ty,unsigned int fc,unsigned int bc,uint32_t num,uint8_t len)
{   
uint8_t t,temp;   
uint8_t enshow=0;   
for(t=0;t<len;t++)   
{       
temp=(num/oled_pow(10,len-t-1))%10;       
if(enshow==0&&t<(len-1))       
{
            if(temp==0)
            {
                ShowChar(x+8*t,y,fc,bc,' ');
                continue;
            }
            else enshow=1;       
}       
ShowChar(x+8*t,y,fc,bc,temp+'0');    
}
}

在TFT显示屏的配合下,实现光照强度检测与显示的主程序为:

int32_t main(void)
{   
         RCC_HSI_Enable(RCC_HSIOSC_DIV6);
         Lcd_Init();
         Lcd_Clear(RED);
         Gui_DrawFont_GBK16(20,20,GRAY0,RED,"BH1750Test");
         Gui_DrawFont_GBK16(20,60,GRAY0,RED,"Light:(lx)");
         Gui_DrawFont_GBK16(20,140,GRAY0,RED,"jinglixixi");
         ShowNum(20,100,GRAY0,RED,123,3);
         Gui_DrawLine(0,136,127,136,GRAY0);
         BH1750_Init();
         while(1)
         {
                         Get_Sunlight_Value();
                         Delay(0xFFFF);
                         Delay(0xFFFF);
                         Delay(0xFFFF);
        }
}

经程序的编译和下载,其运行效果如图3所示。至此,就实现了对所处环境下的光照强度检测功能。
image.png

图3 检测效果

更多回帖

发帖
×
20
完善资料,
赚取积分