» elektronik » Arduino »Hjemmet vejrstation på GY-BMP280-3.3 og Ds18b20

Hjemme vejrstation på GY-BMP280-3.3 og Ds18b20


Jeg vil samle gør det selv instrument, der måler atmosfærisk tryk og temperatur. Temperatursensoren skal være fjern og tæt, da den skal måle temperaturen i en bestemt afstand fra enheden. Jeg vil gerne have en sådan bærbar enhed med et arbejdsområde fra -30 ° C til 50 ° C. Men dette kræver, at alle komponenter kan arbejde i dette temperaturområde. Komponenter, der kan arbejde i et udvidet temperaturområde, er dyrere, og det er vanskeligere at købe dem.
For at opfylde min drøm til virkelighed får jeg hjælp af bestyrelsen, som jeg beskrev i artiklen “GY-BMP280-3.3 kort til måling af barometrisk tryk og temperatur».

Fra praksis er det kendt, at under montering og konfiguration elektronisk produkter inden dens fremstilling, skal du kontrollere brugbarheden af ​​alle materialer og komponenter i hver enkelt separat. Ellers kan du blive forvirret senere, og som et resultat fungerer det elektroniske produkt ikke, og det vil være meget vanskeligt at finde årsagen til fejlfunktionen.

Lad os komme i gang.

Første fase. Installer en gratis softwareskal på din computer Arduino IDE til at skrive programmer (skitser), kompilere dem og derefter skrive dem til Mega328P mikrokontroller installeret på tavlen. Jeg anbefaler, at du downloader shell-versionen af ​​ARDUINO 1.6.5. Hvorfor? Oprindeligt var ARDUINO-projektet et, nu er udviklerne spredt og fortsætter med at udvikle ARDUINO-systemet, men hver på sin måde, med små nuancer. Jeg brugte version ARDUINO 1.6.5. Det skal installeres og testes til samarbejde med Arduino Uno-kortet ved hjælp af de enkleste eksempler.

Anden etape. Vi kontrollerer GY-BMP280-3.3-pladen for at måle barometrisk tryk og temperatur. Vi tager 4 ledninger, vi forbinder dem GY-BMP280-3.3 og Arduino Uno, som vist på foto og diagram. Kurver tynde flerfarvede linjer er ledere.



Lad os begynde at tjekke GY-BMP280-3.3-tavlen. For at gøre dette skal du installere biblioteket i Arduino IDE, skrevet af programmerere, der arbejder på webstedet. Efter installation af biblioteket i Arduino IDE vises som regel eksempler (eksempler) af kode. Ved lidt at ændre prøvekoden kan vi samle den til data, der er forståelige for mikrokontrolleren, og derefter sende den til hukommelsen på mikrokontrolleren. Du kan finde et eksempel (eksempel) ved at være opmærksom på de to skærmbilleder nedenfor.


Efter at have skrevet data til mikrokontrolleren på Arduino Uno-kortet, begynder det straks at udføre programmet (kode) og sender dataene via USB-kabel til den computer, som Arduino Uno-kortet er forbundet til.Og vi kan se måleresultatet af GY-BMP280-3.3-kortet i Arduino IDE-vinduet, kaldet "seriel portmonitor".


Vi kan se resultatet af målinger på GY-BMP280-3.3-tavlen i standard Windows Hyper Terminal-programmet, efter at Arduino Uno-skallen er lukket og opsat en session i Hyper Terminal-programmet. Det vil sige, vi kan få resultaterne af GY-BMP280-3.3-kortet ved at forbinde Arduino Uno til enhver computer med et USB-kabel, som driveren til Arduino Uno-kortet er installeret på. Der er flere biblioteker til at arbejde med GY-BMP280-3.3. Alt fungerede for mig med biblioteket. Den fil, du downloader fra dette sted, ser sådan ud: bd7e4a37c1f4dba2ebde9b9cd49f45ce.zip. Det skal omdøbes til: iarduino_Pressure_BMP.zip. Nu skal vi installere iarduino_Pressure_BMP-biblioteket i Arduino IDE-shell.


Start Arduino IDE, gå til menuen Sketch / Inkluder bibliotek / Tilføj.ZIP Library ... vælg derefter filen iarduino_Pressure_BMP.zip og klik på knappen Åbn. Du skal også installere bibliotekerne:,. Efter installation af bibliotekerne genstarter vi Arduino IDE-skallen, dvs. luk den og start den igen. Vælg derefter menuen File / Samples / iarduino Pressure BMP (tryksensorer) / eksempel.

