从传感器读取环境条件
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 文档。
准备硬件
使用硬件组件构建电路,如下图所示:
以下是从 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 |
根据需要,请参阅以下引脚分配关系图:
提示
建议将 GPIO 分组讨论板与试验板结合使用,以便简化与 GPIO 标头的连接。
创建应用
在首选开发环境中完成以下步骤:
使用 .NET CLI 或 Visual Studio 创建新 .Net 控制台应用。 将其命名为 SensorTutorial。
dotnet new console -o SensorTutorial cd SensorTutorial
将 Iot.Device.Bindings 包添加到项目。 使用项目目录或 Visual Studio 中的任一 .NET CLI。
dotnet add package Iot.Device.Bindings --version 2.2.0-*
将 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
循环无限期运行。 每次迭代:清除控制台。
将电源模式设置为
Bmx280PowerMode.Forced
。 这会强制芯片执行一次度量,存储结果,然后进入睡眠状态。读取温度、压力、湿度和海拔高度的值。
注意
海拔高度由设备绑定进行计算。
TryReadAltitude
的重载使用平均海平面级压力来生成估算值。将当前环境条件写入控制台。
休眠 1000 毫秒。
构建应用程序。 如果使用的是 .NET CLI,请运行
dotnet build
。 若要在 Visual Studio 中进行生成,请按 Ctrl+Shift+B。将该应用作为独立应用部署到 SBC。 有关说明,请参阅将 .NET 应用部署到 Raspberry Pi。 请确保使用
chmod +x
指定可执行的 execute 权限。通过切换到部署目录并运行可执行文件,在 Raspberry Pi 上运行该应用。
./SensorTutorial
在控制台中查看传感器输出。
按 Ctrl+C 终止程序。
恭喜! 你已使用 I2C 从温度/湿度/气压传感器读取值!
获取源代码
GitHub 上提供此教程的源。