了解 digitalWrite() 中的 millis()

Understanding millis() in digitalWrite()

我一直在做更多的 Arduino 编程,尤其是回到我以前做过的事情并尽可能地摆脱 delay()。我 ran across an interesting post 对 "flash" 一个 LED 使用以下代码:

digitalWrite(strobe1, (millis() % 1000L) < 500L);

我读到的数学是 (当前毫秒 modulo 1000)< 500 并且这个数学似乎是 "flash" LED。我不太明白的是为什么?数学似乎不是测试( mod 的结果小于 500),但确实为此处计算的任何内容设置了引脚 HIGH

我一直在网上搜索以尝试了解这里发生的事情,但找不到任何明确的内容。有人可以解释一下吗?

I read the math as (current milliseconds modulo 1000) < 500

没错。

What I don't quite understand is why? The math doesn't seem to be a test

我不太明白你的说法。 (millis() % 1000L) < 500L 是一个测试,它测试 millis() % 1000L 是否小于 500,结果是 true,相当于 1false,相当于0.

所以,半秒,条件为假 -> 0 被写入,另一半秒为真,1 被写入。

I guess I am used to seeing the test being more explicit, like if((millis() % 1000L) < 500). So this is a ternary function?

不,根本不是三元组,也不是 if。您需要了解什么是 logical/boolean 表达式及其结果。让我们稍微分解一下:

 bool result = (millis() % 1000L) < 500L;

这一行的作用应该很清楚:它检查millis() % 1000L的结果是否小于500,并将结果布尔值存储在result中。布尔值无非是 true 或 false。一个值。像 134561"hello world" 这样的值。当然,您 可以 使用该值作为 if 语句中的条件,如下所示:

if(result) { /* some code */ } else { /* more code */ }

但你不需要。因为它的只是一个值,其中true1相同,false0相同,可以通过这个布尔值隐式衰减到相应的整数(它总是以整数开头)到一个期望高(1)或低(0)的函数。您还可以将 digitalWrite 函数视为接受 bool 而不是逻辑 10,结果是相同的。