【树莓派5测评】 20.使用.net驱动的I2C设备
本帖最后由 stm1024 于 2024-4-27 22:32 编辑上次的测试演示了使用.NET的GPIO库实现对IO的输出和输入操作,这次将使用I2C设备库下的实例,演示如何使用使用I2C接口。
1. 设备介绍
首先,需要明确的是,I2C协议虽然是标准清晰的,但是不同的具体点点taptap安卓,其操作的方式不太一样,因此,在使用的时候需要使用不同的设备,好在Iot命名空间下的Device实现了很多I2C设备的操作类库,因此使用起来也是十分方便的,类库如下图所示。
可以看到,支持很多类型的设备,使用了不同的协议,这个将在后面逐步体现出来。
2. 试验对象
本次将使用BMP280点点taptap安卓作为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);
}运行效果就不截图了。
大佬牛逼:lol
学习学习
页:
[1]