我最近订购了DHT22温度和湿度传感器以及我仍在等待的一些arduino nanos,我正在阅读一些教程和我将要做的事情,当我得到它们时阅读如何使用非常简单的DHT22阅读数据表后,他们对如何迭代40位数据感兴趣,因为我从来没有在代码中使用过字节,因此查找了它的库,这是这里https://github.com/markruys/arduino-DHT。
DHT22的数据表在这里https://cdn-shop.adafruit.com/datasheets/Digital+humidity+and+temperature+sensor+AM2302.pdf
这是遍历位的主要代码块。
这就是我认为正在发生的事情;你有一个8位的i,从-3开始,因为它使用3位开始与传感器通信。 i <2 * 40使我低于2但是重复40次(这是在黑暗中刺,我以前没见过)。
接下来是我根本不太了解的位,while循环,如果引脚为高 - 1并且= =(i(i为0)&1)那么while循环将为LOW,或者如果我为1则循环将为高。然后流入if语句if if(i> = 0 &&(i&1)),但最终不会总是1?如果没有修改我?从我看到的你不想在信号为低电平时移动位?
我可以看到代码的其余部分正在做什么我只是不理解它,第一个if语句移动数据通过每个循环离开的数据,如果信号高达> 30微秒,则该位为1和a将1添加到数据中。
// We're going to read 83 edges:
// - First a FALLING, RISING, and FALLING edge for the start bit
// - Then 40 bits: RISING and then a FALLING edge per bit
// To keep our code simple, we accept any HIGH or LOW reading if it's max 85 usecs long
uint16_t rawHumidity = 0;
uint16_t rawTemperature = 0;
uint16_t data = 0;
for ( int8_t i = -3 ; i < 2 * 40; i++ ) {
byte age;
startTime = micros();
do {
age = (unsigned long)(micros() - startTime);
if ( age > 90 ) {
error = ERROR_TIMEOUT;
return;
}
} while ( digitalRead(pin) == (i & 1) ? HIGH : LOW );
if ( i >= 0 && (i & 1) ) {
// Now we are being fed our 40 bits
data <<= 1;
// A zero max 30 usecs, a one at least 68 usecs.
if ( age > 30 ) {
data |= 1; // we got a one
}
}
switch ( i ) {
case 31:
rawHumidity = data;
break;
case 63:
rawTemperature = data;
data = 0;
break;
}
}
// Verify checksum
if ( (byte)(((byte)rawHumidity) + (rawHumidity >> 8) + ((byte)rawTemperature) + (rawTemperature >> 8)) != data ) {
error = ERROR_CHECKSUM;
return;
}
这就是我认为正在发生的事情;你有一个8位的i,从-3开始,因为它使用3位开始与传感器通信。我<2 * 40让我低于2但是重复40次(这是在黑暗中刺,我以前没见过)
https://en.cppreference.com/w/cpp/language/operator_precedence
*
(作为乘法运算符)具有比<
更高的优先级(小于),因此这些术语被分组以便首先解析*
。
所以(i <2 * 40)得到解决(i <(2 * 40))。它相当于(i <80)。
接下来是我根本不太了解的位,while循环,如果引脚为高 - 1并且= =(i(i为0)&1)那么while循环将为LOW,或者如果我为1则循环将为高。
do {
...
}
while ( digitalRead(pin) == (i & 1) ? HIGH : LOW );
在这里,==
具有更高的优先级,所以(digitalRead(pin) == (i & 1)
首先得到解决。即,当digitalRead(pin)
为0且i
为偶数时,为真,digitalRead(pin)
为1,i
为奇数。 [since(i&1)有效地测试最低位]然后解析三元子表达式,如果为真则返回HIGH,如果为假则返回LOW。
必须运行,希望能让你到达那里。
// We're going to read 83 edges:
// - First a FALLING, RISING, and FALLING edge for the start bit
// - Then 40 bits: RISING and then a FALLING edge per bit
当'while'循环中断时,数据位向左移动:当条件的三元运算符结果(HIGH或LOW)计算为false时,会发生这种情况。由于我们缺少HIGH和LOW的定义,因此有些不清楚到底应该发生什么。
但是,因为:
...我们应该假设它们每个都扩展为某种表达式,并且THAT的结果决定了循环是否应该停止。
因此,最有可能的是,data <<= 1;
发生在:
digitalRead(pin)
是高和*~something~*
digitalRead(pin)
低和*~something else~*
从我所看到的,如果〜某些东西〜和其他东西〜取决于age
的值,它将是最有意义的。