Leggere le condizioni ambientali da un sensore
Uno degli scenari più comuni per i dispositivi IoT è il rilevamento delle condizioni ambientali. Un'ampia gamma di sensori sono disponibili per monitorare temperatura, umidità, pressione barometrica e altro ancora.
In questo argomento si userà .NET per leggere le condizioni ambientali da un sensore.
Prerequisiti
- Computer a scheda singola (SBC) basato su ARM (ARMv7 o versione successiva)
- Interruzione del sensore BME280 umidità/pressione barometrica/temperatura
- Cavi ponticello
- Pane (facoltativo)
- Scheda di interruzione Raspberry Pi GPIO (facoltativa)
- .NET SDK 7 o versione successiva
Nota
Questa esercitazione viene scritta presupponendo che il dispositivo di destinazione sia Raspberry Pi. Questa esercitazione può tuttavia essere usata per qualsiasi SBC basato su Linux che supporta .NET, ad esempio Orange Pi, ODROID e altro ancora.
Importante
Esistono molti produttori di breakout BME280. La maggior parte dei progetti è simile e il produttore non deve fare alcuna differenza in termini di funzionalità. Questa esercitazione tenta di tenere conto delle variazioni. Assicurarsi che il breakout BME280 includa un'interfaccia I2C (Inter-Integrated Circuit).
I componenti come BME280 vengono spesso venduti con intestazioni di pin non risolte. Se si è scomodi con il soldering, cercare una scheda di interruzione BME280 con un'intestazione pres soldered o un connettore diverso. Se vuoi, prendi in considerazione come imparare a vendere! Ecco una buona guida per principianti per la vendita.
Preparare SBC
Assicurarsi che SBC sia configurato per supportare i servizi seguenti:
- SSH
- I2C
Per molti dispositivi, non è necessaria alcuna configurazione aggiuntiva. Per Raspberry Pi, usare il raspi-config
comando . Per altre informazioni su raspi-config
, vedere la documentazione di Raspberry Pi.
Preparare l'hardware
Usare i componenti hardware per compilare il circuito come illustrato nel diagramma seguente:
Di seguito sono riportate le connessioni da Raspberry Pi all'interruzione BME280. Si noti che le etichette pin differiscono in vari breakout BME280.
Raspberry Pi | Interruzione BME280 | Color |
---|---|---|
3,3 V | VIN/3V3 | rosso |
Massa | GND | black |
SDA (GPIO 2) | SDI/SDA | blue |
SCL (GPIO 3) | SCK/SCL | orange |
Fare riferimento al diagramma di pinout seguente in base alle esigenze:
Immagine di Raspberry Pi Foundation.
Suggerimento
È consigliabile semplificare le connessioni all'intestazione GPIO con una scheda di interruzione GPIO.
Creare l'app
Completare i passaggi seguenti nell'ambiente di sviluppo preferito:
Creare una nuova app console .NET usando l'interfaccia della riga di comando .NET o Visual Studio. Denominarlo SensorTutorial.
dotnet new console -o SensorTutorial cd SensorTutorial
Aggiungere il pacchetto Iot.Device.Bindings al progetto. Usare l'interfaccia della riga di comando .NET dalla directory del progetto o da Visual Studio.
dotnet add package Iot.Device.Bindings --version 2.2.0-*
Sostituire il contenuto di Program.cs con il codice seguente:
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); }
Nel codice precedente:
i2cSettings
è impostato su una nuova istanza diI2cConnectionSettings
. Il costruttore imposta ilbusId
parametro su 1 e ildeviceAddress
parametro suBme280.DefaultI2cAddress
.Importante
Alcuni produttori di interruzioni BME280 usano il valore dell'indirizzo secondario. Per questi dispositivi, usare
Bme280.SecondaryI2cAddress
.Una dichiarazione using crea un'istanza di
I2cDevice
chiamandoI2cDevice.Create
e passandoi2cSettings
. QuestoI2cDevice
rappresenta il bus I2C. Lausing
dichiarazione garantisce che l'oggetto venga eliminato e le risorse hardware vengano rilasciate correttamente.Un'altra
using
dichiarazione crea un'istanza diBme280
per rappresentare il sensore. IlI2cDevice
valore viene passato nel costruttore.Il tempo necessario per il chip per eseguire misurazioni con le impostazioni correnti del chip (impostazione predefinita) viene recuperato chiamando
GetMeasurementDuration
.Un
while
ciclo viene eseguito in modo indefinito. Ogni iterazione:Cancella la console.
Imposta la modalità di alimentazione su
Bmx280PowerMode.Forced
. Questo forza il chip a eseguire una misurazione, archiviare i risultati e quindi dormire.Legge i valori per temperatura, pressione, umidità e altitudine.
Nota
L'altitudine viene calcolata dall'associazione del dispositivo. Questo overload di
TryReadAltitude
usa la pressione media del livello del mare per generare una stima.Scrive le condizioni ambientali correnti nella console.
Dorme 1000 ms.
Compilare l'app. Se si usa l'interfaccia della riga di comando .NET, eseguire
dotnet build
. Per compilare in Visual Studio, premere CTRL+MAIUSC+B.Distribuire l'app in SBC come app autonoma. Per istruzioni, vedere Distribuire app .NET in Raspberry Pi. Assicurarsi di concedere all'eseguibile l'autorizzazione di esecuzione usando
chmod +x
.Eseguire l'app in Raspberry Pi passando alla directory di distribuzione ed eseguendo il file eseguibile.
./SensorTutorial
Osservare l'output del sensore nella console.
Terminare il programma premendo CTRL+C.
Congratulazioni! Hai usato I2C per leggere i valori da un sensore di pressione temperatura/umidità/barometrica!
Ottenere il codice sorgente
L'origine per questa esercitazione è disponibile in GitHub.