【发布时间】:2019-08-29 01:18:57
【问题描述】:
我最近订购了一个 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
这是循环位的主要代码块。
这就是我认为正在发生的事情;你有一个从 -3 开始的 8 位整数 i,因为它使用 3 位开始与传感器通信。 i
接下来是我不太了解的部分,while 循环,如果 pin 为高电平 - 1 并且 == (i(i being 0) & 1) 那么 while 循环将为 LOW,或者如果 i 为 1,则循环将很高。然后哪个流入 if 语句 if ( i >= 0 && (i & 1)), 但 i 最终不会总是 1 吗?如果不是什么在修改我?从我所看到的情况来看,您不想在信号为 LOW 时移动这些位?
我可以看到代码的其余部分在做什么我只是不理解它,第一个 if 语句在每个循环中移动 i 数据留下的位,如果信号为高电平 > 30 微秒,那么该位是1 和 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;
}
【问题讨论】: