BH1750是一款数字式传感器,该传感器采用I2C接口来工作。 BH1750与开发板的连接关系为: SCLK----GPIO28 SDIN----GPIO29 OLED屏与开发板的连接关系为: SCLK----GPIO4 SDIN----GPIO5 相应的准备处理为: #define SCLK_Pin 28 #define SDIN_Pin 29 #define SCL_Set digitalWrite(SCLK_Pin, HIGH) #define SCL_Clr digitalWrite(SCLK_Pin, LOW) #define SDA_Set digitalWrite(SDIN_Pin, HIGH) #define SDA_Clr digitalWrite(SDIN_Pin, LOW) #define IIC_SDA_IN digitalRead(SDIN_Pin) #define IIC_WRITE 0 #define IIC_READ 1 #define SlaveAddress 0x46 unsigned char BUF[3]; BH1750所用引脚配置的函数为: - void BH1750_Init(void){
- pinMode(SCLK_Pin, OUTPUT);
- pinMode(SDIN_Pin, OUTPUT);
- }
输入模式设置的函数为: - void IIC_INPUT_MODE_SET(){
- pinMode(SDIN_Pin, INPUT);
- }
输出模式设置的函数为: - void IIC_OUTPUT_MODE_SET(){
- pinMode(SDIN_Pin, OUTPUT);
- }
BH1750发送字节数据的函数为: - void BH1750_SendByte(char data){
- char i;
- IIC_OUTPUT_MODE_SET();
- SCL_Clr;
- delayMicroseconds(2);
- for (i=0;i<8;i++)
- {
- if(data&0x80)
- {
- SDA_Set;
- }
- else
- {
- SDA_Clr;
- }
- data <<= 1;
- SCL_Set;
- delayMicroseconds(2);
- SCL_Clr;
- delayMicroseconds(2);
- }
- }
BH1750接收字节数据的函数为: - char BH1750_RecvByte(){
- char i;
- char data = 0;
- IIC_INPUT_MODE_SET();
- for (i=0;i<8;i++)
- {
- SCL_Clr;
- delayMicroseconds(2);
- SCL_Set;
- data <<= 1;
- SCL_Set;
- if(IIC_SDA_IN) data|=0x01;
- delayMicroseconds(2);
- }
- 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(180);
- Multiple_Read_BH1750();
- for(i=0;i<3;i++) dis_data=BUF[0];
- dis_data=(dis_data<<8)+BUF[1];
- sd=temp;
- if(sd<54612) OLED_ShowNum(48,1,sd,5,16);
- }
进行初始化的程序为: - void setup() {
- pinMode(ledPin, OUTPUT);
- pinMode(SCLKPin, OUTPUT);
- pinMode(SDINPin, OUTPUT);
- OLED_Initd();
- OLED_Clear();
- OLED_ShowString(0,0,14,16);
- BH1750_Init();
- }
实现循环检测与显示的程序为: - void loop() {
- digitalWrite(ledPin, HIGH);
- delay(500);
- digitalWrite(ledPin, LOW);
- delay(500);
- Get_Sunlight_Value();
- }
经程序上传,其检测结果如下图所示。 检测效果图
|