I²C 传感器读取练习
在本练习中,我们将学习如何读取 I²C 总线上的传感器。
Rust ESP 开发板上有两个可以通过 I²C 总线读取的传感器:
外设 | 型号 | 参考资料 | Crate | 地址 |
---|---|---|---|---|
IMU | ICM-42670-P | Datasheet | Link | 0x68 |
温湿度 | SHTC3 | Datasheet | Link | 0x70 |
任务是使用 crates.io 的现有驱动程序通过 I²C 读取温湿度传感器。之后,使用 shared-bus
通过同一 I²C 总线读取第二个传感器。
第一部分:读取温湿度
创建温湿度传感器 SHTC3 的实例,每 600 毫秒读取并打印湿度和温度值。
i2c-sensor-reading/examples/part_1.rs
包含第一部分的解答。要运行第一部分的解答:
cargo run --example part_1
i2c-sensor-reading/src/main.rs
包含代码框架,其中已经包含了第一部分所需的导入语句。
步骤:
✅ 进入 i2c-sensor-reading/
目录,使用以下命令打开相关文档:
cargo doc --open
✅ 定义两个引脚,一个作为 SDA,一个作为 SCL。
信号 | GPIO |
---|---|
SDA | GPIO10 |
SCL | GPIO8 |
✅ 借助刚刚生成的文档,创建一个 I²C 外设的实例。频率使用 400 kHz。
✅ 使用驱动 crate shtcx
,创建一个 SHTC3 传感器实例,将 I²C 实例传递给它们。查看文档以获取指导。
✅ 要检查传感器是否被正确寻址,可以读取它的设备 ID 并打印该值。
期望的输出:
Device ID SHTC3: 71
✅ 进行测量,读取传感器值并打印出来。查看文档以获取有关传感器的方法的指导。
期望的输出:
TEMP: [当地温度] °C
HUM: [当地湿度] %
❗ 一些传感器在测量和读取结果之间需要一点时间。 ❗ 注意数值单位!
💡 有一些方法可以将传感器值转换为所需的单位。
第二部分:读取加速度计数据
使用总线管理器,驱动第二个传感器。读出它的值并打印两个传感器的值。
从第一部分你自己的解答开始。或者也可以从第一部分提供的部分解答开始:i2c-sensor-reading/examples/part_1.rs
。
i2c-sensor-reading/examples/part_2.rs
包含第二部分的解答。如果你需要帮助,可以参考它。要运行它,使用:
cargo run --example part_2
步骤
✅ 导入 ICM42670p 的驱动 crate。
#![allow(unused)] fn main() { use icm42670::{Address, Icm42670, PowerMode as imuPowerMode}; }
✅ 创建传感器的实例。
✅ 为什么将同一个 I²C 实例传递给两个传感器不管用,尽管它们都在同一个 I²C 总线上?
解答
这是一个所有权问题。内存中的每个位置都需要归某物所有。如果我们将 I²C 总线传递给 SHTC3,则该传感器拥有 I²C 总线。且它不能再由另一个传感器拥有,借用也是不可能的,因为 I²C 总线需要可变,两个传感器都需要能够改变它。我们通过引入总线管理器来解决这个问题,该管理器创建多个 I²C 总线的代理。这些代理可以由相应的传感器拥有。
✅ 导入总线管理器 crate。
#![allow(unused)] fn main() { use shared_bus::BusManagerSimple; }
✅ 创建一个简单的总线管理器的实例。创建两个代理,并用它们代替原来的 I²C 实例传递给传感器。
✅ 从两个传感器读取并打印设备 ID。
期望的输出:
Device ID SHTC3: 71
Device ID ICM42670p: 96
✅ 在低噪声模式下启动 ICM42670p。
✅ 读取陀螺仪传感器值,并将它们与温度和湿度值一起打印,精确到小数点后两位。
期望的输出:
GYRO: X: 0.00 Y: 0.00 Z: 0:00
TEMP: [当地温度] °C
HUM: [当地湿度] %
Simulation
This project is available for simulation through two methods:
- Wokwi projects
- Wokwi files are also present in the project folder to simulate it with Wokwi VS Code extension:
- Press F1, select
Wokwi: Select Config File
and chooseadvanced/i2c-sensor-reading/wokwi.toml
- Edit the
wokwi.toml
file to select between exercise and solutions simulation
- Edit the
- Build you project
- Press F1 again and select
Wokwi: Start Simulator
- Press F1, select
When simulating this project, expect the following hardcoded values: TEMP: 24.61 °C | HUM: 36.65 % | GYRO: X= 0.00 Y= 0.00 Z= 0.00