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

Weerstation V 2.0

Meet temperatuur, druk en vochtigheid in uw kamer.

Verhaal

In dit project gebruiken we het Adafruit Starter Pack voor Windows 10 IoT Core op Raspberry Pi 2-kitcomponenten om een ​​project te maken dat een sensor gebruikt om de temperatuur en druk te lezen , vochtigheid en hoogte.

OPMERKING:er zijn twee versies van de kit, de ene bevat de BMP280-sensor en de andere de BME280. Als je de BMP280 hebt, ga je naar het Weather Station v1-project https://www.hackster.io/windows-iot/weather-station

Hardware

Sluit de Raspberry Pi2 aan op het breadboard en de andere componenten volgens het Fritzing-diagram in het gedeelte 'Schema's' hieronder.

Software

Je kunt de code voor het starten van het project downloaden van https://github.com/ms-iot/adafruitsample en we leiden je door de toevoeging van de code die nodig is om te praten naar de webservice en krijg je pin op de kaart. Welke kaart?

Open “Lesson_203v2\StartSolution\lesson_203v2.sln“ en open het bestand mainpage.xaml.cs.

We hebben in deze oplossing een aantal methoden als uitgangspunt voor u ingevuld. Als je vooruit wilt, kun je een oplossing vinden met alle code ingevuld op:"Lesson_203v2\FullSolution\lesson_203v2.sln"

Hoofdpagina.xaml.cs

Open het bestand MainPage.xaml.cs.

Voeg een verwijzing toe aan de sensorklasse (BME280).