Vi ser koden i vinduet.

Koden skal ændres lidt.

I den femte linje skal du fjerne to skrå streger “//” og tilføje (0x76) eller (0x77) i den ellevte linje. (0x76) er adressen på barometerpladen. Mit GY-BMP280-3.3-kort, der er tilsluttet I2C-bussen, viste sig at have den samme adresse (0x76). Hvordan finder jeg ud af nummeret på enheden, der er tilsluttet I2C-bussen? Du får svaret på dette spørgsmål ved at læse hele artiklen.

Så fikserede vi koden i vinduet, nu begynder vi at kontrollere og kompilere koden i menuen Sketch / Check / Compile. Hvis bekræftelse og kompilering af koden er vellykket, starter vi i Sketch / Load-menuen programoptagelsen i Arduino Uno.

Hvis overførslen er vellykket, vil vi ved at åbne den serielle portmonitor i menuen: Tools / Serial Port Monitor, se de data, der er sendt af GY-BMP280-3.3-kortet.

I det følgende skærmbillede er resultatet af GY-BMP280-3.3-kortet, der arbejder på en computer, hvor Arduino IDE-skallen ikke er installeret. Dataene modtages af PuTTY-programmet.

På samme tid blev et laboratorium aneroidbarometer fotograferet, som var placeret ved siden af ​​GY-BMP280-3.3-pladen. Ved at sammenligne instrumentlæsningerne kan du selv drage konklusioner om GY-BMP280-3.3-kortets nøjagtighed. Aneroidbarometer certificeret af statens laboratorium.


Tredje fase. Kontrol af LCD-displayet med I2C-interfacemodulet. Vi finder en LDC-skærm med et interfacemodul, der forbinder via I2C-bussen til Arduino UNO.
Hjemme vejrstation på GY-BMP280-3.3 og Ds18b20

Vi kontrollerer dens funktion ved hjælp af eksempler fra Arduino IDE-shell. Men inden det bestemmer vi adressen på grænseflademodulet. Mit interface-modul har en adresse på 0x3F. Jeg indsatte denne adresse i skisselinjen: LiquidCrystal_I2C lcd (0x3F, 16.2);
Jeg bestemte denne adresse ved hjælp af skitsen "I2C enhedsadressescanner", der er beskrevet i.
Jeg lancerede Arduino IDE-skallen, fra artiklen kopierede jeg programkoden og indsatte Arduino IDE-vinduet.

Jeg startede samlingen, skrev derefter koden på Arduino UNO-kortet, hvortil GY-BMP280-3.3-kortet og LDC-displayet med I2C-interfacemodulet var forbundet. På seriel portmonitor fik jeg derefter følgende resultat. Mit interface-modul har en adresse på 0x3F.

Fjerde fase. Kontrol af DS18b20 temperatursensor. Vi forbinder det som følger.

OneWire Arduino-biblioteket til arbejde med DS18b20-temperatursensoren er allerede installeret.

Åbn DS18x20_Temperature-prøven, kompiler, indlæs, se måleresultatet i seriel portmonitor. Hvis alt fungerer, skal du fortsætte til næste trin.

Femte etape. samling hjem vejrstationer på GY-BMP280-3.3 og Ds18b20.
Vi samler enheden i henhold til skemaet:

Jeg modtog koden til enheden ved at kombinere alle eksemplerne i et og indstille output på LDC-skærmen. Her er hvad jeg fik:

// Uncomment til en softwareimplementering af I2C-bussen: //
// #definér pin_SW_SDA 3 // Tildel enhver Arduino-pin, der fungerer som en SDA-linje i I2C-softwarebussen.
// #definér pin_SW_SCL 9 // Tildel enhver Arduino-pin, der fungerer som en SCL-linje til I2C-softwarebussen.
// Uncomment for kompatibilitet med de fleste tavler: //
#include
#include // Iarduino-biblioteket bruger metoderne og funktionerne i Wire-biblioteket.
#include // Bibliotek til arbejde LDC type 1602 på I2C bussen

                                                            //
