无延迟闪烁

不使用delay_ms() 函数使LED 闪烁。

有时您需要同时做两件事。例如,您可能希望在读取按钮按下情况时使 LED 闪烁。在这种情况下,您不能使用delay_ms(),因为Arduino会在delay_ms()期间暂停您的程序。如果在 Arduino 暂停等待delay_ms()通过时按下按钮,您的程序将错过按钮按下。

该草图演示了如何在不使用delay_ms()的情况下使LED闪烁。它会打开 LED,然后记下时间。然后,每次通过loop(),它都会检查是否已经过了所需的闪烁时间。如果有,它会打开或关闭 LED 并记下新时间。通过这种方式,LED 会连续闪烁,而草图执行不会滞后于单个指令。

打个比方,就像用微波炉加热披萨,同时等待一些重要的电子邮件。您将披萨放入微波炉中,加热 10 分钟。使用delay_ms() 的类比是坐在微波炉前看着计时器从10 分钟倒计时直到计时器达到零。如果重要的电子邮件在此期间到达,您将会错过它。

在现实生活中,你会做的就是打开披萨,然后检查你的电子邮件,然后可能会做其他事情(这不会花太长时间!),每隔一段时间你就会回到微波炉看看如果计时器已为零,则表明您的披萨已完成。 在本教程中,您将学习如何设置类似的计时器。

硬件要求

  • Arduino板卡
  • 220欧电阻
  • LED

电路

要构建电路,请将电阻器的一端连接到电路板的引脚 13。将 LED 的长腿(正极腿,称为阳极)连接到电阻器的另一端。将 LED 的短脚(负极脚,称为阴极)连接到电路板 GND,

大多数 Arduino 板已在板本身的引脚 13 上连接了一个 LED。如果您在没有连接硬件的情况下运行此示例,您应该会看到 LED 闪烁。

代码

我们可以通过检查当前时间点和上次时间点的差值,来开启或者关闭LED,以实现闪烁效果。

编译并运行示例

cargo build
cargo run

完整代码如下:

src/main.rs

/*!
 * Blink an LED without using the delay_ms() function.
 */
#![no_std]
#![no_main]

use panic_halt as _;
use arduino_uno_example::utils::{millis_init,millis};

#[arduino_hal::entry]
fn main() -> ! {
    let dp = arduino_hal::Peripherals::take().unwrap();
    let pins = arduino_hal::pins!(dp);

    let mut led = pins.d13.into_output();
    const INTERVAL: u32 = 1000;
    let mut previous_time = 0;

    millis_init(dp.TC0);

    // Enable interrupts globally
    unsafe { avr_device::interrupt::enable() };

    loop {
        let current_time = millis();

        if current_time - previous_time >= INTERVAL {
            previous_time = current_time;
            led.toggle();
        }
    }
}