Считывание с датчика условий окружающей среды

Одним из наиболее распространенных сценариев использования устройств Интернета вещей является определение условий окружающей среды. Существует множество датчиков для отслеживания температуры, влажности, атмосферного давления и многих других показаний.

В этом разделе вы будете использовать .NET для считывания с датчика условий окружающей среды.

Предварительные требования

  • Однопанерный компьютер (SBC) на основе ARM (ARMv7 или более поздней версии)
  • Коммутационная плата BME280 датчика влажности, давления, температуры
  • оптоволоконные кабеля с разъемами на обоих концах;
  • Монтажная плата (необязательно)
  • Коммутационная плата GPIO Raspberry Pi (необязательно)
  • Пакет SDK для .NET 7 или более поздней версии

Примечание

В этом руководстве предполагается, что целевым устройством является Raspberry Pi. Однако это руководство можно использовать для любого SBC под управлением Linux, поддерживающего .NET, например 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 Breakout Цвет
3,3 В VIN/3V3 красный
Заземление GND black
SDA (GPIO 2) SDI/SDA blue
SCL (GPIO 3) SCK/SCL orange

При необходимости смотрите следующую схему контактов:

Диаграмма, показывающая схему контактов верхнего контактного ряда GPIO Raspberry Pi. Изображение взято с Raspberry Pi Foundation.
Изображение взято с Raspberry Pi Foundation.

Совет

Для упрощения подключения к заголовку GPIO рекомендуется использовать коммутационную плату GPIO в сочетании с монтажной платой для макетирования или тестирования.

Создайте приложение

Выполните следующие действия в предпочитаемой среде разработки.

  1. Создайте консольное приложение .NET с помощью .NET CLI или Visual Studio. Назовите его SensorTutorial.

    dotnet new console -o SensorTutorial
    cd SensorTutorial
    
  2. Добавьте пакет Iot.Device.Bindings в проект. Используйте либо .NET CLI из каталога проекта, либо Visual Studio.

    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 путем вызова I2cDevice.Create и передачи i2cSettings. Представляет I2cDevice собой шину I2C. Объявление using гарантирует, что объект удален и аппаратные ресурсы освобождены должным образом.

    • Другое объявление using создает экземпляр Bme280 для представления датчика. I2cDevice передается конструктору.

    • Время, необходимое микросхеме для выполнения измерений с текущими параметрами микросхемы (заданными по умолчанию), определяется путем вызова GetMeasurementDuration.

    • Цикл while выполняется бесконечно. Каждая итерация:

      1. Очищает окно консоли.

      2. Задает режим питания Bmx280PowerMode.Forced. В этом случае микросхема проводит одно измерение, сохраняет результаты, а затем переходит в спящий режим.

      3. Считывает значения температуры, давления, влажности и высоты над уровнем моря.

        Примечание

        Высота над уровнем моря вычисляется привязкой устройства. Для получения оценки эта перегрузка метода TryReadAltitude использует среднее значение давления на уровне моря.

      4. Записывает текущие условия среды в консоль.

      5. Переходит в спящий режим на 1000 мс.

  4. Построение приложения. При использовании интерфейса командной строки .NET выполните команду dotnet build. Чтобы выполнить сборку в Visual Studio, нажмите клавиши CTRL+SHIFT+B.

  5. Разверните приложение в SBC как автономное приложение. Инструкции см. в статье Развертывание приложений .NET в Raspberry Pi. Обязательно предоставьте исполняемому файлу разрешение execute с помощью chmod +x.

  6. Запустите приложение на устройстве Raspberry Pi, перейдя в каталог развертывания и запустив исполняемый файл.

    ./SensorTutorial
    

    Наблюдайте за выходными данными датчика в консоли.

  7. Завершите выполнение программы, нажав сочетание клавиш CTRL+C.

Поздравляем! Вы использовали I2C для считывания значений с датчика температуры, влажности и барометрического давления!

Получение исходного кода

Исходный код для этого учебника доступен на сайте GitHub.

Дальнейшие действия