我最近订购了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
这是循环遍历位的主要代码块。
这是我想发生的事情;您有一个i的8位整数,该整数从-3开始,因为它使用3位开始与传感器通信。 i <2 * 40使i保持在2以下,但迭代40次(这是暗处的刺伤,我之前从未见过)。
接下来是我根本不了解的位,while循环,如果引脚为高-1且==(i(i为0)&1),则while循环将为LOW,或者如果我是1,那么循环将很高。哪一个流到if语句中if(i> = 0 &&(i&1))的位置,但最终我不总是1?如果没有修改我?根据我的观察,当信号为低电平时,您不想移动位吗?
我可以看到其余的代码在做什么,我只是不理解它,第一个if语句将i数据的位通过每个循环移动,如果信号为高电平> 30微秒,则该位为1,并将1添加到数据中。
UPDATE table_name
SET t1.type_name = t2.type_name
FROM table_name t1
INNER JOIN (
SELECT DISTINCT progID, type_name
FROM table_name
WHERE type_name <>''
) t2 ON t1.progID = t2.progID
WHERE t1.type_name <>''
答案 0 :(得分:2)
这是我想发生的事情;您有一个从-3开始的i的8位整数,因为 它使用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,或者如果i为 1,则循环将为高。
do {
...
}
while ( digitalRead(pin) == (i & 1) ? HIGH : LOW );
在这里,==
具有更高的优先级,因此首先解决(digitalRead(pin) == (i & 1)
。即,当digitalRead(pin)
为0且i
为偶数,digitalRead(pin)
为1且i
为奇数时为true。 [因为(i&1)有效地测试了最低位]
然后解析三元子表达式,如果为true,则返回HIGH,如果为false,则返回LOW。
必须运行,希望可以带您到达那里。
答案 1 :(得分:0)
// 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”循环中断时,数据位向左移动: 条件的三元运算符结果(高或低)计算为false。由于我们缺少HIGH和LOW的定义,因此尚不清楚何时应该发生。
但是,由于:
...我们应该假设它们每个都扩展为某种表达式,并且THAT的结果确定循环是否应该停止。
因此,很可能在以下情况下发生data <<= 1;
:
digitalRead(pin)
高且*~something~*
digitalRead(pin)
偏低,*~something else~*
据我所知,如果〜something〜和〜something〜取决于age
的值,这将是最有意义的。 / p>