查看: 359|回复: 1

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

[复制链接]
  • TA的每日心情
    慵懒
    前天 22:36
  • 签到天数: 88 天

    连续签到: 1 天

    [LV.6]常住居民II

    发表于 2024-4-27 22:00:05 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 stm1024 于 2024-4-27 22:32 编辑

    上次的测试演示了使用.NET的GPIO库实现对IO的输出和输入操作,这次将使用I2C设备库下的实例,演示如何使用使用I2C接口。
    1. 设备介绍
    首先,需要明确的是,I2C协议虽然是标准清晰的,但是不同的具体芯片,其操作的方式不太一样,因此,在使用的时候需要使用不同的设备,好在Iot命名空间下的Device实现了很多I2C设备的操作类库,因此使用起来也是十分方便的,类库如下图所示。
    000.jpg

    可以看到,支持很多类型的设备,使用了不同的协议,这个将在后面逐步体现出来。

    2. 试验对象
    本次将使用BMP280芯片作为I2C具体设备的应用,该模块在某宝上有很多,价格也很便宜,图片如下:
    111.jpg

    我们先将其硬线连接好,此外,在resp-config中确认I2C接口是打开的,这个就不细说了。
    首先通过i2cdetect检查硬线连接情况:
    333.jpg

    可知连接正常,而且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. }
    复制代码
    888.jpg

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

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

    编译运行,效果如下:
    999.jpg

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

    另外,手头还有一个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. }
    复制代码
    运行效果就不截图了。



    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    昨天 00:08
  • 签到天数: 1787 天

    连续签到: 47 天

    [LV.Master]伴坛终老

    发表于 2024-4-28 13:55:54 | 显示全部楼层
    大佬牛逼
    学习学习
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

    手机版|小黑屋|与非网

    GMT+8, 2024-5-10 09:06 , Processed in 0.130601 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.