-
Notifications
You must be signed in to change notification settings - Fork 214
RMT Onewire Peripheral #454
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 18 commits
a37af47
d45b33f
4a62132
b9de421
cc879bf
0183797
6e3f9b0
7148db1
719911b
c72e53c
cb17743
af7827b
f2453a4
9696af5
a72fb45
d0f1185
389135b
f8145c1
831be2d
bcf0ddd
8a8d7fd
c110fef
a7e26a9
fd076e8
269f4f3
eb6b1c2
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -18,10 +18,13 @@ use esp_idf_hal::delay::Ets; | |
| use esp_idf_hal::gpio::*; | ||
| use esp_idf_hal::peripheral::*; | ||
| use esp_idf_hal::peripherals::Peripherals; | ||
| #[cfg(any(feature = "rmt-legacy", esp_idf_version_major = "4"))] | ||
|
||
| use esp_idf_hal::rmt::config::{CarrierConfig, DutyPercent, Loop, TransmitConfig}; | ||
| #[cfg(any(feature = "rmt-legacy", esp_idf_version_major = "4"))] | ||
| use esp_idf_hal::rmt::*; | ||
| use esp_idf_hal::units::FromValueType; | ||
|
|
||
| #[cfg(any(feature = "rmt-legacy", esp_idf_version_major = "4"))] | ||
| fn main() -> anyhow::Result<()> { | ||
| esp_idf_hal::sys::link_patches(); | ||
|
|
||
|
|
@@ -64,6 +67,16 @@ fn main() -> anyhow::Result<()> { | |
| Ok(()) | ||
| } | ||
|
|
||
| #[cfg(not(any(feature = "rmt-legacy", esp_idf_version_major = "4")))] | ||
| fn main() -> anyhow::Result<()> { | ||
| println!("This example requires feature `rmt-legacy` enabled or using ESP-IDF v4.4.X"); | ||
|
|
||
| loop { | ||
| std::thread::sleep(std::time::Duration::from_millis(1000)); | ||
| } | ||
| } | ||
|
|
||
| #[cfg(any(feature = "rmt-legacy", esp_idf_version_major = "4"))] | ||
| fn send_morse_code<'d>( | ||
| channel: impl Peripheral<P = impl RmtChannel> + 'd, | ||
| led: impl Peripheral<P = impl OutputPin> + 'd, | ||
|
|
@@ -85,10 +98,12 @@ fn send_morse_code<'d>( | |
| Ok(tx) | ||
| } | ||
|
|
||
| #[cfg(any(feature = "rmt-legacy", esp_idf_version_major = "4"))] | ||
| fn high() -> Pulse { | ||
| Pulse::new(PinState::High, PulseTicks::max()) | ||
| } | ||
|
|
||
| #[cfg(any(feature = "rmt-legacy", esp_idf_version_major = "4"))] | ||
| fn low() -> Pulse { | ||
| Pulse::new(PinState::Low, PulseTicks::max()) | ||
| } | ||
|
|
@@ -99,6 +114,7 @@ enum Code { | |
| WordGap, | ||
| } | ||
|
|
||
| #[cfg(any(feature = "rmt-legacy", esp_idf_version_major = "4"))] | ||
| impl Code { | ||
| pub fn push_pulse(&self, pulses: &mut Vec<Pulse>) { | ||
| match &self { | ||
|
|
@@ -118,6 +134,7 @@ fn find_codes(c: &char) -> &'static [Code] { | |
| &[] | ||
| } | ||
|
|
||
| #[cfg(any(feature = "rmt-legacy", esp_idf_version_major = "4"))] | ||
| fn str_pulses(s: &str) -> Vec<Pulse> { | ||
| let mut pulses = vec![]; | ||
| for c in s.chars() { | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -13,9 +13,12 @@ use anyhow::{bail, Result}; | |
| use core::time::Duration; | ||
| use esp_idf_hal::delay::FreeRtos; | ||
| use esp_idf_hal::peripherals::Peripherals; | ||
| #[cfg(any(feature = "rmt-legacy", esp_idf_version_major = "4"))] | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ditto.
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. done |
||
| use esp_idf_hal::rmt::config::TransmitConfig; | ||
| #[cfg(any(feature = "rmt-legacy", esp_idf_version_major = "4"))] | ||
| use esp_idf_hal::rmt::*; | ||
|
|
||
| #[cfg(any(feature = "rmt-legacy", esp_idf_version_major = "4"))] | ||
| fn main() -> Result<()> { | ||
| esp_idf_hal::sys::link_patches(); | ||
|
|
||
|
|
@@ -39,6 +42,16 @@ fn main() -> Result<()> { | |
| }) | ||
| } | ||
|
|
||
| #[cfg(not(any(feature = "rmt-legacy", esp_idf_version_major = "4")))] | ||
| fn main() -> anyhow::Result<()> { | ||
| println!("This example requires feature `rmt-legacy` enabled or using ESP-IDF v4.4.X"); | ||
|
|
||
| loop { | ||
| std::thread::sleep(Duration::from_millis(1000)); | ||
| } | ||
| } | ||
|
|
||
| #[cfg(any(feature = "rmt-legacy", esp_idf_version_major = "4"))] | ||
| fn neopixel(rgb: Rgb, tx: &mut TxRmtDriver) -> Result<()> { | ||
| let color: u32 = rgb.into(); | ||
| let ticks_hz = tx.counter_clock()?; | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,186 @@ | ||
| //! RMT Onewire Example | ||
DaneSlattery marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| //! | ||
| //! Example demonstrating the use of the onewire component. | ||
| //! | ||
| //! In order to use this example, an overidden `Cargo.toml` must be defined with the following definitions: | ||
| //! ``` | ||
| //! [[package.metadata.esp-idf-sys.extra_components]] | ||
| //! remote_component = { name = "onewire_bus", version = "^1.0.2" } | ||
| //! | ||
| //! | ||
| //! [patch.crates-io] | ||
| //! esp-idf-sys = { git = "https://github.com/esp-rs/esp-idf-sys", rev = "2728b85" } | ||
| //! | ||
| //! ``` | ||
| //! | ||
| //! The example can then be run with | ||
| //! `MCU=<target> cargo run --example rmt_onewire --manifest-path /path/to/other/Cargo.toml` | ||
| //! | ||
| //! Below is a connection sketch, the signal pin must be externally pulled-up | ||
| //! with a 4.7kOhm resistor. | ||
| //! This example uses gpio 16, but any pin capable of | ||
| //! input AND output is suitable. | ||
| //! | ||
| //! If the example is successful, it should print the address of each | ||
| //! onewire device attached to the bus. | ||
| //! | ||
| //! ┌──────────────────────────┐ | ||
| //! │ 3.3V├───────┬─────────────┬──────────────────────┐ | ||
| //! │ │ ┌┴┐ │VDD │VDD | ||
| //! │ ESP Board │ 4.7k│ │ ┌──────┴──────┐ ┌──────┴──────┐ | ||
| //! │ │ └┬┘ DQ│ │ DQ│ │ | ||
| //! │ ONEWIRE_GPIO_PIN├───────┴──┬───┤ DS18B20 │ ┌───┤ DS18B20 │ ...... | ||
| //! │ │ └───│-------------│────┴───│-------------│── | ||
| //! │ │ └──────┬──────┘ └──────┬──────┘ | ||
| //! │ │ │GND │GND | ||
| //! │ GND├─────────────────────┴──────────────────────┘ | ||
| //! └──────────────────────────┘ | ||
| //! | ||
| //! | ||
| //! This example demonstrates: | ||
| //! * A RMT device in both TX and RX mode. | ||
| //! * Usage of the onewire bus driver interface. | ||
| //! * How to iterate through a device search to discover devices on the bus. | ||
|
|
||
| use std::borrow::Borrow; | ||
| use std::time::Duration; | ||
|
|
||
| use esp_idf_hal::delay::FreeRtos; | ||
| #[cfg(all( | ||
| esp_idf_soc_rmt_supported, | ||
| not(feature = "rmt-legacy"), | ||
| esp_idf_comp_espressif__onewire_bus_enabled, | ||
| ))] | ||
| use esp_idf_hal::onewire::{OWCommand, OWDevice, OWDriver}; | ||
| use esp_idf_hal::peripherals::Peripherals; | ||
| use esp_idf_sys::EspError; | ||
|
|
||
| #[cfg(all( | ||
| esp_idf_soc_rmt_supported, | ||
| not(esp_idf_version_major = "4"), | ||
| esp_idf_comp_espressif__onewire_bus_enabled, | ||
| ))] | ||
| fn main() -> anyhow::Result<()> { | ||
| println!("Starting APP!"); | ||
|
|
||
| let peripherals = Peripherals::take()?; | ||
|
|
||
| let onewire_gpio_pin = peripherals.pins.gpio16; | ||
|
|
||
| let onewire_bus: OWDriver = OWDriver::new(onewire_gpio_pin)?; | ||
| let mut search = onewire_bus.search()?; | ||
| let device = search.next(); | ||
| if device.is_none() { | ||
| println!("No device found"); | ||
| return Ok(()); | ||
| } | ||
| let device = OWDevice::new(device.unwrap(), &onewire_bus); | ||
| // let device = OWDevice::new(search.next()?, &onewire_bus); | ||
| // for device in search { | ||
| println!("Found Device: {:?}", device); | ||
|
|
||
| loop { | ||
| ds18b20_trigger_temp_conversion(&device, &onewire_bus)?; | ||
| let temp = ds18b20_get_temperature(&device, &onewire_bus)?; | ||
| println!("Temperature: {}", temp); | ||
| FreeRtos::delay_ms(3000); | ||
| } | ||
| } | ||
|
|
||
| #[cfg(any( | ||
| feature = "rmt-legacy", | ||
| esp_idf_version_major = "4", | ||
| not(esp_idf_comp_espressif__onewire_bus_enabled), | ||
| not(esp_idf_soc_rmt_supported), | ||
| ))] | ||
| fn main() -> anyhow::Result<()> { | ||
| println!("This example requires feature `rmt-legacy` disabled, using ESP-IDF > v4.4.X, the component included in `Cargo.toml`, or is not supported on this MCU"); | ||
|
|
||
| loop { | ||
| std::thread::sleep(std::time::Duration::from_millis(1000)); | ||
| } | ||
| } | ||
|
|
||
| #[cfg(all( | ||
| esp_idf_soc_rmt_supported, | ||
| not(esp_idf_version_major = "4"), | ||
| esp_idf_comp_espressif__onewire_bus_enabled, | ||
| ))] | ||
| fn ds18b20_send_command<'a>( | ||
| device: &OWDevice<'a, impl Borrow<OWDriver<'a>>>, | ||
|
||
| bus: &OWDriver, | ||
| cmd: u8, | ||
| ) -> Result<(), EspError> { | ||
| let mut buf = [0; 10]; | ||
ivmarkov marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| buf[0] = OWCommand::MatchRom as _; | ||
| let addr = device.address().to_le_bytes(); | ||
| buf[1..9].copy_from_slice(&addr); | ||
| buf[9] = cmd; | ||
| println!( | ||
| "seend command{cmd} to addr {} [{:?}], full_msg = {:?}", | ||
| device.address(), | ||
| addr, | ||
| buf | ||
| ); | ||
| let write_size = bus.write(&buf)?; | ||
|
|
||
| println!("Sent {write_size} bytes"); | ||
|
|
||
| Ok(()) | ||
| } | ||
|
|
||
| #[allow(dead_code)] | ||
| #[repr(u8)] | ||
| enum Ds18b20Command { | ||
| ConvertTemp = 0x44, | ||
| WriteScratch = 0x4e, | ||
| ReadScratch = 0xbe, | ||
| } | ||
| #[cfg(all( | ||
| esp_idf_soc_rmt_supported, | ||
| not(esp_idf_version_major = "4"), | ||
| esp_idf_comp_espressif__onewire_bus_enabled, | ||
| ))] | ||
| fn ds18b20_trigger_temp_conversion<'a>( | ||
| device: &OWDevice<'a, impl Borrow<OWDriver<'a>>>, | ||
| bus: &OWDriver, | ||
| ) -> Result<(), EspError> { | ||
| // reset bus and check if the ds18b20 is present | ||
| bus.reset()?; | ||
| println!( | ||
| "Bus reset, bus:{:?} device bus: {:?}", | ||
| bus, | ||
| device.bus().borrow() | ||
| ); | ||
|
|
||
| ds18b20_send_command(device, bus, Ds18b20Command::ConvertTemp as u8)?; | ||
|
|
||
| // delay proper time for temp conversion, | ||
| // assume max resolution (12-bits) | ||
| std::thread::sleep(Duration::from_millis(800)); | ||
|
|
||
| Ok(()) | ||
| } | ||
| #[cfg(all( | ||
| esp_idf_soc_rmt_supported, | ||
| not(esp_idf_version_major = "4"), | ||
| esp_idf_comp_espressif__onewire_bus_enabled, | ||
| ))] | ||
| fn ds18b20_get_temperature<'a>( | ||
| device: &OWDevice<'a, impl Borrow<OWDriver<'a>>>, | ||
| bus: &OWDriver, | ||
| ) -> Result<f32, EspError> { | ||
| bus.reset()?; | ||
|
|
||
| ds18b20_send_command(device, bus, Ds18b20Command::ReadScratch as u8)?; | ||
|
|
||
| let mut buf = [0u8; 10]; | ||
| bus.read(&mut buf)?; | ||
| println!("buffer = {buf:?}"); | ||
| let lsb = buf[0]; | ||
| let msb = buf[1]; | ||
|
|
||
| let temp_raw: u16 = (u16::from(msb) << 8) | u16::from(lsb); | ||
|
|
||
| Ok(f32::from(temp_raw) / 16.0) | ||
| } | ||
Uh oh!
There was an error while loading. Please reload this page.