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

Wetterstation V 2.0

Messen Sie Temperatur, Druck und Luftfeuchtigkeit in Ihrem Zimmer.

Geschichte

In diesem Projekt verwenden wir das Adafruit Starter Pack für Windows 10 IoT Core auf Raspberry Pi 2-Kitkomponenten, um ein Projekt zu erstellen, das einen Sensor zum Lesen von Temperatur und Druck verwendet , Luftfeuchtigkeit und Höhe.

HINWEIS:Es gibt zwei Versionen des Kits, eine enthält den BMP280-Sensor und die andere den BME280. Wenn Sie den BMP280 haben, möchten Sie zum Projekt Weather Station v1 gehen https://www.hackster.io/windows-iot/weather-station

Hardware

Verbinden Sie den Raspberry Pi2 mit dem Steckbrett und den anderen Komponenten gemäß dem Fritzing-Diagramm im Abschnitt "Schaltpläne" unten.

Software

Sie können den Code zum Start des Projekts von https://github.com/ms-iot/adafruitsample herunterladen und wir führen Sie durch das Hinzufügen des für das Gespräch erforderlichen Codes zum Webservice und erhalten Sie Ihre PIN auf der Karte. Welche Karte?

Öffne „Lesson_203v2\StartSolution\lesson_203v2.sln“ und öffne die Datei mainpage.xaml.cs.

Wir haben einige Methoden als Ausgangspunkt für diese Lösung für Sie ausgefüllt. Wenn Sie weitermachen möchten, finden Sie eine Lösung mit vollständigem Code unter: "Lesson_203v2\FullSolution\lesson_203v2.sln"

MainPage.xaml.cs

Öffnen Sie die Datei MainPage.xaml.cs.

Fügen Sie einen Verweis auf die Sensorklasse (BME280) hinzu.

