Skip to main content

bh1750_embedded/
lib.rs

1//! no_std driver for the BH1750 / BH1750FVI ambient light sensor.
2//!
3//! `bh1750-embedded` is a small, `no_std` driver built on top of the
4//! [`embedded-hal`](https://crates.io/crates/embedded-hal) traits.
5//!
6//! This crate is a clean reimplementation based on the existing Rust crate:
7//! - `bh1750` by Jona Wilmsmann: <https://github.com/jona-wilmsmann/bh1750-rs>
8//!
9//! ## What this crate provides
10//! - A blocking driver: [`Bh1750`]
11//! - Resolution/mode selection via [`Resolution`]
12//! - MTreg (measurement time) tuning via [`MeasurementTime`]
13//! - Optional async API behind the `async` feature: [`r#async::Bh1750Async`]
14//!
15//! ## Blocking usage
16//!
17//! ```
18//! use bh1750_embedded::{Address, Bh1750, Error, Resolution};
19//!
20//! fn example<I2C, D, E>(i2c: I2C, delay: D) -> Result<(), Error<E>>
21//! where
22//!     I2C: embedded_hal::i2c::I2c<Error = E>,
23//!     D: embedded_hal::delay::DelayNs,
24//!     E: embedded_hal::i2c::Error,
25//! {
26//!     let mut sensor = Bh1750::new(i2c, delay, Address::Low);
27//!
28//!     // One-shot measurement (driver waits long enough before reading):
29//!     let _lux = sensor.one_time_measurement(Resolution::High)?;
30//!     Ok(())
31//! }
32//! ```
33//!
34//! ## Continuous mode
35//!
36//! ```
37//! use bh1750_embedded::{Address, Bh1750, Error, Resolution};
38//!
39//! fn example<I2C, D, E>(i2c: I2C, delay: D) -> Result<(), Error<E>>
40//! where
41//!     I2C: embedded_hal::i2c::I2c<Error = E>,
42//!     D: embedded_hal::delay::DelayNs,
43//!     E: embedded_hal::i2c::Error,
44//! {
45//!     let mut sensor = Bh1750::new(i2c, delay, Address::Low);
46//!     sensor.start_continuous_measurement(Resolution::High)?;
47//!
48//!     // Wait approximately the measurement time before reading.
49//!     let _ms = sensor.typical_measurement_time_ms(Resolution::High);
50//!     let _lux = sensor.current_measurement_lux(Resolution::High)?;
51//!     Ok(())
52//! }
53//! ```
54//!
55//! ## Async usage
56//!
57//! Enable the `async` feature to use the async driver API in [`r#async`].
58//!
59//! ```
60//! # fn main() {}
61//! #
62//! # #[cfg(feature = "async")]
63//! # mod async_example {
64//! use bh1750_embedded::{Address, Error, Resolution};
65//! use bh1750_embedded::r#async::Bh1750Async;
66//!
67//! pub async fn example<I2C, D, E>(i2c: I2C, delay: D) -> Result<(), Error<E>>
68//! where
69//!     I2C: embedded_hal_async::i2c::I2c<Error = E>,
70//!     D: embedded_hal_async::delay::DelayNs,
71//!     E: embedded_hal::i2c::Error,
72//! {
73//!     let mut sensor = Bh1750Async::new(i2c, delay, Address::Low);
74//!     let _lux = sensor.one_time_measurement(Resolution::High).await?;
75//!     Ok(())
76//! }
77//! # }
78//! ```
79
80#![no_std]
81#![deny(unsafe_code)]
82#![deny(missing_docs)]
83
84#[cfg(test)]
85extern crate std;
86
87mod error;
88mod types;
89
90mod bh1750;
91pub use bh1750::Bh1750;
92
93pub use error::Error;
94pub use types::{Address, MeasurementTime, Resolution};
95
96#[cfg(feature = "async")]
97pub mod r#async;