[评测分享]
【树莓派5测评】 20.使用.net驱动的I2C设备
#板卡评测
 
3495 人阅读
|
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
|
只看该作者
 
 
 
 
 
 
大佬牛逼  
学习学习 |  
     
 
  
  
  
 
 
 | 
| 
 | 
| 
 | 
| 
 | 
 |