#include // Tilslut iarduino_Pressure_BMP-biblioteket til at arbejde med BMP180 eller BMP280.
iarduino_Pressure_BMP sensor (0x76); // Angiv et sensorobjekt til arbejde med en tryksensor ved hjælp af funktionerne og metoderne i iarduino_Pressure_BMP-biblioteket.
LiquidCrystal_I2C lcd (0x3F, 16,2);
OneWire ds (10);
ugyldig opsætning () {
    lcd.init ();
    lcd.backlight ();
    Serial.begin (9600); // Start dataoverførsel til den serielle portmonitor ved 9600 baud.
    forsinkelse (1000); // Vi venter på færdiggørelse af transienter, når vi bruger strøm
    sensor.begin (73); // Start arbejde med sensoren. Den nuværende højde tages som 73 m. - højden af ​​byen Buzuluk over havets overflade
} //
void loop () {
// Læs dataene og vis: temperatur i ° C, tryk i mm. rt., ændring i højde i forhold til den specificerede i startfunktionen (standard 0 meter).
lcd.setCursor (0,0); // definere outputpunktet "P =" på LDC
lcd.print ("P =");
lcd.print (sensor.pressure / 1000.3); // dividér værdien af ​​P udstedt af BMP280 med 1000 og indstil output på 3 decimaler
lcd.setCursor (12.0); // definere outputpunktet "kPa" på LDC
lcd.print ("kPa");
lcd.set markør (0,1);
lcd.print ("T =");
lcd.print (sensor.temperature, 1); // sæt output på 1 decimal
lcd.setCursor (6.1);
// lcd.print ("C");
// lcd.setCursor (9,1);
// lcd.print ("H =");
// lcd.print (sensor.altitude, 1);
    if (sensor.read (1)) {Serial.println ((String) "CEHCOP BMP" + sensor.type + ": \ t P =" + sensor.pressure + "\ tMM.PT.CT, \ t T = "+ sensor.temperatur +" * C, \ t \ t B = "+ sensor.altitude +" M. ");}
    andet {Serial.println ("HET OTBETA OT CEHCOPA");}
// Læs dataene og vis: temperatur i ° C og tryk i Pa, tryk i mm. rt., ændring i højde i forhold til den specificerede i startfunktionen (standard 0 meter).
    if (sensor.read (2)) {Serial.println ((String) "CEHCOP BMP" + sensor.type + ": \ t P =" + sensor.pressure + "\ tPa, \ t \ t T =" + sensor.temperature + "* C, \ t \ t B =" + sensor.altitude + "M.");}
    andet {Serial.println ("HET OTBETA OT CEHCOPA");}
    byte i;
  byte til stede = 0;
  byte type_s;
  byte data [12];
  byte addr [8];
  float celsius, fahrenheit;
  if (! ds.search (addr)) {
    Serial.println ("Ingen flere adresser.");
    Serial.println ();
    ds.reset_search ();
    forsinkelse (250);
    vende tilbage;
  }
  Serial.print ("ROM =");
  for (i = 0; i & lt; 8; i ++) {
    Serial.write ('');
    Serial.print (addr [i], HEX);
  }
  if (OneWire :: crc8 (addr, 7)! = addr [7]) {
      Serial.println ("CRC er ikke gyldig!");
      vende tilbage;
  }
  Serial.println ();
  // den første ROM-byte angiver hvilken chip
  switch (addr [0]) {
    sag 0x10:
      Serial.println ("Chip = DS18S20"); // eller gammel DS1820
      type_s = 1;
      break;
    sag 0x28:
      Serial.println ("Chip = DS18B20");
      type_s = 0;
      break;
    sag 0x22:
      Serial.println ("Chip = DS1822");
      type_s = 0;
      break;
    standard:
      Serial.println ("Enhed er ikke en DS18x20-familieenhed.");
      vende tilbage;
  }
  ds.reset ();
  ds.select (addr);
  ds.skriv (0x44, 1); // start konvertering, med parasit tændt i slutningen
  
  forsinkelse (1000); // måske er 750 ms nok, måske ikke
  // vi laver måske en ds.depower () her, men nulstillingen vil tage sig af det.
  nuværende = ds.reset ();
  ds.select (addr);
  ds.skriv (0xBE); // Læs Scratchpad
  Serial.print ("Data =");
  Serial.print (nuværende, HEX);
  Serial.print ("");
  for (i = 0; i & lt; 9; i ++) {// vi har brug for 9 byte
    data [i] = ds.read ();
    Serial.print (data [i], HEX);
    Serial.print ("");
  }
  Serial.print ("CRC =");
  Serial.print (OneWire :: crc8 (data, 8), HEX);
  Serial.println ();
  // Konverter dataene til den faktiske temperatur
  // fordi resultatet er et 16 bit signeret heltal, skal det
  // gemmes i en "int16_t" type, som altid er 16 bit
  // selv når den er kompileret på en 32 bit processor.
  int16_t raw = (data [1] & lt; & lt; 8) | data [0];
  if (type_s) {
    rå = rå & lt; & lt; 3; // 9 bit opløsning standard
    if (data [7] == 0x10) {
      // "count count" giver fuld 12 bit opløsning
      raw = (raw & amp; 0xFFF0) + 12 - data [6];
    }
  } andet {
    byte cfg = (data [4] & 0x60);
    // ved lavere res er de lave bits ikke defineret, så lad os nul dem
    hvis (cfg == 0x00) raw = raw & amp; ~ 7; // 9 bit opløsning, 93,75 ms
    ellers hvis (cfg == 0x20) raw = raw & amp; ~ 3; // 10 bit res, 187,5 ms
    ellers hvis (cfg == 0x40) raw = raw & amp; ~ 1; // 11 bit res, 375 ms
    //// standard er 12 bit opløsning, konverteringstid på 750 ms
  }
  celsius = (float) rå / 16,0;
  fahrenheit = celsius * 1,8 + 32,0;
  Serial.print ("Temperatur =");
  Serial.print (celsius);
  Serial.print ("Celsius,");
  Serial.print (fahrenheit);
  Serial.println ("Fahrenheit");
lcd.setCursor (8.1); // definere outputpunktet "Tds =" på LDC
lcd.print ("Tds =");
lcd.print (celsius, 1);
    forsinkelse (3000);
}


