Station météo avancée v2.0 : Surveillance en temps réel de température, pression, humidité et altitude
Histoire
En utilisant le kit de démarrage Adafruit pour Windows 10 IoT Core sur un Raspberry Pi 2, ce projet montre comment interfacer un capteur BME280 (ou BMP280) pour lire des données environnementales et les publier vers un service cloud.
Si vous possédez un BMP280, suivez plutôt le guide Weather Station v1 : Weather Station v1.
Matériel
Connectez le Raspberry Pi 2 à une plaque d'essai et câblez le capteur BME280 selon le diagramme Fritzing dans la section « Schémas » ci-dessous.
Logiciel
Téléchargez le code de départ depuis GitHub – ms‑iot/adafruitsample. Nous vous guiderons pour ajouter le code nécessaire pour communiquer avec le capteur et publier vos relevés.
Ouvrez Lesson_203v2\StartSolution\lesson_203v2.sln et éditez mainpage.xaml.cs.
Une version entièrement complétée est disponible à Lesson_203v2\FullSolution\lesson_203v2.sln.
MainPage.xaml.cs
Ajoutez une référence à la classe BME280 :
public sealed partial class MainPage : Page {
// Créer un nouvel objet pour notre classe capteur
BME280 BME280;
}
Initialisez le capteur dans OnNavigatedTo :
// Créer un nouvel objet pour notre classe capteur
BME280 = new BME280Sensor();
// Initialiser le capteur
await BME280.Initialize();
Ensuite, ajoutez le code pour collecter et journaliser les données :
- Créez des variables pour température, pression, humidité et altitude, initialisées à 0.
- Définissez une constante de pression au niveau de la mer (par défaut 1013,25 hPa).
- Lisez les quatre mesures dix fois et affichez-les dans la console de débogage.
// Initialiser à 0
float temp = 0;
float pressure = 0;
float altitude = 0;
float humidity = 0;
// Constante pour pression au niveau de la mer
const float seaLevelPressure = 1022.00f;
// Lire 10 échantillons
for (int i = 0; i < 10; i++) {
temp = await BME280.ReadTemperature();
pressure = await BME280.ReadPreasure();
altitude = await BME280.ReadAltitude(seaLevelPressure);
humidity = await BME280.ReadHumidity();
// Écrire les valeurs dans la console de débogage
Debug.WriteLine("Température: " + temp.ToString() + " deg C");
Debug.WriteLine("Humidité: " + humidity.ToString() + " %");
Debug.WriteLine("Pression: " + pressure.ToString() + " Pa");
Debug.WriteLine("Altitude: " + altitude.ToString() + " m");
Debug.WriteLine("\n");
}
BME280.cs
Ouvrez BME280.cs et ajoutez ce qui suit après l'enum des adresses de registres :
// Chaîne pour le nom convivial du bus I2C
const string I2CControllerName = "I2C1";
// Créer un périphérique I2C
private I2cDevice bme280 = null;
// Créer nouvelles données de calibration pour le capteur
BME280_CalibrationData CalibrationData;
// Variable pour vérifier si l'appareil est initialisé
bool init = false;
Améliorez la méthode Initialize pour configurer la connexion I2C :
public async Task Initialize() {
Debug.WriteLine("BME280::Initialize");
try {
I2cConnectionSettings settings = new I2cConnectionSettings(BME280_Address);
settings.BusSpeed = I2cBusSpeed.FastMode;
string aqs = I2cDevice.GetDeviceSelector(I2CControllerName);
DeviceInformationCollection dis = await DeviceInformation.FindAllAsync(aqs);
bme280 = await I2cDevice.FromIdAsync(dis[0].Id, settings);
if (bme280 == null) {
Debug.WriteLine("Appareil non trouvé");
}
} catch (Exception e) {
Debug.WriteLine("Exception: " + e.Message + "\n" + e.StackTrace);
throw;
}
}
Ajoutez la routine Begin pour vérifier la signature du capteur et charger les données de calibration :
private async Task Begin() {
Debug.WriteLine("BME280::Begin");
byte[] WriteBuffer = new byte[] { (byte)eRegisters.BMP280_REGISTER_CHIPID };
byte[] ReadBuffer = new byte[] { 0xFF };
bmp280.WriteRead(WriteBuffer, ReadBuffer);
Debug.WriteLine("Signature BME280: " + ReadBuffer[0].ToString());
if (ReadBuffer[0] != BMP280_Signature) {
Debug.WriteLine("BMP280::Begin Signature Mismatch.");
return;
}
init = true;
CalibrationData = await ReadCoefficeints();
await WriteControlRegister();
await WriteControlRegisterHumidity();
}
Fonctions d'assistance pour registres de contrôle :
private async Task WriteControlRegisterHumidity() {
byte[] WriteBuffer = new byte[] { (byte)eRegisters.BMP280_REGISTER_CONTROLHUMID, 0x03 };
bmp280.Write(WriteBuffer);
await Task.Delay(1);
}
private async Task WriteControlRegister() {
byte[] WriteBuffer = new byte[] { (byte)eRegisters.BMP280_REGISTER_CONTROL, 0x3F };
bmp280.Write(WriteBuffer);
await Task.Delay(1);
}
Fonctions utilitaires pour lire les données des registres :
private UInt16 ReadUInt16_LittleEndian(byte register) {
UInt16 value = 0;
byte[] writeBuffer = new byte[] { 0x00 };
byte[] readBuffer = new byte[] { 0x00, 0x00 };
writeBuffer[0] = register;
bmp280.WriteRead(writeBuffer, readBuffer);
int h = readBuffer[1] << 8;
int l = readBuffer[0];
value = (UInt16)(h + l);
return value;
}
private byte ReadByte(byte register) {
byte value = 0;
byte[] writeBuffer = new byte[] { 0x00 };
byte[] readBuffer = new byte[] { 0x00 };
writeBuffer[0] = register;
bmp280.WriteRead(writeBuffer, readBuffer);
value = readBuffer[0];
return value;
}
Les fonctions de calibration et de compensation sont dérivées directement de la fiche technique BMP280 et sont déjà fournies.
Implémentez ReadTemperature pour retourner la température du capteur en degrés Celsius :
public async Task<float> ReadTemperature() {
if (!init) await Begin();
byte tmsb = ReadByte((byte)eRegisters.BMP280_REGISTER_TEMPDATA_MSB);
byte tlsb = ReadByte((byte)eRegisters.BMP280_REGISTER_TEMPDATA_LSB);
byte txlsb = ReadByte((byte)eRegisters.BMP280_REGISTER_TEMPDATA_XLSB);
Int32 t = (tmsb << 12) + (tlsb << 4) + (txlsb >> 4);
double temp = BMP280_compensate_T_double(t);
return (float)temp;
}
Complétez ReadPreasure (notez la faute de frappe d'origine ; nous la conservons pour compatibilité) :
public async Task<float> ReadPreasure() {
if (!init) await Begin();
if (t_fine == Int32.MinValue) await ReadTemperature();
byte tmsb = ReadByte((byte)eRegisters.BMP280_REGISTER_PRESSUREDATA_MSB);
byte tlsb = ReadByte((byte)eRegisters.BMP280_REGISTER_PRESSUREDATA_LSB);
byte txlsb = ReadByte((byte)eRegisters.BMP280_REGISTER_PRESSUREDATA_XLSB);
Int32 t = (tmsb << 12) + (tlsb << 4) + (txlsb >> 4);
Int64 pres = BMP280_compensate_P_Int64(t);
return ((float)pres) / 256;
}
Enfin, implémentez ReadAltitude pour calculer l'altitude en utilisant la formule barométrique :
public async Task<float> ReadAltitude(float seaLevel) {
if (!init) await Begin();
float pressure = await ReadPreasure();
pressure /= 100;
return 44330.0f * (1.0f - (float)Math.Pow((pressure / seaLevel), 0.1903f));
}
Votre projet est maintenant prêt à déployer !
Sortie attendue
Température: 24.46189 deg C
Humidité: 54.372 %
Pression: 99738.73 Pa
Altitude: 205.1726 m
Source : Weather Station V 2.0
Processus de fabrication
- Station météo solaire DIY avec Raspberry Pi
- Construction d'une station météo extérieure avec Raspberry Pi 2 et ADS‑WS1
- Construire une station météo Raspberry Pi qui envoie les données météo quotidiennes par email
- Surveillance météo à distance avec Raspberry Pi 3 et PubNub
- Intégrer votre station météo à CWOP : Guide pratique
- Moniteur météo – Station météo DIY Raspberry Pi avec upload Dropbox
- Station Météo Compacte : Arduino Nano & ESP8266 avec Capteur BMP280 et Affichage OLED/Nokia LCD
- Station Météo Arduino Portable à 10$ – Nano, DHT22, BMP180 et LCD
- eDOT : Horloge Arduino précise et station météo avec télécommande IR intégrée