openbare verzegelde gedeeltelijke klasse MainPage:Page{ // Maak een nieuw object voor onze sensorklasse BME280 BME280;

Nu voegen we code toe in de OnNavigatedTo-methode die een nieuw BME280-object voor de sensor maakt en het object initialiseert.

// Maak een nieuw object voor onze sensor classBME280 =new BME280Sensor();//Initialiseer de sensorwait BME280.Initialize();

Vervolgens voegen we code toe om het volgende te doen:

  • Maak variabelen om de temperatuur, druk, vochtigheid en hoogte op te slaan. Zet ze op 0.
  • Maak een variabele voor de druk op zeeniveau. De standaardwaarde is 1013,25 hPa.
  • Lees de temperatuur, druk, vochtigheid en hoogte 10 keer en voer de waarden uit naar de foutopsporingsconsole.
 //Initialiseer ze naar 0.float temp =0;float pressure =0;float height =0;float vochtigheid =0;//Creëer een constante voor de druk op zeeniveau. //Dit is gebaseerd op uw lokale druk op zeeniveau (Eenheid:Hectopascal)const float seaLevelPressure =1022.00f;//Lees 10 voorbeelden van de datafor (int i =0; i <10; i++) {temp =wacht op BME280.ReadTemperature (); druk =wacht op BME280.ReadPreasure(); hoogte =wacht op BME280.ReadAltitude(seaLevelPressure); vochtigheid =wacht op BME280.ReadHumidity(); //Schrijf de waarden naar uw debug-console Debug.WriteLine("Temperature:" + temp.ToString() + "deg C"); Debug.WriteLine("Vochtigheid:" + vochtigheid.ToString() + "%"); Debug.WriteLine("Druk:" + druk.ToString() + "Pa"); Debug.WriteLine("Hoogte:" + hoogte.ToString() + "m"); Debug.WriteLine("");}

BME280.cs

Open het bestand BME280.cs.

Het eerste deel van de code is het maken van een lijst van de adressen van de verschillende registers in de BME280. Deze waarden zijn te vinden in de BMP280-datasheet.

Voeg in de BME280-klasse het volgende toe na de opsomming voor registeradressen.

 //String voor de beschrijvende naam van de I2C busconst string I2CControllerName ="I2C1";//Maak een I2C deviceprivate I2cDevice bme280 =null;//Maak nieuwe kalibratiegegevens voor de sensorBME280_CalibrationData CalibrationData;/ /Variabele om te controleren of het apparaat is geïnitialiseerdbool init =false;

Voeg vervolgens de volgende code in de functie Initialize toe aan:

//Methode om de BME280 sensorpublic te initialiseren async Task Initialize(){ Debug.WriteLine("BME280::Initialize"); probeer {// Instantiëer de I2CConnectionSettings met behulp van het apparaatadres van de BME280 I2cConnectionSettings-instellingen =nieuwe I2cConnectionSettings (BME280_Address); // Stel de I2C-bussnelheid van verbinding in op instellingen voor snelle modus. BusSpeed ​​=I2cBusSpeed.FastMode; //Gebruik de I2CBus-apparaatkiezer om een ​​geavanceerde syntaxisreeks voor query's te maken string aqs =I2cDevice.GetDeviceSelector(I2CControllerName); //Gebruik de klasse Windows.Devices.Enumeration.DeviceInformation om een ​​verzameling te maken met behulp van de geavanceerde querysyntaxisreeks DeviceInformationCollection dis =wait DeviceInformation.FindAllAsync(aqs); //Maak het BME280 I2C-apparaat met behulp van de apparaat-ID van de I2CBus en de I2CConnectionSettings bme280 =wait I2cDevice.FromIdAsync(dis[0].Id, settings); //Controleer of het apparaat is gevonden if (bme280 ==null) { Debug.WriteLine ("Apparaat niet gevonden"); } } catch (uitzondering e) { Debug.WriteLine("Uitzondering:" + e.Message + "\n" + e.StackTrace); werpen; }}

Voeg de volgende code in de functie Begin toe aan:

privé asynchrone taak Begin(){ Debug.WriteLine("BME280::Begin"); byte [] WriteBuffer =nieuwe byte [] { (byte) eRegisters.BMP280_REGISTER_CHIPID}; byte [] ReadBuffer =nieuwe byte [] { 0xFF }; // Lees de apparaathandtekening bmp280.WriteRead (WriteBuffer, ReadBuffer); Debug.WriteLine("BME280-handtekening:" + ReadBuffer[0].ToString()); //Controleer de apparaathandtekening if (ReadBuffer[0]!=BMP280_Signature) { Debug.WriteLine("BMP280::Begin Signature Mismatch."); opbrengst; } //Stel de initalize variabele in op true init =true; //Lees de coëfficiëntentabel CalibrationData =wacht op ReadCoefficeints(); // Schrijf controleregister wacht op WriteControlRegister (); //Schrijf het vochtigheidsregelregister in afwachting van WriteControlRegisterHumidity();}

Voeg de volgende code toe aan de volgende 2 functies om naar de controleregisters te schrijven.

private asynchrone Taak WriteControlRegisterHumidity(){ byte[] WriteBuffer =nieuwe byte[] { (byte)eRegisters.BMP280_REGISTER_CONTROLHUMID, 0x03 }; bmp280.Schrijven (Schrijfbuffer); wacht op Task.Delay(1); return;}//Methode om 0x3F te schrijven naar het controleregisterprivate async Taak WriteControlRegister(){ byte[] WriteBuffer =nieuwe byte[] {(byte)eRegisters.BMP280_REGISTER_CONTROL, 0x3F}; bmp280.Schrijven (Schrijfbuffer); wacht op Task.Delay(1); terug;}

Voeg de volgende code toe aan de functie ReadUInt16_LittleEndian om:

//Methode om een ​​16-bits waarde uit een register te lezen en terug te sturen in little endian-formaatprivate UInt16 ReadUInt16_LittleEndian(byte register){ UInt16 value =0; byte [] writeBuffer =nieuwe byte [] { 0x00 }; byte[] readBuffer =nieuwe byte[] {0x00, 0x00}; writeBuffer[0] =registreren; bmp280.WriteRead (schrijfbuffer, leesbuffer); int h =readBuffer[1] <<8; int l =leesBuffer [0]; waarde =(UInt16)(h + l); retourwaarde;}

Voeg de volgende code toe aan de ReadByte-functie om 8-bits gegevens uit een register te lezen.

//Methode om een ​​8-bits waarde uit een registerprivate byte ReadByte(byte register){ byte value =0; byte [] writeBuffer =nieuwe byte [] { 0x00 }; byte[] readBuffer =nieuwe byte[] {0x00}; writeBuffer[0] =registreren; bmp280.WriteRead (schrijfbuffer, leesbuffer); waarde =leesbuffer[0]; retourwaarde;}

De volgende drie functies worden voor je gedaan. De informatie die nodig is om deze functies te schrijven is te vinden in de datasheet.

ReadCoefficeints: dit is de functie waarbij alle kalibratiegegevens uit de registeradressen worden gelezen.

BMP280_compensate_T_double:in deze functie wordt de temperatuur in ºC berekend met behulp van de compensatieformule in het BMP280-gegevensblad.

BMP280_compensate_P_Int64: In deze functie wordt de druk in Pa berekend met behulp van de compensatieformule in het BMP280-gegevensblad.

Voeg de volgende code toe om de functie ReadTemperature te voltooien.

public async Task ReadTemperature(){ //Zorg ervoor dat het I2C-apparaat is geïnitialiseerd als (!init) wacht op Begin(); // Lees de MSB, LSB en bits 7:4 (XLSB) van de temperatuur uit de BMP280-registers 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 // Combineer de waarden tot een 32-bits geheel getal Int32 t =(tmsb <<12) + (tlsb <<4) + (txlsb>> 4); // Converteer de onbewerkte waarde naar de temperatuur in degC dubbele temp =BMP280_compensate_T_double (t); // Retourneer de temperatuur als een float-waarde retour (float) temp;}

Herhaal dezelfde stappen om de ReadPressure-functie te voltooien.

 public async Task ReadPreasure() { //Zorg ervoor dat het I2C-apparaat is geïnitialiseerd als (!init) wacht op Begin(); // Lees eerst de temperatuur om de t_fine-waarde voor compensatie te laden als (t_fine ==Int32.MinValue) {wacht op ReadTemperature (); } //Lees de MSB, LSB en bits 7:4 (XLSB) van de druk van de BMP280 registers 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 // Combineer de waarden tot een 32-bits geheel getal Int32 t =(tmsb <<12) + (tlsb <<4) + (txlsb>> 4); // Converteer de ruwe waarde naar de druk in Pa Int64 pres =BMP280_compensate_P_Int64 (t); //Retourneer de temperatuur als een vlotterwaarde retour ((float)pres) / 256;}

Voltooi ten slotte de ReadAltitude-functie:

//Methode om de druk op zeeniveau in Hectopascals(hPa) als parameter te nemen en de hoogte te berekenen met de huidige druk.public async Task ReadAltitude(float seaLevel){ //Zorg ervoor het I2C-apparaat wordt geïnitialiseerd als (!init) wacht op Begin(); // Lees de druk eerst vlotterdruk =wacht ReadPreasure (); // Zet de druk om in Hectopascal (hPa) druk /=100; //Bereken en retourneer de hoogte met behulp van de internationale barometrische formule return 44330.0f * (1.0f - (float)Math.Pow((pressure / seaLevel), 0.1903f));}

Uw project is nu klaar voor implementatie!

Verwachte output

Temperatuur:24.46189 graden C

Vochtigheid:54,372%

Druk:99738,73 Pa

Hoogte:205,1726 m

Bron:  Weerstation V 2.0


Productieproces

  1. Weerstation gebaseerd op Raspberry Pi
  2. Raspberry Pi 2 weerstation
  3. Raspberry Pi-weerstation
  4. Bewaking op afstand van het weer met Raspberry Pi
  5. Doe mee met het IOT met je weerstation – CWOP
  6. Weermonitor
  7. Arduino + ESP-weerbox
  8. $10 draagbaar Arduino-weerstation (AWS)
  9. eDOT - op Arduino gebaseerde precisieklok en weerstation
  10. ThingSpeak Arduino-weerstation
  11. Lokaal weerstation