Crate tmp006

source ·
Expand description

This is a platform agnostic Rust driver for the TMP006/TMP006B non-contact infrared (IR) thermopile temperature sensor, based on the embedded-hal traits.

This driver allows you to:

Introductory blog post

The device

The TMP006 and TMP006B are the first in a series of temperature sensors that measure the temperature of an object without the need to make contact with the object. This sensor uses a thermopile to absorb the infrared energy emitted from the object being measured and uses the corresponding change in thermopile voltage to determine the object temperature.

Infrared sensor voltage range is specified from -40°C to +125°C to enable use in a wide range of applications. Low power consumption along with low operating voltage makes the device suitable for battery-powered applications. The low package height of the chip-scale format enables standard high- volume assembly methods, and can be useful where limited spacing to the object being measured is available.

Datasheet:

Usage examples (see also examples folder)

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

Please find additional examples in this repository: tmp006-examples

Read object temperature

extern crate linux_embedded_hal as hal;
#[macro_use]
extern crate nb;
extern crate tmp006;

use hal::I2cdev;
use tmp006::{Tmp006, SlaveAddr};

let dev = I2cdev::new("/dev/i2c-1").unwrap();
let address = SlaveAddr::default();
let mut sensor = Tmp006::new(dev, address);
let calibration_factor = 6e-14;
let temperature = block!(sensor
    .read_object_temperature(calibration_factor))
    .unwrap();
println!("Temperature: {}K", temperature);

Provide an alternative address

extern crate linux_embedded_hal as hal;
extern crate tmp006;

use hal::I2cdev;
use tmp006::{Tmp006, SlaveAddr};

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

Read raw sensor data and calculate the object temperature manually

extern crate linux_embedded_hal as hal;
#[macro_use]
extern crate nb;
extern crate tmp006;

use hal::I2cdev;
use tmp006::{Tmp006, SlaveAddr};

let dev = I2cdev::new("/dev/i2c-1").unwrap();
let mut sensor = Tmp006::new(dev, SlaveAddr::default());
let data = block!(sensor.read_sensor_data()).unwrap();
println!(
    "Object voltage: {}\nAmbient temperature: {}",
    data.object_voltage, data.ambient_temperature);
let calibration_factor = 6e-14;
let temp = sensor.calculate_object_temperature(data, calibration_factor);
println!("Temperature: {}K", temp);

Set the conversion rate to 2 per second

extern crate linux_embedded_hal as hal;
extern crate tmp006;

use hal::I2cdev;
use tmp006::{ConversionRate, Tmp006, SlaveAddr};

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

Enable the DRDY (data ready) pin

extern crate linux_embedded_hal as hal;
extern crate tmp006;

use hal::I2cdev;
use tmp006::{ConversionRate, Tmp006, SlaveAddr};

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

Read whether the data is ready to be read

extern crate linux_embedded_hal as hal;
extern crate tmp006;

use hal::I2cdev;
use tmp006::{ConversionRate, Tmp006, SlaveAddr};

let dev = I2cdev::new("/dev/i2c-1").unwrap();
let mut sensor = Tmp006::new(dev, SlaveAddr::default());
loop {
    let ready = sensor.is_data_ready().unwrap();
    println!("Data ready?: {}", ready);
    // add some delay here...
}

Structs

Data as read from the sensor.
TMP006 device driver.

Enums

ADC conversion rate
All possible errors in this crate
Possible slave addresses