1回答

0收藏

[评测分享] 【树莓派5测评】 20.使用.net驱动的I2C设备

#板卡评测 #板卡评测 3495 人阅读 | 1 人回复 | 2024-04-27

本帖最后由 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中的代码如下:
  1. using System;
  2. using System.Device.I2c;
  3. using Iot.Device.Bmxx80;
  4. using Iot.Device.Bmxx80.PowerMode;


  5. //notice here
  6. I2cConnectionSettings setting = new I2cConnectionSettings(1, Bmp280.SecondaryI2cAddress);
  7. I2cDevice i2cDev = I2cDevice.Create(setting);
  8. Bmp280 bmp280 = new Bmp280(i2cDev);

  9. int mTime = bmp280.GetMeasurementDuration();
  10. bmp280.SetPowerMode(Bmx280PowerMode.Forced);
  11. while (true)
  12. {  
  13.     Thread.Sleep(mTime);
  14.     bmp280.TryReadTemperature(out var tempValue);
  15.     bmp280.TryReadPressure(out var preValue);
  16.     bmp280.TryReadAltitude(out var altValue);
  17.     Console.WriteLine(DateTime.Now);
  18.     Console.WriteLine([        DISCUZ_CODE_0        ]quot;\tTemperature: {tempValue.DegreesCelsius:0.#}\u00B0C");
  19.     Console.WriteLine([        DISCUZ_CODE_0        ]quot;\tPressure: {preValue.Hectopascals:#.##} hPa");
  20.     Console.WriteLine([        DISCUZ_CODE_0        ]quot;\tAltitude: {altValue.Meters:#} m");
  21.     Thread.Sleep(1000);
  22. }
复制代码

这里对这个程序做简单的解释。I2cConnectionSettings确定是使用的I2C通道,这里使用的1,就是i2cdetect中的参数1,然后Bmp280.SecondaryI2cAddress就是BMP280器件的地址,这个地方对很多I2C器件,一般使用XXX.DefaultI2cAddress,但是,需要确认一下,我们可以通过F12追踪其定义:

可以看到,DefaultI2cAddress的值是119(0x77),而SecondaryI2cAddress的值是118(0x76),和前面i2cdetect检测结果一致,因此这里使用的是SecondaryI2cAddress,如果确定知道器件地址,也可以直接使用字面值,只是这个地方使用类的成员变量,其可读性更强。
随后利用该设置创建了一个i2c设备,以及设备下的具体实例(BMP280)。

编译运行,效果如下:

可见,抛开精度有多高的事儿不谈,程序正确地显示了温度、压力和海拔高度。

另外,手头还有一个BH1750FVI,同样的方式使用,代码如下:
  1. using System;
  2. using System.Threading;
  3. using System.Device.I2c;
  4. using Iot.Device.Bh1750fvi;
  5. I2cConnectionSettings setting = new I2cConnectionSettings(1, 0x23);
  6. I2cDevice i2cDev = I2cDevice.Create(setting);
  7. Bh1750fvi bh1750fvi = new Bh1750fvi(i2cDev);
  8. while (true)
  9. {
  10. Console.Clear();
  11. Console.WriteLine(bh1750fvi.Illuminance.Lux + " lux");
  12. Thread.Sleep(1000);
  13. }
复制代码
运行效果就不截图了。



分享到:
回复

使用道具 举报

回答|共 1 个

倒序浏览

沙发

流水源

发表于 2024-4-28 13:55:54 | 只看该作者

大佬牛逼
学习学习
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

5300 积分
55 主题
+ 关注
热门推荐
关闭

站长推荐上一条 /3 下一条