从传感器读取环境条件

IoT 设备其中最常见的一种场景是检测环境条件。 有多种传感器可用于监视温度、湿度、气压等。

在本主题中,你将使用 .NET 从传感器读取环境条件。

先决条件

  • 基于 ARM 的(ARMv7 或更高版本)单板计算机 (SBC)
  • BME280 湿度/气压/温度传感器分线板
  • 跳线
  • 线路板(可选)
  • Raspberry Pi GPIO 分线板(可选)
  • .NET SDK 7 或更高版本

注意

本教程编写时假设目标设备是 Raspberry Pi。 但是,本教程可用于支持 .NET 的任何基于 Linux 的 SBC,例如 Orange Pi、ODROID 等。

重要

BME280 分线板的制造商有很多。 大多数设计都类似,并且制造商不应对功能进行任何更改。 本教程尝试考虑差异。 确保你的 BME280 分线板包括一个内置集成电路 (I2C) 接口。

BME280 分线板等组件通常与未焊接的排针一起出售。 如果你不喜欢焊接,请查找带有预焊接排针或不同连接器的 BME280 分线板。 如果需要,可以考虑学习如何焊接! 提供了一个非常适合初学者的焊接指南

准备 SBC

确保 SBC 配置为支持以下服务:

  • SSH
  • I2C

对于许多设备,无需其他配置。 对于 Raspberry Pi,请使用 raspi-config 命令。 有关 raspi-config 的详细信息,请参阅 Raspberry Pi 文档

准备硬件

使用硬件组件构建电路,如下图所示:

该 Fritzing 关系图显示了从 Raspberry Pi 到 BME280 分线板的连接

以下是从 Raspberry Pi 到 BME280 分线板的连接。 请注意,固定标签在各种 BME280 分线板上有所不同。

Raspberry Pi BME280 分线板 Color
3.3V VIN/3V3 红色
接地 GND black
SDA (GPIO 2) SDI/SDA blue
SCL (GPIO 3) SCK/SCL orange

根据需要,请参阅以下引脚分配关系图:

显示 Raspberry Pi GPIO 标头引脚分配的关系图。图片由 Raspberry Pi 基金会提供。
图片由 Raspberry Pi 基金会提供

提示

建议将 GPIO 分组讨论板与试验板结合使用,以便简化与 GPIO 标头的连接。

创建应用

在首选开发环境中完成以下步骤:

  1. 使用 .NET CLIVisual Studio 创建新 .Net 控制台应用。 将其命名为 SensorTutorial。

    dotnet new console -o SensorTutorial
    cd SensorTutorial
    
  2. Iot.Device.Bindings 包添加到项目。 使用项目目录或 Visual Studio 中的任一 .NET CLI

    dotnet add package Iot.Device.Bindings --version 2.2.0-*
    
  3. 将 Program.cs 的内容替换为以下代码:

    using System;
    using System.Device.I2c;
    using System.Threading;
    using Iot.Device.Bmxx80;
    using Iot.Device.Bmxx80.PowerMode;
    
    var i2cSettings = new I2cConnectionSettings(1, Bme280.DefaultI2cAddress);
    using I2cDevice i2cDevice = I2cDevice.Create(i2cSettings);
    using var bme280 = new Bme280(i2cDevice);
    
    int measurementTime = bme280.GetMeasurementDuration();
    
    while (true)
    {
        Console.Clear();
    
        bme280.SetPowerMode(Bmx280PowerMode.Forced);
        Thread.Sleep(measurementTime);
    
        bme280.TryReadTemperature(out var tempValue);
        bme280.TryReadPressure(out var preValue);
        bme280.TryReadHumidity(out var humValue);
        bme280.TryReadAltitude(out var altValue);
    
        Console.WriteLine($"Temperature: {tempValue.DegreesCelsius:0.#}\u00B0C");
        Console.WriteLine($"Pressure: {preValue.Hectopascals:#.##} hPa");
        Console.WriteLine($"Relative humidity: {humValue.Percent:#.##}%");
        Console.WriteLine($"Estimated altitude: {altValue.Meters:#} m");
    
        Thread.Sleep(1000);
    }
    

    在上述代码中:

    • i2cSettings 设置为 I2cConnectionSettings 的新实例。 构造函数将 busId 参数设置为 1,将 deviceAddress 参数设置为 Bme280.DefaultI2cAddress

      重要

      一些 BME280 分线板制造商使用辅助地址值。 对于这些设备,请使用 Bme280.SecondaryI2cAddress

    • 一个 using 声明通过调用 I2cDevice.Create 并传入 i2cSettings 来创建 I2cDevice 的实例。 这个 I2cDevice 表示 I2C 总线。 using 声明可确保对象已处置,硬件资源已正确释放。

    • 另一个 using 声明创建 Bme280 的实例以表示传感器。 I2cDevice 在构造函数中传递。

    • 通过调用 GetMeasurementDuration 检索芯片使用其当前(默认)设置进行度量所需的时间。

    • while 循环无限期运行。 每次迭代:

      1. 清除控制台。

      2. 将电源模式设置为 Bmx280PowerMode.Forced。 这会强制芯片执行一次度量,存储结果,然后进入睡眠状态。

      3. 读取温度、压力、湿度和海拔高度的值。

        注意

        海拔高度由设备绑定进行计算。 TryReadAltitude 的重载使用平均海平面级压力来生成估算值。

      4. 将当前环境条件写入控制台。

      5. 休眠 1000 毫秒。

  4. 构建应用程序。 如果使用的是 .NET CLI,请运行 dotnet build。 若要在 Visual Studio 中进行生成,请按 Ctrl+Shift+B

  5. 将该应用作为独立应用部署到 SBC。 有关说明,请参阅将 .NET 应用部署到 Raspberry Pi。 请确保使用 chmod +x 指定可执行的 execute 权限。

  6. 通过切换到部署目录并运行可执行文件,在 Raspberry Pi 上运行该应用。

    ./SensorTutorial
    

    在控制台中查看传感器输出。

  7. Ctrl+C 终止程序。

恭喜! 你已使用 I2C 从温度/湿度/气压传感器读取值!

获取源代码

GitHub 上提供此教程的源。

后续步骤