Crates.io | ltr303 |
lib.rs | ltr303 |
version | 0.1.4 |
source | src |
created_at | 2022-06-18 15:02:48.347649 |
updated_at | 2024-04-08 13:16:37.503342 |
description | Platform agnostic Rust driver for the LTR-303 Ambient Light Sensor. |
homepage | https://github.com/Ardelean-Calin/ltr303-rs |
repository | https://github.com/Ardelean-Calin/ltr303-rs |
max_upload_size | |
id | 608561 |
size | 44,997 |
LTR-303ALS
This is a platform-agnostic Rust driver for the LTR-303 Ambient Light Sensor
using embedded-hal
traits.
Tested with the following sensor(s):
Starting a measurement with configurable gain, integration time and measurement rate. See: start_measurement()
Polling for new data. See: data_ready()
Checking latest measurement status. See: get_status()
Reading the latest illuminance value in lux. See: get_lux_data()
Putting the sensor in standby. See: standby()
Reading part ID and manufacturer ID. See: get_part_id()
and get_mfc_id()
Option to pass a delay function to the driver. Similar to the opt300x driver.
Sensor reset in case of error.
Wait for sensor start-up before triggering measurement after cold startup (100ms)
Interrupts.
On Linux using i2cdev:
use linux_embedded_hal::I2cdev;
use ltr303::{LTR303, LTR303Config};
fn main() {
let dev = I2cdev::new("/dev/i2c-1").unwrap();
let mut sensor = LTR303::init(dev);
let config = LTR303Config::default();
sensor.start_measurement(&config).unwrap();
loop {
while sensor.data_ready().unwrap() != true {
// Wait for measurement ready
}
let lux_val = sensor.get_lux_data().unwrap();
println!("LTR303 current lux phys: {}", lux_val.lux_phys);
}
}
On an ESP32-based development board:
use embedded_hal::prelude::*;
use esp_idf_sys as _;
use esp_idf_hal::{delay::FreeRtos, i2c};
use esp_idf_hal::peripherals::Peripherals;
use ltr303::{LTR303, LTR303Config};
fn main() {
esp_idf_sys::link_patches();
let _peripherals = Peripherals::take().unwrap();
// The i2c pins
let sda = _peripherals.pins.gpio4.into_input_output().unwrap();
let scl = _peripherals.pins.gpio6.into_output().unwrap();
let _cfg = i2c::config::MasterConfig::new().baudrate(10000.into());
let _i2c = i2c::Master::new(_peripherals.i2c0, i2c::MasterPins { sda, scl }, _cfg).unwrap();
let mut ltr303 = LTR303::init(_i2c);
let ltr303_config =
LTR303Config::default().with_integration_time(ltr303::IntegrationTime::Ms400);
ltr303.start_measurement(<r303_config).unwrap();
loop {
while ltr303.data_ready().unwrap() != true {
// Wait for measurement ready
}
let lux_val = ltr303.get_lux_data().unwrap();
println!("LTR303 current lux phys: {}", lux_val.lux_phys);
FreeRtos.delay_ms(3000_u32);
}
}
For easy development, a flake.nix
is provided. Make sure you have Nix installed, as well as the flake command enabled (for example by adding experimental-features = nix-command flakes
to ~/.config/nix/nix.conf
)
and then simply run
nix develop
inside the project folder to have a complete build and development environment with all required dependencies for ltr303-rs
.