如何使用变速操作员<<分配BH1750光传感器中的值?
How is the value in a BH1750 light sensor assigned using a shifting operator <<?
我正在使用带有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;
相关文章:
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- Android NDK传感器向事件队列报告奇怪的间隔
- 呼叫运营商<<临时
- 扩展光电二极管探测器以支持多个传感器
- 传感器值的阈值
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 无法获取webot::PositionSensor对象中位置传感器的值
- <<操作员在下面的行中工作
- 同步两个具有不同帧速率的传感器
- POST Arduino 传感器值通过 Flask API 发送到本地 Sqlite db
- Arduino Si7021 温度和湿度传感器代码中的错误
- 通过串行端口从GPS传感器读取
- 如何显式调用运算符<<
- 如何固定从传感器获得的变量值
- 当机器人车用超声波传感器(C++)检测到物体时,停止机器人车
- 为电容式触摸传感器设置延迟以防止"double press"
- 什么是英特尔实感的等效传感器
- 校准和归一化来自多个温度传感器的读数的算法
- 使用带有 PIR 传感器的米利斯检测连续运动
- 使用 Arduino 发送两种不同类型的传感器数据