esp32c3 运行 Rust(二)

4,069 阅读1分钟

esp32c3 运行 Rust(二)

上篇已经点亮板载的 LED,现在让我们通过按钮控制 LED。

环境

  • OS: Ubuntu 20.04.4 LTS

  • Rust: rustc 1.62.0-nightly

  • IDE: VsCode

  • ESP32C3: ESP-C3-13-Kit 开发板

    esp32c3.png

    GPIOtitle
    GPIO4Green LED
    GPIO9button

创建项目

使用如下命令创建 button 项目,并修改项目配置

cargo generate --git https://github.com/esp-rs/esp-idf-template cargo

创建细节参见 esp32c3 运行 Rust(〇)创建项目 HelloWorld

控制 LED

  1. 安装相关依赖

    Cargo.toml 中添加相关依赖

    # ...
    [dependencies]
    # ...
    esp-idf-sys = { version = "0.31.1", features = ["binstart"] }
    embedded-hal = "0.2.7" # 添加这行 不同版本 API 不同,请以 embedded-hal 文档为准
    esp-idf-hal = "0.36.0" # 添加这行
    # ...
    
  2. 获取按钮状态

    将 GPIO 设置成输入引脚

    let mut btn = peripherals.pins.gpio9.into_input()?;
    btn.set_pull_down()?; // 使能内部下拉电阻,禁用上拉电阻
    

    通过 is_high() 方法判断按钮是否被按下,按下为高电平,松开为低电平。

    btn.is_high()?
    
  3. 点亮 LED

    使用 set_low()set_high() 方法切换 LED 亮灭。

    led.set_low()?; // 亮
    led.set_high()?; // 灭
    
  4. 编译并上传

    连接开发板,使用如下命令编译并上传

    cargo espflash --release --monitor /dev/ttyUSB0
    

完整代码

//! 通过按钮控制 LED 灯
//! LED  GPIO4
//! 按钮  GPIO9
//!
use std::{thread, time::Duration};

use embedded_hal::digital::v2::{InputPin, OutputPin};

use esp_idf_hal::{gpio::Pull, peripherals::Peripherals};

use anyhow;
fn main() -> anyhow::Result<()> {
  esp_idf_sys::link_patches();

  let peripherals = Peripherals::take().unwrap();
  let mut led = peripherals.pins.gpio4.into_output()?;
  let mut btn = peripherals.pins.gpio9.into_input()?;

  btn.set_pull_down()?;

  loop {
    thread::sleep(Duration::from_millis(10));
    if btn.is_high()? {
      led.set_low()?;
    } else {
      led.set_high()?;
    }
  }
}

参考

  1. Embedded Rust on Espressif
  2. embedded-hal
  3. esp-idf-hal