blink之于单片机,好比Hello World之于新编程语言。
绝大部分人的单片机学习是从blink开始的,当然也是从blink结束的。
blink的另一个作用,可以作为logger使用,随时把调试信息反馈回来,也就是程度执行到哪里了,可以用快闪、慢闪和长亮来跟踪,非常方便。
但是我在MicroBlocks下面blink的时候,被整迷糊了。一般来说,blink就两种思考方式:
1.循环执行“亮-等待-暗-等待”,实现blink;
2.循环执行“当前状态取反-等待”,实现blink;
在MicroBlocks下,ESP32的pin2对应板载LED,调试发现从数字引脚2读回来的值,永远都是false(因为确实没输入电压,就该是false,对应Arduino下LOW);我们不断设置它为true,读回来仍然是false。另外,当pin 2的LED当前状态是true(即HIGH),say、graph或给某个变量赋readdigital pin 2或not read digital pin 2,均可实现pin 2的LED状态反转;而如果pin2的LED当前状态是false,无论是否执行过read digital pin 2,都不能实现pin 2状态的反转。
这说明了什么呢?说明MicroBlocks的say很奇怪?
以下测试都没有在IO2上接3.3V电压。
实验一:LED常亮,不闪烁。无论set digital pin 2 to not read digitalpin 2或set digital pin 2 to not read digital pin 2,均不闪烁。
实验二:闪烁。亮10ms、暗500ms。说明readdigital pin 2一直返回false。这很正常。
以上的两个实验都好理解。下面奇怪的say开始了。
实验三(1):闪烁。亮10ms、暗500ms。say在取反?还是say独占时钟?
实验三(2):不亮,不闪烁。say独占时钟么?
实验三(3):不亮,不闪烁。say就是独占时钟?对比三(5),并非独占。
实验三(4):不亮,不闪烁。说明pin 2初态为true,只要say一次,就被取反;初态为false,say后不取反。
实验三(5):闪烁。第1个say没有读pin 2操作。且能说明say没有独占时钟。
实验四(1):闪烁。无论graph read digital pin 2或graph not read digital pin 2,效果相同。说明graph与say类似。
实验四(2):闪烁。
实验五:LED根本就没点亮!说明true后被立即false了。
晕不晕?如果理解成没接实际电压的不确定干扰,那么四(2)的true却被始终如一地反转了。
问题是,在不接真实导线时,要怎样才能判断出来当前LED是亮还是暗呢?
当然,不接真实导线给IO2电压,万无一失的闪烁,是直接自己设一个bool量,LED肯定会闪烁起来,不过现在迷惑的不是这个,而是不让说和画😜😜😜
联系客服