1

我正在使用带有 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();
}

用户与许可 Google Apps 免费版

我免费订阅了 Google Apps(祖父),并且我的用户数量超过了 10。在 google 帮助页面上,它说我可以使用我的帐户创建 10 个免费用户,但在我的管理计费页面上,它说我有 50 个许可证。用户和许可证之间究竟有什么区别?我可以创建 50 封电子邮件并将每封电子邮件分配给一个许可证吗?

4

2 回答 2

1

<<是一个移位运算符,所以 in 的值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是一个int,因此它将忽略十进制数字

于 2019-06-06T06:33:27.027 回答
0

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

作为比较,如果您将数字左移 4 位(编程语言中不存在这种操作):

      42009  | shift left by 4
= 420090000

这对应于乘以 10 4

二进制也一样,只是<< 8表示“乘以 2 8 ”。

所以

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;
于 2019-06-06T10:34:11.820 回答