Leer condiciones ambientales de un sensor
Uno de los escenarios más comunes para los dispositivos IoT es la detección de condiciones ambientales. Existen varios sensores disponibles para supervisar la temperatura, la humedad, la presión barométrica y mucho más.
En este tema, usará .NET para leer desde un sensor las condiciones ambientales.
Requisitos previos
- Equipo de placa única (SBC) basado en ARM (ARMv7 o superior)
- Placa adaptadora BME280 de sensor de humedad, presión barométrica y temperatura
- Cables de puente
- Placa de pruebas (opcional)
- Placa adaptadora GPIO de Raspberry Pi (opcional)
- SDK de .NET 7 o versiones posteriores.
Nota
En este tutorial se supone que el dispositivo de destino es Raspberry Pi. Sin embargo, se puede usar con cualquier equipo SBC basado en Linux que admita .NET, como Orange Pi, ODROID, etc.
Importante
Hay muchos fabricantes de placas adaptadoras BME280. La mayoría de los diseños son similares y el fabricante no debería suponer ninguna diferencia con respecto a la funcionalidad. En este tutorial se intenta tener en cuenta las variaciones. Asegúrese de que la placa BME280 incluye una interfaz de circuito inter-integrado (I2C).
Por lo general, los componentes como los sensores BME280 se venden con cabezales de bornes sin soldar. En caso de que prefiera no tener que soldar, busque una placa adaptadora BME280 que tenga un cabezal presoldado o un conector distinto. También podría valorar la posibilidad de aprender a soldar. Esta es una buena guía para principiantes sobre cómo soldar.
Preparación del equipo SBC
Asegúrese de que el equipo SBC esté configurado para admitir los siguientes servicios:
- SSH
- I2C
En muchos dispositivos, no se requiere ninguna configuración adicional. En Raspberry Pi, use el comando raspi-config
. Para obtener más información sobre raspi-config
, consulte la documentación de Raspberry Pi.
Preparación del hardware
Use los componentes de hardware para crear el circuito como se muestra en el diagrama siguiente:
A continuación se indican las conexiones desde Raspberry Pi a la placa adaptadora BME280. Tenga en cuenta que las etiquetas de anclaje difieren en las placas adaptadoras BME280.
Raspberry Pi | Placa adaptadora BME280 | Color |
---|---|---|
3,3 V | VIN/3V3 | rojo |
Tierra | GND | black |
SDA (GPIO 2) | SDI/SDA | blue |
SCL (GPIO 3) | SCK/SCL | orange |
Consulte el siguiente diagrama de pines según sea necesario:
Imagen de Raspberry Pi Foundation.
Sugerencia
Se recomienda una placa de pruebas de GPIO junto con una placa para optimizar las conexiones con el encabezado de GPIO.
Creación de la aplicación
Complete los pasos siguientes en el entorno de desarrollo que prefiera:
Cree una aplicación de consola de .NET mediante la CLI de .NET o Visual Studio. Asígnele el nombre SensorTutorial.
dotnet new console -o SensorTutorial cd SensorTutorial
Agregue el paquete Iot.Device.Bindings al proyecto. Use la CLI de .NET desde el directorio del proyecto o Visual Studio.
dotnet add package Iot.Device.Bindings --version 2.2.0-*
Reemplace el contenido de Program.cs por el código siguiente:
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); }
En el código anterior:
i2cSettings
se establece en una instancia nueva deI2cConnectionSettings
. El constructor establece el parámetrobusId
en 1 y el parámetrodeviceAddress
enBme280.DefaultI2cAddress
.Importante
Algunos fabricantes de placas BME280 usan el valor de dirección secundaria. Para estos dispositivos, use
Bme280.SecondaryI2cAddress
.Una declaración using crea una instancia de
I2cDevice
mediante una llamada aI2cDevice.Create
y pasandoi2cSettings
. Este elementoI2cDevice
representa el bus I2C. La declaraciónusing
garantiza que el objeto se deseche y que los recursos de hardware se liberen correctamente.Otra declaración
using
crea una instancia deBme280
para representar el sensor.I2cDevice
se pasa en el constructor.El tiempo necesario para que el chip tome medidas con la configuración actual del chip (la predeterminada) se recupera mediante una llamada a
GetMeasurementDuration
.Se ejecuta un bucle
while
indefinidamente. En cada iteración:Se borra la consola.
Se establece el modo de energía en
Bmx280PowerMode.Forced
. Esto obliga al chip a tomar una medida, almacenar los resultados y, después, entrar en suspensión.Se leen los valores de temperatura, presión, humedad y altitud.
Nota
La altitud se calcula mediante el enlace del dispositivo. Esta sobrecarga de
TryReadAltitude
utiliza la presión media a nivel del mar para generar una estimación.Se escriben las condiciones ambientales actuales en la consola.
Se suspende durante 1000 ms.
Compile la aplicación. Si usa la CLI de .NET, ejecute
dotnet build
. Para realizar la compilación en Visual Studio, presione Ctrl+Mayús+B.Implemente la aplicación en el equipo SBC como una aplicación independiente. Para obtener instrucciones, vea Implementación de aplicaciones .NET en Raspberry Pi. Asegúrese de conceder el permiso execute ejecutable mediante
chmod +x
.Para ejecutar la aplicación en Raspberry Pi, cambie al directorio de implementación y ejecute el archivo ejecutable.
./SensorTutorial
Observe la salida del sensor en la consola.
Para finalizar el programa, presione Ctrl+C.
Felicidades. Ha usado I2C para leer valores de un sensor de temperatura, humedad y presión barométrica.
Obtención del código fuente
El código fuente de este tutorial está disponible en GitHub.