【AT32F421测评】+ BH1750温湿度检测
[复制链接]
BH1750是一种数字式光强度传感器,它采用I2C接口方式工作,故较为节省GPIO口资源。将它与OLED屏组合在一起即可形成一个小巧而便捷的光强度检测装置,其运行效果如下图所示。
光强检测效果
BH1750与MCU的连接关系为:
SCL---PB10
SDA---PB11
定义相关引脚输出高低电平的引脚为:
#define SCL_Set() GPIOB->BSRE =GPIO_Pins_10
#define SCL_Clr() GPIOB->BRE =GPIO_Pins_10
#define SDA_Set() GPIOB->BSRE =GPIO_Pins_11
#define SDA_Clr() GPIOB->BRE =GPIO_Pins_11
定义SDA引脚位读取的定义语句为:
#define IIC_SDA_IN GPIO_ReadInputDataBit(GPIOB, GPIO_Pins_11)
配置SDA引脚为输入功能的函数为:
void IIC_INPUT_MODE_SET()
{
GPIO_InitType GPIO_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPERIPH_GPIOB, ENABLE);
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pins = GPIO_Pins_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_Pull = GPIO_Pull_PU;
GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
配置SDA引脚为输出功能的函数为:
void IIC_OUTPUT_MODE_SET()
{
GPIO_InitType GPIO_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPERIPH_GPIOB, ENABLE);
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pins = GPIO_Pins_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OutType = GPIO_OutType_PP;
GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
BH1750的启动函数为:
void BH1750_Start()
{
IIC_OUTPUT_MODE_SET();
SDA_Set();
SCL_Set();
Delay_us(5);
SDA_Clr();
Delay_us(5);
SCL_Clr();
}
BH1750的停止函数为:
void BH1750_Stop()
{
IIC_OUTPUT_MODE_SET();
SDA_Clr();
SCL_Set();
Delay_us(5);
SDA_Set();
Delay_us(5);
}
BH1750的发送应答函数为:
void BH1750_SendACK(char ack)
{
IIC_OUTPUT_MODE_SET();
SCL_Clr();
if(ack) SDA_Set();
else SDA_Clr();
Delay_us(2);
SCL_Set();
Delay_us(5);
SCL_Clr();
}
BH1750的发送字节数据的函数为:
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);
}
}
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)
{
AT32_Board_Init();
AT32_OLED_Init();
OLED_Init();
OLED_Clear();
OLED_ShowString(0,0,"AT32F421 TEST",16);
OLED_ShowString(0,2,"OLED & BH1750",16);
BH1750_Init();
Delay_ms(1000u);
OLED_Clear();
OLED_ShowString(0,0,"Sunlight=",16);
OLED_ShowString(48,2,"lx",16);
while(1)
{
Get_Sunlight_Value();
Delay_ms(500 );
}
}
|