Ler condições ambientais com um sensor

Um dos cenários mais comuns para dispositivos IoT é a detecção de condições ambientais. Uma variedade de sensores estão disponíveis para monitorar temperatura, umidade, pressão barométrica e muito mais.

Neste tópico, você usará o .NET para ler as condições ambientais de um sensor.

Pré-requisitos

  • SBC (computador de placa única) baseado em ARM (ARMv7 ou superior)
  • Breakout do sensor de umidade/pressão barométrica/temperatura BME280
  • Cabos de jumper
  • Breadboard (opcional)
  • Placa de contato impresso GPIO do Raspberry Pi (opcional)
  • .NET SDK 7 ou posterior

Observação

Este tutorial foi escrito supondo que o dispositivo de destino seja o Raspberry Pi. No entanto, este tutorial pode ser usado para qualquer SBC baseado em Linux com suporte para .NET, como Orange Pi, ODROID e muito mais.

Importante

Há muitos outros fabricantes de placas de contato impresso BME280. A maioria dos designs são semelhantes, e o fabricante não deve fazer nenhuma diferença na funcionalidade. Este tutorial tenta considerar as variações. Verifique se a placa de contato BME280 inclui uma interface I2C (interintegrada).

Componentes como breakouts BME280 geralmente são vendidos com cabeçalhos de marcação não soldados. Se você estiver desconfortável com a soldagem, procure uma placa de breakout BME280 com um cabeçalho pré-soldado ou um conector diferente. Se quiser, considere aprender a soldar! Aqui temos um bom guia para iniciantes sobre soldagem.

Preparar o SBC

Verifique se o SBC está configurado para dar suporte aos seguintes serviços:

  • SSH
  • I2C

Para muitos dispositivos, nenhuma configuração adicional é necessária. Para Raspberry Pi, use o comando raspi-config. Para obter mais informações sobre raspi-config, consulte a Documentação do Raspberry Pi.

Preparar o hardware

Use os componentes de hardware para construir o circuito conforme ilustrado no diagrama a seguir:

Um diagrama Fritzing mostrando a conexão do Raspberry Pi à placa de breakout BME280

Veja a seguir as conexões do Raspberry Pi com o breakout BME280. Observe que os rótulos de fixação diferem em vários breakouts BME280.

Raspberry Pi Breakout BME280 Color
3,3V VIN/3V3 vermelha
Terra GND black
SDA (GPIO 2) SDI/SDA blue
SCL (GPIO 3) SCK/SCL orange

Consulte o seguinte diagrama de pinagem conforme necessário:

Um diagrama mostrando a pinagem do cabeçalho Raspberry Pi GPIO. Imagem cortesia da Fundação Raspberry Pi.
Imagem cortesia da Raspberry Pi Foundation.

Dica

Recomenda-se uma placa de fuga GPIO com uma placa de ensaio para simplificar as conexões com o cabeçalho GPIO.

Criar o aplicativo

Siga estas etapas em seu ambiente de desenvolvimento preferencial:

  1. Crie um aplicativo de console .NET usando a CLI do .NET ou o Visual Studio. Nomeie-o SensorTutorial.

    dotnet new console -o SensorTutorial
    cd SensorTutorial
    
  2. Adicione o pacote Iot.Device.Bindings ao projeto. Use a CLI do .NET no diretório do projeto ou no Visual Studio.

    dotnet add package Iot.Device.Bindings --version 2.2.0-*
    
  3. Substitua o conteúdo do Program.cs pelo seguinte código:

    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);
    }
    

    No código anterior:

    • i2cSettings é definido como uma nova instância de I2cConnectionSettings. O construtor define o parâmetro busId como 1 e o parâmetro deviceAddress como Bme280.DefaultI2cAddress.

      Importante

      Alguns fabricantes de breakout BME280 usam o valor de endereço secundário. Para esses dispositivos, use Bme280.SecondaryI2cAddress.

    • Uma declaração using cria uma instância de I2cDevice chamando I2cDevice.Create e passando por i2cSettings. Esse I2cDevice representa o barramento I2C. A declaração using garante que o objeto seja descartado e os recursos de hardware sejam liberados corretamente.

    • Outra declaração using cria uma instância de Bme280 para representar o sensor. O I2cDevice é passado pelo construtor.

    • O tempo necessário para que o chip faça medidas com as configurações atuais (padrão) do chip é recuperado chamando GetMeasurementDuration.

    • Um loop de while é executado indefinidamente. Cada iteração:

      1. Limpa o console.

      2. Define o modo de energia como Bmx280PowerMode.Forced. Isso força o chip a executar uma medida, armazenar os resultados e, em seguida, entra em modo de suspensão.

      3. Lê os valores de temperatura, pressão, umidade e altitude.

        Observação

        A altitude é calculada pela associação do dispositivo. Essa sobrecarga de TryReadAltitude usa a pressão média do nível do mar para gerar uma estimativa.

      4. Grava as condições ambientais atuais no console.

      5. Entra em modo de suspensão após 1000 ms.

  4. Crie o aplicativo. Ao usar a CLI do .NET, execute dotnet build. Para criar no Visual Studio, pressione Ctrl+Shift+B.

  5. Implante o aplicativo no SBC como um aplicativo autônomo. Para obter instruções, confira Implantar aplicativos .NET no Raspberry Pi . Dê a permissão de execução ao executável usando chmod +x.

  6. Execute o aplicativo no Raspberry Pi alternando para o diretório de implantação e executando o executável.

    ./SensorTutorial
    

    Observe a saída do sensor no console.

  7. Encerre o programa pressionando Ctrl+C .

Parabéns! Você usou I2C para ler valores de um sensor de temperatura/umidade/pressão barométrica!

Obter o código-fonte

A fonte deste tutorial está disponível no GitHub.

Próximas etapas