#embedded-hal-driver #onewire #1wire

no-std one-wire-bus

A Rust implementation of the 1-Wire protocol for embedded-hal

2 releases

0.1.1 Jan 18, 2020
0.1.0 Jan 17, 2020

#703 in Embedded development

Download history 101/week @ 2023-11-20 108/week @ 2023-11-27 193/week @ 2023-12-04 108/week @ 2023-12-11 63/week @ 2023-12-18 57/week @ 2023-12-25 91/week @ 2024-01-01 79/week @ 2024-01-08 107/week @ 2024-01-15 99/week @ 2024-01-22 157/week @ 2024-01-29 102/week @ 2024-02-05 110/week @ 2024-02-12 122/week @ 2024-02-19 139/week @ 2024-02-26 156/week @ 2024-03-04

540 downloads per month
Used in ds18b20

MIT/Apache

20KB
385 lines

One-Wire Bus

Build Status crates.io API

A Rust implementation of the 1-Wire protocol for embedded-hal

Quick Start

These examples omit error handling to keep them short. You should check all results and handle them appropriately.

The 1-wire bus requires a single digital pin that is configured as an open-drain output (it's either open, or connected to ground), and the bus should have a ~5K Ohm pull-up resistor connected. How you obtain this pin from your specific device is up the the embedded-hal implementation for that device, but it must implement both InputPin and OutputPin

use embedded_hal::blocking::delay::DelayUs;
use embedded_hal::digital::v2::{InputPin, OutputPin};
use core::fmt::{Debug, Write};
use one_wire_bus::OneWire;

fn find_devices<P, E>(
    delay: &mut impl DelayUs<u16>,
    tx: &mut impl Write,
    one_wire_pin: P,
)
    where
        P: OutputPin<Error=E> + InputPin<Error=E>,
        E: Debug
{
    let mut one_wire_bus = OneWire::new(one_wire_pin).unwrap();
    for device_address in one_wire_bus.devices(false, delay) {
        // The search could fail at any time, so check each result. The iterator automatically
        // ends after an error.
        let device_address = device_address.unwrap();

        // The family code can be used to identify the type of device
        // If supported, another crate can be used to interact with that device at the given address
        writeln!(tx, "Found device at address {:?} with family code: {:#x?}",
                 device_address, device_address.family_code()).unwrap();
    }
}

Example Output

Found device at address E800000B1FCD1028 with family code: 0x28
Found device at address 70000008AC851628 with family code: 0x28
Found device at address 0B00000B20687E28 with family code: 0x28
Found device at address 5700000B2015FF28 with family code: 0x28

Dependencies

~71KB