BH1750是一种基于I2C接口的光照强度检测器件,采用该器件的功能模块则更加便于使用,该模块与开发板的线路连接如图1所示,即除了电源引脚接到3.3V电源外,I2C的2个引脚直接连到开发板的对应引脚上。 图1 线路连接 光强检测的初始化函数及循环函数如图2所示。 图2 初始化及循环函数 此外,辅助BH1750检测的启动和停止函数为: - void BH1750_Start()
- {
- pinMode(SDA,OUTPUT);
- digitalWrite(SDA, HIGH);
- digitalWrite(SCL, HIGH);
- delayMicroseconds(5);
- digitalWrite(SDA, LOW);
- delayMicroseconds(5);
- digitalWrite(SCL, LOW);
- }
- void BH1750_Stop()
- {
- pinMode(SDA,OUTPUT);
- digitalWrite(SDA, LOW);
- digitalWrite(SCL, HIGH);
- delayMicroseconds(5);
- digitalWrite(SDA, HIGH);
- delayMicroseconds(5);
- }
复制代码
BH1750的字节发送函数为: - void BH1750_SendByte(char data)
- {
- char i;
- pinMode(SDA,OUTPUT);
- digitalWrite(SCL, LOW);
- delayMicroseconds(2);
- for (i=0; i<8; i++) //8位计数器
- {
- if(data&0x80) digitalWrite(SDA, HIGH);
- else digitalWrite(SDA, LOW);
- data <<= 1;
- digitalWrite(SCL, HIGH); //拉高时钟线
- delayMicroseconds(2); //延时
- digitalWrite(SCL, LOW); //拉低时钟线
- delayMicroseconds(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(5);
- }
复制代码
获取并输出光强值的函数为: - 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(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=temp;
- Serial.println(sd);
- }
复制代码
在编程编译后,即可观察检测的结果。在未连接传感器的情况下,其输出如图3所示,在日常光线下其光强则如图4所示。 图3 未连接传感器的检测输出
图4 日常光强的检测输出
|