Arduino 如何检测 LED 的状态?
Posted
技术标签:
【中文标题】Arduino 如何检测 LED 的状态?【英文标题】:How can Arduino detect the state of an LED? 【发布时间】:2013-01-03 11:36:52 【问题描述】:我正在为 Arduino 开发闪烁/褪色灯程序。我正在尝试建立一些基于 LED 状态和某些开关组合的交互性。考虑:按下按钮时,如果 LED 亮起,我想将其关闭,如果 LED 熄灭,我想将其打开。
但是,我找不到任何有关确定 LED 状态的信息。最接近的是this question 关于 android,但我正在尝试找出是否可以从 Arduino 平台执行此操作。有没有人有任何实践经验或建议?
【问题讨论】:
【参考方案1】:读取输出端口是绝对可以的。那就是
digitalWrite(LED_PORT, !digitalRead(LED_PORT));
将切换引脚。
您可能还想考虑切换库:http://playground.arduino.cc/Code/DigitalToggle
【讨论】:
谢谢!简单而优雅。稍后我将仔细阅读切换库。可恶的头像。 :)【参考方案2】:您有多种选择:
一,您可以将 LED 状态存储在布尔值中,按下按钮时,将其取反并将其写入 LED 端口:
void loop()
static int ledState = 0; // off
while (digitalRead(BUTTON_PIN) == 0)
; // wait for button press
ledState = !ledState;
digitalWrite(LED_PORT, ledState);
二,如果你不介意直接访问AVR的端口:
void init()
DDRD = 0x01; // for example: LED on port B pin 0, button on port B pin 1
PORTB = 0x00;
void loop()
while (PINB & 0x02 == 0)
; // loop until the button is pressed
PORTB ^= 0x01; // flip the bit where the LED is connected
【讨论】:
直接访问 AVR 端口更可取。不过,关于代码的问题 - 仍然是编码新手。 :) DDRD 和 PORTB ......这些是 Arduino 常量吗?任意变量名?十六进制值是否仅代表引脚号?例如,引脚 8 上的 LED 将表示为PORTB = 0x08
?我如何确定一个引脚是否在“端口 B”上?谢谢!
@dwwilson66 这些是在<avr/io.h>
中声明的常量。十六进制值将引脚号表示为位掩码,即。 e.引脚 X 是 1 << x
,所以引脚 8(嗯,它是引脚 7)是 1 << 7 = 128 = 0x80
。确定哪个引脚在哪个端口上? AVR 数据表。
硬件常量...知道了。今天晚些时候我将更深入地研究数据表!非常感谢您帮助我理解它!
附带说明:关于直接使用位值或保存布尔值,我会使用布尔值。您可能会为一个设备编写代码,但是有这么多不同的 Arduino 平台,您将无法移植您的代码。布尔值更间接,但允许您将自己与代码分开。 --只是一个想法以上是关于Arduino 如何检测 LED 的状态?的主要内容,如果未能解决你的问题,请参考以下文章