Her er hvad jeg fik:


GY-BMP280-3.3-pladen giver udtryk i pascaler, hvilket ikke er meget praktisk. Jeg kunne ikke løse problemet med, hvordan man fremstiller GY-BMP280-3.3-kortets output-trykdata i kilopascals. Jeg løste dette problem i outputlinjen på LDC-skærmen.

lcd.print (sensor.pressure / 1000.3); // dividér værdien af ​​P udstedt af BMP280 med 1000 og indstil output på 3 decimaler
GY-BMP280-3.3-kortet giver også højdeværdier.

sensor.begin (73); // Start arbejde med sensoren. Den nuværende højde tages som 73 m. - højden af ​​byen Buzuluk over havets overflade
Hvis du slapper af på havet og skifter "sensor.begin (73);" på "sensor.begin (0);" i koden, og derefter kompilere og gemme programmet til hjemmevejrstationen på GY-BMP280-3.3 og Ds18b20, og foretag en højdeudgang til LDC-displayet, får du også en højdemåler.
// lcd.setCursor (9,1);
// lcd.print ("H =");
// lcd.print (sensor.altitude, 1); // Udskriv højdeværdierne i meter med en decimal
Strømmen leveres til kredsløbet i min version via et USB-kabel. Du kan bruge en 5V / 600 mA lavspændings boostimpulsomformer, og din vejrstation bliver bærbar. Denne type strømforsyning er godt beskrevet i artiklen.

Vellykket samling!
5
8.8
6.3

Tilføj en kommentar

    • smilesmilxaxaokdontknowyahoonea
      bossscratchnarrejaja-jaaggressivhemmelighed
      undskylddansdance2dance3benådninghjælpdrikkevarer
      stop-vennergodgoodgoodfløjtedånetunge
      røgklappecrayerklærerspottendedon-t_mentiondownloade
      hedeirefullaugh1mdamødemoskingnegativ
      not_ipopcornstraffelæseskræmmeforskrækkelsersøg
      hånethank_youdetteto_clueumnikakutenig
      dårligbeeeblack_eyeblum3blushpralekedsomhed
      censureretpleasantrysecret2truesejryusun_bespectacled
      SHOKRespektlolprevedvelkommenkrutoyya_za
      ya_dobryihjælperenne_huliganne_othodiFludforbudtæt

Vi råder dig til at læse:

Giv den til smartphonen ...