Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Fortgeschrittene Wetterstation v2.0: Echtzeit Temperatur, Druck, Feuchte & Höhe Monitoring

Bauen Sie eine kompakte Wetterstation, die Temperatur, Druck, Feuchte und Höhe präzise in Ihren Wohnräumen misst.

Hintergrund

Mit dem Adafruit Starter Pack für Windows 10 IoT Core auf einem Raspberry Pi 2 zeigt dieses Projekt, wie man einen BME280 Sensor (oder BMP280) anbindet, Umweltdaten ausliest und in einen Cloud-Dienst publiziert.

Falls Sie einen BMP280 besitzen, folgen Sie stattdessen dem Weather Station v1 Guide: Weather Station v1.

Hardware

Raspberry Pi 2 mit Steckbrett verbinden und BME280 Sensor gemäß Fritzing-Diagramm im „Schematics“-Bereich unten verdrahten.

Software

Starter-Code von GitHub – ms-iot/adafruitsample herunterladen. Wir führen Sie durch das Hinzufügen des nötigen Codes für Sensor-Kommunikation und Publizieren der Messwerte.

Lesson_203v2\StartSolution\lesson_203v2.sln öffnen und mainpage.xaml.cs bearbeiten.

Eine vollendete Version liegt unter Lesson_203v2\FullSolution\lesson_203v2.sln vor.

MainPage.xaml.cs

Referenz auf BME280-Klasse hinzufügen:

public sealed partial class MainPage : Page {
    // Neues Objekt für unsere Sensor-Klasse
    BME280 BME280;
}

Sensor in OnNavigatedTo initialisieren:

// Neues Objekt für unsere Sensor-Klasse
BME280 = new BME280Sensor();
// Sensor initialisieren
await BME280.Initialize();

Code für Datenerfassung und Logging hinzufügen:

// Initialisieren auf 0
float temp = 0;
float pressure = 0;
float altitude = 0;
float humidity = 0;

// Konstante für Druck auf Meereshöhe
const float seaLevelPressure = 1022.00f;

// 10 Samples der Daten lesen
for (int i = 0; i < 10; i++) {
    temp = await BME280.ReadTemperature();
    pressure = await BME280.ReadPreasure();
    altitude = await BME280.ReadAltitude(seaLevelPressure);
    humidity = await BME280.ReadHumidity();

    // Werte in Debug-Konsole schreiben
    Debug.WriteLine("Temperature: " + temp.ToString() + " deg C");
    Debug.WriteLine("Humidity: " + humidity.ToString() + " %");
    Debug.WriteLine("Pressure: " + pressure.ToString() + " Pa");
    Debug.WriteLine("Altitude: " + altitude.ToString() + " m");
    Debug.WriteLine("\n");
}

BME280.cs

BME280.cs öffnen und nach dem Register-Adress-Enum folgendes hinzufügen:

// String für freundlichen Namen des I2C-Bus
const string I2CControllerName = "I2C1";
// I2C Device erstellen
private I2cDevice bme280 = null;
// Neue Kalibrierdaten für Sensor
BME280_CalibrationData CalibrationData;
// Variable zur Prüfung, ob Device initialisiert
bool init = false;

Initialize-Methode erweitern für I2C-Verbindungsaufbau:

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("Device not found");
        }
    } catch (Exception e) {
        Debug.WriteLine("Exception: " + e.Message + "\n" + e.StackTrace);
        throw;
    }
}

Begin-Routine hinzufügen für Sensor-Signatur-Prüfung und Kalibrierdaten-Laden:

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("BME280 Signature: " + ReadBuffer[0].ToString());
    if (ReadBuffer[0] != BMP280_Signature) {
        Debug.WriteLine("BMP280::Begin Signature Mismatch.");
        return;
    }
    init = true;
    CalibrationData = await ReadCoefficeints();
    await WriteControlRegister();
    await WriteControlRegisterHumidity();
}

Control-Register-Helper:

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

Utility-Funktionen zum Register-Auslesen:

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

Kalibrierungs- und Kompensationsfunktionen stammen direkt aus dem BMP280-Datenblatt und sind bereits enthalten.

ReadTemperature implementieren für Temperatur in Grad 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;
}

ReadPreasure vervollständigen (Original-Typo beibehalten für Kompatibilität):

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

Schließlich ReadAltitude für Höhenberechnung via Barometrischer Formel:

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

Ihr Projekt ist jetzt deploybereit!

Erwartete Ausgabe

Temperature: 24,46189 deg C

Humidity: 54,372 %

Pressure: 99738,73 Pa

Altitude: 205,1726 m

Quelle: Weather Station V 2.0

Herstellungsprozess

  1. DIY Solar-betriebene Wetterstation mit Raspberry Pi
  2. Outdoor-Wetterstation mit Raspberry Pi 2 & ADS-WS1 bauen
  3. Raspberry Pi Wetterstation bauen, die tägliche Wetterdaten per E-Mail sendet
  4. Remote-Wetterüberwachung mit Raspberry Pi 3 & PubNub
  5. Wetterstation mit CWOP integrieren: Praktischer Leitfaden
  6. Wettermonitor – DIY Raspberry Pi Wetterstation mit Dropbox-Upload
  7. Kompakte Wetterstation: Arduino Nano & ESP8266 mit BMP280 Barometrischem Sensor & OLED/Nokia LCD Display
  8. Tragbare Arduino-Wetterstation für 10$ bauen (Nano, DHT22, BMP180 & LCD)
  9. eDOT: Präzise Arduino-Uhr & Wetterstation mit IR-Fernbedienung
  10. Wetterstation mit Arduino & ThingSpeak IoT (DHT11 + ESP8266)