DS18B20 temperature sensor
A Rust DS18B20 temperature sensor driver for embedded-hal
This device uses the 1-wire protocol, and requires using the one-wire-bus
library for the 1-wire bus.
Quick Start
Get Temperature
fn get_temperature<P, E>(
delay: &mut (impl DelayUs<u16> + DelayMs<u16>),
tx: &mut impl Write,
one_wire_bus: &mut OneWire<P>,
) -> OneWireResult<(), E>
where
P: OutputPin<Error=E> + InputPin<Error=E>,
E: Debug
{
ds18b20::start_simultaneous_temp_measurement(one_wire_bus, delay)?;
Resolution::Bits12.delay_for_measurement_time(delay);
let mut search_state = None;
loop {
if let Some((device_address, state)) = one_wire_bus.device_search(search_state.as_ref(), false, delay)? {
search_state = Some(state);
if device_address.family_code() != ds18b20::FAMILY_CODE {
continue;
}
let sensor = Ds18b20::new(device_address)?;
let sensor_data = sensor.read_data(one_wire_bus, delay)?;
writeln!(tx, "Device at {:?} is {}°C", device_address, sensor_data.temperature);
} else {
break;
}
}
Ok(())
}
Configuration
fn test_config<P, E>(
delay: &mut (impl DelayUs<u16> + DelayMs<u16>),
tx: &mut impl Write,
one_wire_bus: &mut OneWire<P>,
) -> OneWireResult<(), E>
where
P: OutputPin<Error=E> + InputPin<Error=E>,
E: Debug
{
if let Some(device_address) = one_wire_bus.devices(false, delay).next() {
let device_address = device_address?;
let device = Ds18b20::new(device_address)?;
let initial_data = device.read_data(one_wire_bus, delay)?;
writeln!(tx, "Initial data: {:?}", initial_data);
let resolution = initial_data.resolution;
device.set_config(18, 24, resolution, one_wire_bus, delay)?;
let new_data = device.read_data(one_wire_bus, delay)?;
writeln!(tx, "New data: {:?}", new_data);
device.save_to_eeprom(one_wire_bus, delay)?;
device.recall_from_eeprom(one_wire_bus, delay)?;
let eeprom_data = device.read_data(one_wire_bus, delay)?;
writeln!(tx, "EEPROM data: {:?}", eeprom_data);
}
Ok(())
}
Example output
Initial data: SensorData { temperature: 85.0, resolution: Bits12, alarm_temp_low: 70, alarm_temp_high: 75 }
New data: SensorData { temperature: 85.0, resolution: Bits12, alarm_temp_low: 18, alarm_temp_high: 24 }
EEPROM data: SensorData { temperature: 85.0, resolution: Bits12, alarm_temp_low: 18, alarm_temp_high: 24 }