Crate tmp1x2

source ·
Expand description

This is a platform agnostic Rust driver for the TMP102 and TMP112 high-accuracy, low-power, digital temperature sensors, based on the embedded-hal traits.

This driver allows you to:

  • Change into one-shot or continuous conversion mode.
  • Read the temperature.
  • Enable/disable the extended measurement mode.
  • Trigger a one-shot measurement.
  • Read whether the one-shot measurement result is ready.
  • Set the conversion rate.
  • Set the high/low temperature threshold.
  • Set the fault queue.
  • Set the alert polarity.
  • Set the thermostat mode.
  • Read whether a comparator mode alert is active.

§The devices

This driver is compatible with both the TMP102 device as well as the TMP112 family of devices, including TMP112A, TMP112B and TMP112N.

These temperature sensors are highly linear and do not require complex calculations or lookup tables to derive the temperature. The on-chip 12-bit ADC offers resolutions down to 0.0625°C.

The TMP102 device is a digital temperature sensor ideal for NTC/PTC thermistor replacement where high accuracy is required. The device offers an accuracy of +/-0.5°C without requiring calibration or external component signal conditioning.

The TMP112 family of devices are digital temperature sensors designed for high-accuracy, low-power, NTC/PTC thermistor replacements where high accuracy is required. The TMP112A and TMP112B offers 0.5°C accuracy and are optimized to provide the best PSR performance for 3.3V and 1.8V operation respectively, while TMP112N offers 1°C accuracy.

The devices feature SMBus(TM), two-wire and I2C interface compatibility, and allows up to four devices on one bus.

Datasheets:

§Usage examples (see also examples folder)

To use this driver, import this crate and an embedded_hal implementation, then instantiate the appropriate device.

Please find additional examples in this repository: driver-examples

§Read temperature in continuous mode

use linux_embedded_hal::I2cdev;
use tmp1x2::{Tmp1x2, SlaveAddr};

let dev = I2cdev::new("/dev/i2c-1").unwrap();
let address = SlaveAddr::default();
// Per default the device is in continuous mode
let mut sensor = Tmp1x2::new(dev, address);
let temperature = sensor.read_temperature().unwrap();
println!("Temperature: {}", temperature);

§Provide an alternative address

use linux_embedded_hal::I2cdev;
use tmp1x2::{Tmp1x2, SlaveAddr};

let dev = I2cdev::new("/dev/i2c-1").unwrap();
let (a1, a0) = (false, true);
let address = SlaveAddr::Alternative(a1, a0);
let mut sensor = Tmp1x2::new(dev, address);

§Change into one-shot mode and trigger a measurement

use linux_embedded_hal::I2cdev;
use nb::block;
use tmp1x2::{Tmp1x2, SlaveAddr};

let dev = I2cdev::new("/dev/i2c-1").unwrap();
let sensor = Tmp1x2::new(dev, SlaveAddr::default());
let mut sensor = sensor.into_one_shot().ok().expect("Mode change error");
let temperature = block!(sensor.read_temperature());

§Get the device back if there was an error during a mode change

use linux_embedded_hal::I2cdev;
use tmp1x2::{ModeChangeError, Tmp1x2, SlaveAddr};

let dev = I2cdev::new("/dev/i2c-1").unwrap();
let mut sensor_continuous = Tmp1x2::new(dev, SlaveAddr::default());
let result = sensor_continuous.into_one_shot();
if let Err(ModeChangeError::I2C(e, dev)) = result {
    sensor_continuous = dev;
} else if let Ok(one_shot_sensor) = result {
    // do something with one-shot sensor...
} else {
    unreachable!();
}

§Enable the extended measurement mode

use linux_embedded_hal::I2cdev;
use tmp1x2::{Tmp1x2, SlaveAddr};

let dev = I2cdev::new("/dev/i2c-1").unwrap();
let mut sensor = Tmp1x2::new(dev, SlaveAddr::default());
sensor.enable_extended_mode().unwrap();

§Set the conversion rate to 1Hz

use linux_embedded_hal::I2cdev;
use tmp1x2::{Tmp1x2, SlaveAddr, ConversionRate};

let dev = I2cdev::new("/dev/i2c-1").unwrap();
let mut sensor = Tmp1x2::new(dev, SlaveAddr::default());
sensor.set_conversion_rate(ConversionRate::_1Hz).unwrap();

§Set the high and low temperature thresholds

use linux_embedded_hal::I2cdev;
use tmp1x2::{Tmp1x2, SlaveAddr, ConversionRate};

let dev = I2cdev::new("/dev/i2c-1").unwrap();
let mut sensor = Tmp1x2::new(dev, SlaveAddr::default());
sensor.set_low_temperature_threshold(-15.0).unwrap();
sensor.set_high_temperature_threshold(60.0).unwrap();

§Set the fault queue

This sets the number of consecutive faults that will trigger an alert.

use linux_embedded_hal::I2cdev;
use tmp1x2::{Tmp1x2, SlaveAddr, FaultQueue};

let dev = I2cdev::new("/dev/i2c-1").unwrap();
let mut sensor = Tmp1x2::new(dev, SlaveAddr::default());
sensor.set_fault_queue(FaultQueue::_4).unwrap();

§Set the alert polarity

use linux_embedded_hal::I2cdev;
use tmp1x2::{ Tmp1x2, SlaveAddr, AlertPolarity };

let dev = I2cdev::new("/dev/i2c-1").unwrap();
let mut sensor = Tmp1x2::new(dev, SlaveAddr::default());
sensor.set_alert_polarity(AlertPolarity::ActiveHigh).unwrap();

§Set the thermostat mode

use linux_embedded_hal::I2cdev;
use tmp1x2::{ Tmp1x2, SlaveAddr, ThermostatMode };

let dev = I2cdev::new("/dev/i2c-1").unwrap();
let mut sensor = Tmp1x2::new(dev, SlaveAddr::default());
sensor.set_thermostat_mode(ThermostatMode::Interrupt).unwrap();

§Check whether an alert is active as defined by the comparator mode

Note that this ignores the thermostat mode setting and always refers to the status as defined by the comparator mode.

use linux_embedded_hal::I2cdev;
use tmp1x2::{Tmp1x2, SlaveAddr};

let dev = I2cdev::new("/dev/i2c-1").unwrap();
let mut sensor = Tmp1x2::new(dev, SlaveAddr::default());
let alert = sensor.is_comparator_mode_alert_active().unwrap();

Re-exports§

  • pub use nb;

Structs§

Enums§