öffentliche versiegelte partielle Klasse MainPage :Page{ // Erstellen Sie ein neues Objekt für unsere Sensorklasse BME280 BME280;

Jetzt fügen wir Code in die OnNavigatedTo-Methode ein, der ein neues BME280-Objekt für den Sensor erstellt und das Objekt initialisiert.

// Erstelle ein neues Objekt für unseren Sensor classBME280 =new BME280Sensor();//Initialize the sensorawait BME280.Initialize();

Als nächstes fügen wir Code hinzu, um Folgendes zu tun:

 //Initialisieren Sie sie auf 0.float temp =0;float pressure =0;float height =0;float feuchtigkeit =0;//Erstellen Sie eine Konstante für den Druck auf Meereshöhe. //Dies basiert auf Ihrem lokalen Meeresspiegeldruck (Einheit:Hektopascal)const float seaLevelPressure =1022.00f; // Lesen Sie 10 Samples der Daten für (int i =0; i <10; i++) {temp =wait BME280.ReadTemperature (); Druck =warten BME280.ReadPreasure(); Höhe =warten BME280.ReadAltitude(seaLevelPressure); Feuchtigkeit =warten BME280.ReadHumidity(); //Schreiben Sie die Werte in Ihre Debug-Konsole Debug.WriteLine("Temperature:" + temp.ToString() + " deg C"); Debug.WriteLine("Feuchtigkeit:" + Feuchtigkeit.ToString() + " %"); Debug.WriteLine("Druck:" + pressure.ToString() + "Pa"); Debug.WriteLine("Höhe:" + Höhe.ToString() + " m"); Debug.WriteLine("");}

BME280.cs

Öffnen Sie die Datei BME280.cs.

Der erste Teil des Codes besteht darin, eine Liste der Adressen der verschiedenen Register im BME280 zu erstellen. Diese Werte finden Sie im BMP280-Datenblatt.

Fügen Sie in der Klasse BME280 Folgendes nach der Aufzählung für Registeradressen hinzu.

 //String für den Anzeigenamen des I2C-Busconst-Strings I2CControllerName ="I2C1";//Erzeuge ein I2C-Deviceprivate I2cDevice bme280 =null;//Erzeuge neue Kalibrierdaten für den SensorBME280_CalibrationData CalibrationData;/ /Variable, um zu überprüfen, ob das Gerät initialisiert istbool init =false;

Fügen Sie als Nächstes den folgenden Code in der Initialize-Funktion hinzu:

//Methode zum Initialisieren der BME280 sensorpublic async Task Initialize(){ Debug.WriteLine("BME280::Initialize"); try { //Instanziieren der I2CConnectionSettings mit der Geräteadresse des BME280 I2cConnectionSettings settings =new I2cConnectionSettings(BME280_Address); //Setze die I2C-Bus-Geschwindigkeit der Verbindung auf die Schnellmodus-Einstellungen.BusSpeed ​​=I2cBusSpeed.FastMode; //Verwenden Sie den I2CBus-Geräteselektor, um eine erweiterte Abfragesyntax zu erstellen string string aqs =I2cDevice.GetDeviceSelector(I2CControllerName); //Verwenden Sie die Windows.Devices.Enumeration.DeviceInformation-Klasse, um eine Sammlung mit der erweiterten Abfragesyntax zu erstellen string DeviceInformationCollection dis =wait DeviceInformation.FindAllAsync(aqs); // Instanziieren Sie das BME280 I2C-Gerät mit der Geräte-ID des I2CBus und den I2CConnectionSettings bme280 =wait I2cDevice.FromIdAsync(dis[0].Id, settings); //Überprüfen, ob Gerät gefunden wurde if (bme280 ==null) { Debug.WriteLine("Gerät nicht gefunden"); } } catch (Exception e) { Debug.WriteLine("Exception:" + e.Message + "\n" + e.StackTrace); Wurf; }}

Fügen Sie den folgenden Code in die Begin-Funktion hinzu zu:

private asynchrone Aufgabe Begin(){ Debug.WriteLine("BME280::Begin"); byte[] WriteBuffer =new byte[] { (byte)eRegisters.BMP280_REGISTER_CHIPID}; byte[] ReadBuffer =neues byte[] { 0xFF }; //Gerätesignatur lesen bmp280.WriteRead(WriteBuffer, ReadBuffer); Debug.WriteLine("BME280-Signatur:" + ReadBuffer[0].ToString()); //Gerätesignatur überprüfen if (ReadBuffer[0] !=BMP280_Signature) { Debug.WriteLine("BMP280::Begin Signature Mismatch."); Rückkehr; } //Setze die Initialisierungsvariable auf true init =true; // Lesen Sie die Koeffiziententabelle CalibrationData =wait ReadCoefficeints (); // Steuerregister schreiben warten WriteControlRegister(); //Schreibe das Feuchtigkeitskontrollregister wait WriteControlRegisterHumidity();}

Fügen Sie den folgenden Code zu den nächsten 2 Funktionen hinzu, um in die Steuerregister zu schreiben.

private asynchrone Aufgabe WriteControlRegisterHumidity(){ byte[] WriteBuffer =new byte[] { (byte)eRegisters.BMP280_REGISTER_CONTROLHUMID, 0x03}; bmp280.Write (WriteBuffer); warten Task.Delay(1); return;} // Methode zum Schreiben von 0x3F in das Steuerregisterprivate asynchrone Aufgabe WriteControlRegister() { byte[] WriteBuffer =new byte[] { (byte)eRegisters.BMP280_REGISTER_CONTROL, 0x3F }; bmp280.Write (WriteBuffer); warten Task.Delay(1); zurück;}

Fügen Sie den folgenden Code zur Funktion ReadUInt16_LittleEndian hinzu:

//Methode zum Lesen eines 16-Bit-Werts aus einem Register und Rückgabe im Little-Endian-Formatprivate UInt16 ReadUInt16_LittleEndian(byte register){ UInt16 value =0; byte[] writeBuffer =neues byte[] { 0x00 }; byte[] readBuffer =neues byte[] { 0x00, 0x00 }; writeBuffer[0] =registrieren; bmp280.WriteRead (writeBuffer, readBuffer); int h =readBuffer[1] <<8; int l =readBuffer[0]; Wert =(UInt16)(h + l); Rückgabewert;}

Fügen Sie den folgenden Code zur ReadByte-Funktion hinzu, um 8-Bit-Daten aus einem Register zu lesen.

//Methode zum Lesen eines 8-Bit-Werts aus einem Registerprivates Byte ReadByte(Byteregister){ Bytewert =0; byte[] writeBuffer =neues byte[] { 0x00 }; byte[] readBuffer =new byte[] { 0x00 }; writeBuffer[0] =registrieren; bmp280.WriteRead (writeBuffer, readBuffer); Wert =readBuffer[0]; Rückgabewert;}

Die nächsten drei Funktionen werden für Sie erledigt. Die zum Schreiben dieser Funktionen erforderlichen Informationen finden Sie im Datenblatt.

ReadCoefficeints: Mit dieser Funktion werden alle Kalibrierungsdaten aus den Registeradressen gelesen.

BMP280_compensate_T_double:In dieser Funktion wird die Temperatur in ºC anhand der Kompensationsformel im BMP280-Datenblatt berechnet.

BMP280_compensate_P_Int64: In dieser Funktion wird der Druck in Pa anhand der Kompensationsformel im BMP280-Datenblatt berechnet.

Fügen Sie den folgenden Code hinzu, um die Funktion ReadTemperature abzuschließen.

public async Task ReadTemperature(){ //Stellen Sie sicher, dass das I2C-Gerät initialisiert ist, wenn (!init) await Begin(); // MSB, LSB und Bits 7:4 (XLSB) der Temperatur aus den BMP280-Registern lesen 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); // Bits 7:4 //Kombiniere die Werte zu einer 32-Bit-Ganzzahl Int32 t =(tmsb <<12) + (tlsb <<4) + (txlsb>> 4); // Konvertieren Sie den Rohwert in die Temperatur in degC double temp =BMP280_compensate_T_double(t); // Temperatur als Gleitkommawert zurückgeben return (float)temp;}

Wiederholen Sie dieselben Schritte, um die ReadPressure-Funktion abzuschließen.

 public async Task ReadPreasure() { //Stellen Sie sicher, dass das I2C-Gerät initialisiert ist if (!init) await Begin(); // Lesen Sie zuerst die Temperatur, um den t_fine-Wert zur Kompensation zu laden if (t_fine ==Int32.MinValue) {wait ReadTemperature(); } // Lesen Sie das MSB, LSB und die Bits 7:4 (XLSB) des Drucks aus den BMP280-Registern 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); // Bits 7:4 //Kombiniere die Werte zu einer 32-Bit-Ganzzahl Int32 t =(tmsb <<12) + (tlsb <<4) + (txlsb>> 4); // Den Rohwert in den Druck in Pa umwandeln Int64 pres =BMP280_compensate_P_Int64(t); // Temperatur als Gleitkommawert zurückgeben return ((float)pres) / 256;}

Schließen Sie endlich die ReadAltitude-Funktion ab:

//Methode, um den Meeresspiegeldruck in Hektopascal (hPa) als Parameter zu verwenden und die Höhe mit dem aktuellen Druck zu berechnen.public async Task ReadAltitude(float seaLevel){ //Stellen Sie sicher das I2C-Gerät wird initialisiert, wenn (!init) await Begin(); // Lesen Sie den Druck zuerst Schwimmerdruck =Wait ReadPreasure (); // Konvertieren Sie den Druck in Hektopascal (hPa) Druck / =100; //Berechnen Sie die Höhe und geben Sie sie mit der internationalen barometrischen Formel zurück return 44330.0f * (1.0f - (float)Math.Pow((pressure / seaLevel), 0.1903f));}

Ihr Projekt kann jetzt bereitgestellt werden!

Erwartete Ausgabe

Temperatur:24,46189 °C

Luftfeuchtigkeit:54,372 %

Druck:99738,73 Pa

Höhe:205,1726 m

Quelle:  Wetterstation V 2.0


Herstellungsprozess

  1. Wetterstation basierend auf Raspberry Pi
  2. Raspberry Pi 2 Wetterstation
  3. Raspberry Pi Wetterstation
  4. Wetterfernüberwachung mit Raspberry Pi
  5. Beteiligen Sie sich mit Ihrer Wetterstation am IOT – CWOP
  6. Wettermonitor
  7. Arduino + ESP Weather Box
  8. $10 Portable Arduino Wetterstation (AWS)
  9. eDOT - Arduino-basierte Präzisionsuhr und Wetterstation
  10. ThingSpeak Arduino Wetterstation