Skip to content

Commit

Permalink
エラーメッセージが示すように、esp_idf_hal::gpio::PinDriver 構造体には interrupt_input という…
Browse files Browse the repository at this point in the history
…関数または関連付けられたアイテムは存在しません。これは、PinDriver が割り込み入力モードを直接サポートしていないためです。

原因:

esp_idf_hal クレートの PinDriver 構造体は、GPIOピンの基本的な入出力機能を提供しますが、割り込み機能は直接提供していません。
割り込み機能を使用するには、esp_idf_hal::interrupt モジュールを使用する必要があります。
解決策:

esp_idf_hal::interrupt モジュールを使用する:

esp_idf_hal::interrupt モジュールを使用して、GPIOピンの割り込みを設定します。
具体的には、InterruptPinDriver 構造体を使用します。
esp_idf_hal::gpio::InputPin trait を実装する構造体を使用する:

esp_idf_hal::gpio::InputPin trait を実装する構造体を使用することで割り込みが使用できます。
  • Loading branch information
YoshitakaNaraoka committed Feb 24, 2025
1 parent 8a6463b commit 2501852
Showing 1 changed file with 17 additions and 21 deletions.
38 changes: 17 additions & 21 deletions src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,40 +3,36 @@ use esp_idf_hal::prelude::*;
use esp_idf_sys::*;
use log::info;
use tokio;
use std::time::Duration;
use std::sync::mpsc;
use std::thread;
use std::time::Duration;

fn main() -> Result<(), EspError> {
esp_idf_svc::log::EspLogger::initialize_default();

let peripherals = Peripherals::take().unwrap();
let mut pin = PinDriver::input(peripherals.pins.gpio35)?; // GPIO35を入力モードに設定
let pin = PinDriver::input(peripherals.pins.gpio35)?; // GPIO35を入力モードに設定
let mut interrupt_pin = PinDriver::interrupt_input(peripherals.pins.gpio35)?; // 割り込み入力設定

tokio::spawn(async move {
let mut last_state = pin.is_low(); // 初期状態を保存
let debounce_delay = Duration::from_millis(50); // チャタリング対策の遅延
let (tx, rx) = mpsc::channel();

loop {
let current_state = pin.is_low(); // 現在の状態を取得
interrupt_pin.set_interrupt_type(InterruptType::NegEdge)?; // 割り込みタイプを設定(プルアップ配線の場合)
interrupt_pin.enable_interrupt()?; // 割り込みを有効化

if current_state != last_state {
// 状態が変化した場合、チャタリング対策の遅延
thread::sleep(debounce_delay);
if pin.is_low() == current_state {
// 遅延後も状態が変わらなければ、有効な状態変化とみなす
if current_state {
info!("HelloButton!");
} else {
info!("Button released!");
}
last_state = current_state; // 状態を更新
}
}
thread::sleep(Duration::from_millis(10)); // 状態確認の間隔
interrupt_pin.subscribe(move || {
tx.send(()).unwrap();
})?;

tokio::spawn(async move {
loop {
rx.recv().unwrap();
info!("HelloButton!");
thread::sleep(Duration::from_millis(200)); // チャタリング対策
}
});

loop {
std::thread::sleep(std::time::Duration::from_millis(1000));
}
Ok(())
}

0 comments on commit 2501852

Please sign in to comment.