如何使用变速操作员<<分配BH1750光传感器中的值?

How is the value in a BH1750 light sensor assigned using a shifting operator <<?

本文关键字:lt 传感器 BH1750 操作员 何使用 分配      更新时间:2023-10-16

我正在使用带有arduino的BH1750光传感器在LCD上显示勒克斯值。但是在代码中,我无法获得公式。谁能解释一下公式?

我试图在BH1750的数据表中找到它,但我无法理解这一行:

value = ((buff[0]<<8)|buff[1])/1.2;

整个代码:

#include<Wire.h>
#include<LiquidCrystal.h>
int BH1750address = 0x23;
byte buff[2];
LiquidCrystal lcd (7,6,5,4,3,2); //RS, E, D4, D5, D6, D7
void setup()
{
Wire.begin();
lcd.begin(16,2);
lcd.print("  BH1750 Light  ");
lcd.setCursor(0,1);
lcd.print("Intensity Sensor");
delay(2000);
}
void loop()
{
int i;
uint16_t value=0;
BH1750_Init(BH1750address);
delay(200);
if(2==BH1750_Read(BH1750address))
{
value=((buff[0]<<8)|buff[1])/1.2; //This is where the problem is
lcd.clear();
lcd.print("Intensity in LUX");
lcd.setCursor(6,1);
lcd.print(value);
}
delay(150);
}
int BH1750_Read(int address) 
{
int i=0;
Wire.beginTransmission(address);
Wire.requestFrom(address, 2);
while(Wire.available()) 
{
buff[i] = Wire.read();
i++;
}
Wire.endTransmission();  
return i;
}
void BH1750_Init(int address) 
{
Wire.beginTransmission(address);
Wire.write(0x10);
Wire.endTransmission();
}

<<是一个移位运算符,因此buff[0]中的值向左移动 8 位,然后此值通过or函数链接。最后将结果值除以 1.2

例:

buff[0] = 0000 0001              // assume this value for buff[0] (1 in decimal)
buff[1] = 0110 1000              // assume this value for buff[1] (104 in decimal)
buff[0]<<8:                      // move 8 bit to the left
0000 0001 0000 0000
buff[0]<<8 | buff[1]:            // link by or function
0000 0001 0000 0000 | 0000 0000 0110 1000 = 0000 0001 0110 1000     // 360 in decimal

所以

value = 360 / 1.2 = 300 

请注意,value是一个整数,因此它将忽略十进制数字

a << b

a的位(即二进制表示中的数字)向左移动b位。

为了进行比较,如果以十进制形式将数字向左移动 4 位(编程语言中不存在的操作):

42009  | shift left by 4
= 420090000

这对应于乘以 104

在二进制中也是如此,只是<< 8表示"乘以 28"。

所以

value = ((buff[0]<<8)|buff[1])/1.2;

真的只是

value = ((buff[0] * 256)|buff[1])/1.2;

|是按位或的。它在这里没有做任何有趣的事情,因为buff[0]buff[1]都是字节,即 0 范围内的数字。255. 通过将其中一个乘以 256,我们确保它们没有共同点,在这种情况下,|与加法相同:

value = ((buff[0] * 256) + buff[1]) / 1.2;

/ 1.2部分有点奇怪。您通常不会看到按位运算与浮点除法相结合,只是为了将结果转换回整数。

从数学上讲,1.2 只是 6/5,所以除以 1.2 只是乘以 5/6。

value = (buff[0] * 256 + buff[1]) * 5 / 6;