3个不稳定版本

0.2.0 2024年6月25日
0.1.0 2024年3月17日

#108 in 嵌入式开发

Download history 2/week @ 2024-05-28 145/week @ 2024-06-25 1/week @ 2024-07-02

每月146次下载

MIT/Apache

185KB
2.5K SLoC

包含(压缩文件,66KB) sketch/ft232h.fzz

Rust SCD4x Crate

Version Documentation Downloads License MSRV

一个Rust crate,用于从传感器SCD4x查询CO₂浓度、温度和湿度

https://gitlab.com/claudiomattera/scd4x-rs/

此crate同时支持embedded-halembedded-hal-async

查看此项目的变更日志

用法

将依赖项添加到Cargo.toml

[dependencies.scd4x-rs]
version = "0.2.0"

可选地启用所需的特性。

特性 描述
blocking(默认) 启用阻塞式传感器Scd4x
async(默认) 启用异步传感器AsyncScd4x
std 为错误实现std::error::Error
uom 使用uom进行测量类型

可以从I²C接口和延迟函数创建一个Scd4x结构。

use scd4x_rs::Scd4x;

let i2c = ...
let delay = ...

let sensor = Scd4x::new(i2c, delay);

let mut sensor = sensor.stop_periodic_measurement()?;
sensor.reinit()?;

let serial_number = sensor.get_serial_number()?;
println!("Serial number: 0x{serial_number:x}");

let mut sensor = sensor.start_periodic_measurement()?;

for _ in 0..5 {
    println!("Waiting before next measurement");
    delay.delay_ms(5_000);

    let sample = sensor.read_measurement()?;

    println!("Sample: ┳ CO₂: {} ppm", sample.co2);
    println!("        ┣ Temperature: {} C", sample.temperature);
    println!("        ┗ Humidity: {} %", sample.humidity);

    Ok(sample)
}

let sensor = sensor.stop_periodic_measurement()?;

可以使用异步HALs使用AsyncScd4x结构。其API与Scd4x完全相同,只是在函数调用末尾添加了.await

use scd4x_rs::AsyncScd4x;

let i2c = ...
let delay = ...

let sensor = AsyncScd4x::new(i2c, delay);

let mut sensor = sensor.stop_periodic_measurement().await?;
sensor.reinit().await?;

let serial_number = sensor.get_serial_number().await?;
println!("Serial number: 0x{serial_number:x}");

let mut sensor = sensor.start_periodic_measurement().await?;

for _ in 0..5 {
    println!("Waiting before next measurement");
    delay.delay_ms(5_000);

    let sample = sensor.read_measurement().await?;

    println!("Sample: ┳ CO₂: {} ppm", sample.co2);
    println!("        ┣ Temperature: {} C", sample.temperature);
    println!("        ┗ Humidity: {} %", sample.humidity);

    Ok(sample)
}

let sensor = sensor.stop_periodic_measurement().await?;

示例

目录examples中的示例展示了如何使用此crate与Adafruit FT232H板一起使用。

将板子按如下方式连接到传感器(是的,D1和D2必须短接才能使I²C工作)。

Adafruit FT232H SCD4x
3v VIN
Gnd GND
D0 SCL
D1和D2 SDA

Connection between board Adafruit FT232H and sensor SCD4x

然后运行示例

just run-example continuous

just run-example low-power

传感器状态

该传感器采用类型状态模式实现,即其状态是类型的一部分Scd4x<..., State>。传感器可以处于两种状态:空闲或测量。只能在传感器空闲时执行的功能仅在类型Scd4x<..., Idle>上实现,只能在传感器积极测量时执行的功能仅在类型Scd4x<..., Measuring>上实现。

传感器通常使用Scd4d::new()在空闲状态下创建。调用start_periodic_measurement()start_low_power_periodic_measurement()measure_single_shot()measure_single_shot_rht_only()函数将消耗变量并返回类型为Scd4x<..., Measuring>的新变量。函数stop_periodic_measurement()将再次消耗变量并返回类型为Scd4x<..., Idle>的新变量。

或者,可以使用Scd4d::new_in_measuring()直接在测量状态下创建传感器。这在传感器在控制器休眠时被留下进行测量时非常有用。当控制器再次唤醒时,它不应再次调用start_periodic_measurement(),而应直接在测量状态下创建传感器并开始读取样本。

测量单位

默认情况下,此crate使用所有测量值(CO₂浓度、温度和湿度,以及运行量高度和压力)的f32值。当启用Cargo功能uom时,它使用来自crate uom的量。CO₂浓度值的类型为uom::si::f32::Ratio,温度值的类型为uom::si::f32::ThermodynamicTemperature,湿度值的类型为uom::si::f32::Ratio,高度值的类型为uom::si::f32::Length,压力值的类型为uom::si::f32::Pressure

许可证

版权所有 Claudio Mattera 2024

您可以在以下任一许可证的条款下自由复制、修改和分发此应用程序:带有归属

任选其一。

本项目完全是原创作品,与Sensirion无关,也不受其任何形式的赞助或支持。

依赖项