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 的状态?的主要内容,如果未能解决你的问题,请参考以下文章

基于Arduino的按键控制LED实验

使用Arduino和LED光柱显示器件轻松制作电池电压指示器

如何使用arduino中的PWM在5s内淡出led

WS2812B LED灯工作原理

开发板上的五方向按键如何通过串口控制

Arduino开发板制作