[评测分享]
【树莓派5测评】 20.使用.net驱动的I2C设备
#板卡评测
3493 人阅读
|
1 人回复
|
2024-04-27
TA的每日心情 | 慵懒 2025-8-6 21:07 |
|---|
签到天数: 313 天 连续签到: 1 天 [LV.8]以坛为家I
状元
- 积分
- 5300
|
本帖最后由 stm1024 于 2024-4-27 22:32 编辑
上次的测试演示了使用.NET的GPIO库实现对IO的输出和输入操作,这次将使用I2C设备库下的实例,演示如何使用使用I2C接口。
1. 设备介绍
首先,需要明确的是,I2C协议虽然是标准清晰的,但是不同的具体芯片,其操作的方式不太一样,因此,在使用的时候需要使用不同的设备,好在Iot命名空间下的Device实现了很多I2C设备的操作类库,因此使用起来也是十分方便的,类库如下图所示。
可以看到,支持很多类型的设备,使用了不同的协议,这个将在后面逐步体现出来。
2. 试验对象
本次将使用BMP280芯片作为I2C具体设备的应用,该模块在某宝上有很多,价格也很便宜,图片如下:
我们先将其硬线连接好,此外,在resp-config中确认I2C接口是打开的,这个就不细说了。
首先通过i2cdetect检查硬线连接情况:
可知连接正常,而且BMP280的i2c地址是0x76。
然后在VSCode中编写代码,Program.cs中的代码如下:- using System;
- using System.Device.I2c;
- using Iot.Device.Bmxx80;
- using Iot.Device.Bmxx80.PowerMode;
- //notice here
- I2cConnectionSettings setting = new I2cConnectionSettings(1, Bmp280.SecondaryI2cAddress);
- I2cDevice i2cDev = I2cDevice.Create(setting);
- Bmp280 bmp280 = new Bmp280(i2cDev);
- int mTime = bmp280.GetMeasurementDuration();
- bmp280.SetPowerMode(Bmx280PowerMode.Forced);
- while (true)
- {
- Thread.Sleep(mTime);
- bmp280.TryReadTemperature(out var tempValue);
- bmp280.TryReadPressure(out var preValue);
- bmp280.TryReadAltitude(out var altValue);
- Console.WriteLine(DateTime.Now);
- Console.WriteLine([ DISCUZ_CODE_0 ]quot;\tTemperature: {tempValue.DegreesCelsius:0.#}\u00B0C");
- Console.WriteLine([ DISCUZ_CODE_0 ]quot;\tPressure: {preValue.Hectopascals:#.##} hPa");
- Console.WriteLine([ DISCUZ_CODE_0 ]quot;\tAltitude: {altValue.Meters:#} m");
- Thread.Sleep(1000);
- }
复制代码
这里对这个程序做简单的解释。I2cConnectionSettings确定是使用的I2C通道,这里使用的1,就是i2cdetect中的参数1,然后Bmp280.SecondaryI2cAddress就是BMP280器件的地址,这个地方对很多I2C器件,一般使用XXX.DefaultI2cAddress,但是,需要确认一下,我们可以通过F12追踪其定义:
可以看到,DefaultI2cAddress的值是119(0x77),而SecondaryI2cAddress的值是118(0x76),和前面i2cdetect检测结果一致,因此这里使用的是SecondaryI2cAddress,如果确定知道器件地址,也可以直接使用字面值,只是这个地方使用类的成员变量,其可读性更强。
随后利用该设置创建了一个i2c设备,以及设备下的具体实例(BMP280)。
编译运行,效果如下:
可见,抛开精度有多高的事儿不谈,程序正确地显示了温度、压力和海拔高度。
另外,手头还有一个BH1750FVI,同样的方式使用,代码如下:- using System;
- using System.Threading;
- using System.Device.I2c;
- using Iot.Device.Bh1750fvi;
- I2cConnectionSettings setting = new I2cConnectionSettings(1, 0x23);
- I2cDevice i2cDev = I2cDevice.Create(setting);
- Bh1750fvi bh1750fvi = new Bh1750fvi(i2cDev);
- while (true)
- {
- Console.Clear();
- Console.WriteLine(bh1750fvi.Illuminance.Lux + " lux");
- Thread.Sleep(1000);
- }
复制代码 运行效果就不截图了。
|
|
|
|
|
|
|
|
|
TA的每日心情 | 奋斗 昨天 09:47 |
|---|
签到天数: 2254 天 连续签到: 11 天 [LV.Master]伴坛终老
司徒
- 积分
- 35209
|
沙发
流水源
发表于 2024-4-28 13:55:54
|
只看该作者
大佬牛逼
学习学习 |
|
|
|
|
|
|
|
|