Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Geavanceerd Weerstation v2.0: Real-time Temperatuur, Druk, Vochtigheid & Hoogte Monitoring

Bouw een compact weerstation dat nauwkeurig temperatuur, druk, vochtigheid, en hoogte meet direct in je woonruimte.

Verhaal

Met de Adafruit Starter Pack voor Windows 10 IoT Core op een Raspberry Pi 2, demonstreert dit project hoe je een BME280-sensor (of BMP280) kunt interfaccen om omgevingsdata uit te lezen en te publiceren naar een clouddienst.

Als je een BMP280 bezit, volg dan de Weerstation v1-gids: Weerstation v1.

Hardware

Sluit de Raspberry Pi 2 aan op een breadboard en bedraad de BME280-sensor volgens het Fritzing-diagram in de "Schema's" sectie hieronder.

Software

Download de starter-code van GitHub – ms‑iot/adafruitsample. We lopen je door het toevoegen van de benodigde code om met de sensor te communiceren en je metingen te publiceren.

Open Lesson_203v2\StartSolution\lesson_203v2.sln en bewerk mainpage.xaml.cs.

Een volledig voltooide versie is beschikbaar op Lesson_203v2\FullSolution\lesson_203v2.sln.

MainPage.xaml.cs

Voeg een referentie toe aan de BME280-klasse:

public sealed partial class MainPage : Page {
    // Maak een nieuw object voor onze sensor-klasse
    BME280 BME280;

Initialiseer de sensor in OnNavigatedTo:

// Maak een nieuw object voor onze sensor-klasse
BME280 = new BME280Sensor();
// Initialiseer de sensor
await BME280.Initialize();

Voeg daarna code toe om data te verzamelen en te loggen:

  • Maak variabelen aan voor temperatuur, druk, vochtigheid en hoogte, geïnitialiseerd op 0.
  • Stel een zeeniveau-drukconstante in (standaard 1013,25 hPa).
  • Lees de vier metingen tien keer en geef ze uit naar de debug-console.
// Initialiseer op 0
float temp = 0;
float pressure = 0;
float altitude = 0;
float humidity = 0;
// Constante voor druk op zeeniveau
const float seaLevelPressure = 1022.00f;
// Lees 10 samples
for (int i = 0; i < 10; i++) {
    temp = await BME280.ReadTemperature();
    pressure = await BME280.ReadPreasure();
    altitude = await BME280.ReadAltitude(seaLevelPressure);
    humidity = await BME280.ReadHumidity();
    // Schrijf waarden naar debug-console
    Debug.WriteLine("Temperatuur: " + temp.ToString() + " graden C");
    Debug.WriteLine("Vochtigheid: " + humidity.ToString() + " %");
    Debug.WriteLine("Druk: " + pressure.ToString() + " Pa");
    Debug.WriteLine("Hoogte: " + altitude.ToString() + " m");
    Debug.WriteLine("\n");
}

BME280.cs

Open BME280.cs en voeg het volgende toe na de register-adres enum:

// String voor de vriendelijke naam van de I2C-bus
const string I2CControllerName = "I2C1";
// Maak een I2C-apparaat
private I2cDevice bme280 = null;
// Maak nieuwe kalibratiedata voor de sensor
BME280_CalibrationData CalibrationData;
// Variabele om te checken of apparaat geïnitialiseerd is
bool init = false;

Verbeter de Initialize methode om de I2C-verbinding in te stellen:

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

Voeg de Begin routine toe om de sensorsignatuur te verifiëren en kalibratiedata te 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 Handtekening: " + ReadBuffer[0].ToString());
    if (ReadBuffer[0] != BMP280_Signature) {
        Debug.WriteLine("BMP280::Begin Handtekening Mismatch.");
        return;
    }
    init = true;
    CalibrationData = await ReadCoefficeints();
    await WriteControlRegister();
    await WriteControlRegisterHumidity();
}

Control-register helpers:

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-functies om registerdata te lezen:

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

Kalibratie- en compensatiefuncties zijn direct afgeleid van de BMP280-datasheet en zijn al meegeleverd.

Implementeer ReadTemperature om de sensor-temperatuur in graden Celsius terug te geven:

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

Complete ReadPreasure (let op de originele typo; we behouden het voor compatibiliteit):

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

Ten slotte, implementeer ReadAltitude om hoogte te berekenen met de barometrische formule:

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

Je project is nu klaar om te deployen!

Verwachte Uitvoer

Temperatuur: 24,46189 graden C

Vochtigheid: 54,372 %

Druk: 99738,73 Pa

Hoogte: 205,1726 m

Bron: Weerstation V 2.0

Productieproces

  1. DIY Zonne-energie Weerstation Met Raspberry Pi
  2. Een buitenweerstation bouwen met Raspberry Pi 2 en ADS-WS1
  3. Een Raspberry Pi-weerstation bouwen dat dagelijkse weergegevens e-mailt
  4. Externe weerbewaking met Raspberry Pi 3 en PubNub
  5. Uw weerstation integreren met CWOP: Een praktische gids
  6. Weerstation – DIY Raspberry Pi Weerstation met Dropbox-upload
  7. Compact Weerstation: Arduino Nano & ESP8266 Met BMP280 Barometrische Sensor & OLED/Nokia LCD Display
  8. Bouw een $10 Draagbare Arduino Weerstation (AWS) – Eenvoudige DIY met Nano, DHT22, BMP180 & LCD
  9. eDOT: Precieze Arduino-klok & weerstation met ingebouwde IR-remote
  10. Realtime Weerstation met Arduino & ThingSpeak IoT
  11. Arduino Nano Weerstation: Sensor Kit & OLED Display