В публикации Работа с GPIO в Linux. Часть 5. Device Tree overlays. Шина I2C, подключение датчиков Bosh BMx познакомились с шиной I2C и подключили датчик BME280, считывали значения через Sysfs. Теперь попробуем считать значения температуры, влажности, и атмосферного давления из .NET кода.
Оглавление
- Постановка задачи
- Подготовка устройства
- Подготовка среды запуска (ПК)
- Чтение значений датчика BME280 из .NET кода
- Литература
Постановка задачи
Подключить датчик BME280 компании Bosch Sensortec для замера физических величин: температуры, влажности, атмосферного давления. Датчик подключается к шине I2C. Реализовать программу считывания значений датчика BME280 из .NET кода.
- Плата Banana Pi BPI-M64 установлена версия Armbian_21.02.1_Bananapim64_bionic_current_5.10.12_minimal.img.xz, основана на Ubuntu 18.04.5 LTS (Bionic Beaver), ядро Linux 5.10.12. uname: Linux bananapim64 5.10.12-sunxi64 #21.02.1 SMP Wed Feb 3 20:42:58 CET 2021 aarch64 aarch64 aarch64 GNU/Linux.
Файл наложения устройств DTS для включения шины I2C
Датчик BME280 необходимо подключить к одноплатному компьютеру Banana Pi BPI-M64 согласно схеме в публикации Работа с GPIO в Linux. Часть 5. Device Tree overlays. Шина I2C, подключение датчиков Bosh BMx.
Если шина I2C не включена по умолчанию, то потребуется ее включить, используя файл DTS. Например, для Banana Pi BPI-M64 DTS-файл sun50i-a64-i2c1-on.dts включает шину I2C под номером «1». Как это сделать рассмотрено в указанной выше публикации.
После включения шины I2C и подключения датчика BME280 необходимо убедиться, что все работает и датчик отзывается. Для этого необходимо установить утилиту i2c-tools , которая производит поиск всех устройств подключенных к шине I2C. Выполним поиск всех I2C устройств на шине I2C порт «1» командой: sudo i2cdetect -y 1 .
root@bananapim64:~# sudo i2cdetect -y 1 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- 76 -- root@bananapim64:~#
Шина I2C работает и датчик BME280 по адресу 0x76 найден. Теперь можно переходить к .NET коду.
Подготовка устройства
На плате Banana Pi BPI-M64 должна быть установлена платформа .NET Runtime 5.0 и отладчик vsdbg, как это сделать указано в публикации Удаленная отладка приложения на .NET 5.0 в Visual Studio Code для ARM на примере Banana Pi BPI-M64 и Cubietruck (Armbian, Linux).
Подготовка среды запуска (ПК)
Отладку будем запускать из среды Visual Studio Code на ПК под ОС Windows 7. Как установить и настроить среду в публикации Создание первого приложения на .NET 5.0 в Visual Studio Code для ARM.
Чтение значений датчика BME280 из .NET кода
Создадим .NET 5.0 консольное приложение — dotnet-iot-bme280. Добавим Nuget-пакеты System.Device.Gpio и Iot.Device.Bindings. Для работы с шиной I2C предназначено пространство имен: System.Device.I2c. Для датчика BME280 пространство имен: Iot.Device.Bmxx80. В качестве основы возьмем пример GitHub Bmxx80/samples.
Разместим в Program.cs следующий программный код, в котором инициализируем датчик BME280 и считаем значения физических величин:
static void Main(string[] args) { Console.WriteLine("BME280!"); const int busId = 1; //Bme280.DefaultI2cAddress or Bme280.SecondaryI2cAddress var i2cSettings = new I2cConnectionSettings(busId, Bme280.SecondaryI2cAddress); var i2cDevice = I2cDevice.Create(i2cSettings); var bme280 = new Bme280(i2cDevice) { // set higher sampling TemperatureSampling = Sampling.UltraHighResolution, PressureSampling = Sampling.UltraHighResolution, HumiditySampling = Sampling.UltraHighResolution, FilterMode = Bmx280FilteringMode.X2 }; //Read data. Perform a synchronous measurement var readResult = bme280.Read(); // Console.WriteLine($"Temperature: {Math.Round((double)readResult.Temperature?.DegreesCelsius, 2, MidpointRounding.AwayFromZero)} \u00B0C"); Console.WriteLine($"Pressure: {Math.Round((double)(readResult.Pressure?.Hectopascals), 2, MidpointRounding.AwayFromZero)} hPa"); Console.WriteLine($" {Math.Round((double)(readResult.Pressure?.MillimetersOfMercury), 2, MidpointRounding.AwayFromZero)} mmHg"); Console.WriteLine($"Relative humidity: {Math.Round((double)readResult.Humidity?.Percent, 0, MidpointRounding.AwayFromZero)}%"); // bme280.Dispose(); i2cDevice.Dispose(); }
Разберем пример:
Класс I2cConnectionSettings предназначен для задания настроек I2C устройства, первый аргумент — Id шины I2C, второй аргумент — адрес датчика I2C. В классе Bmx280Base определены константы адреса BME280:
// Default I2C bus address. public const byte DefaultI2cAddress = 119; // Secondary I2C bus address. public const byte SecondaryI2cAddress = 118;
Значение Sampling.UltraHighResolution задает максимальную точность замера физических величин. Данный параметр изменяет значение передискретизации. При любых замерах физических величин будет присутствовать шум, приводящий к искажению показаний. При увеличении данного значения, влияния шумов будет нивелироваться.
Значение Bmx280FilteringMode.X2, возможны значения X2, X4, X4, X16. Степень фильтрации данных, не путать с точностью. При замерах температуры возможна ситуация кратковременного дуновения теплого или холодного воздуха на датчик, при открытии двери. В результате, в этот момент времени датчик может показать значительно отличающуюся температуру по отношению к окружающей среде. Для исключения подобных ситуаций, данный параметр регулирует количество замеров, которые будут усреднены. Соответственно, чем больше количество замеров, тем более точная будет температура. Но необходимо помнить, что увеличение данного значения увеличит время замера показаний.
Если использовать файл DTS sun50i-a64-i2c1-bme280.dts, который включает шину I2C и включает драйвер получения данных с BME280 через ФС SysFs, и одновременно получать данные из .NET кода, то все это работает без ошибок.
Демонстрация работы программного кода
Запуск проекта dotnet-iot-bme280 в Visual Studio Code, удаленная отладка на плате Banana Pi BPI-M64
Приложение dotnet-iot-bme280.png на GitHub — .NET IoT Samples.