» elektronikk » Arduino »Hjemme værstasjon på GY-BMP280-3.3 og Ds18b20

Hjemme værstasjon på GY-BMP280-3.3 og Ds18b20


Jeg vil samle gjør det selv instrument som vil måle atmosfæretrykk og temperatur. Temperatursensoren må være fjern og tett, da den måler temperaturen i en viss avstand fra enheten. Jeg vil gjerne ha en slik bærbar enhet med et arbeidsområde fra -30 ° C til 50 ° C. Men dette krever at alle komponentene kan fungere i dette temperaturområdet. Komponenter som kan arbeide i et utvidet temperaturområde er dyrere, og det er vanskeligere å kjøpe dem.
For å oppfylle drømmen min til virkelighet, vil jeg få hjelp av styret, som jeg beskrev i artikkelen “GY-BMP280-3.3 brett for måling av barometrisk trykk og temperatur».

Fra praksis er det kjent at under montering og konfigurasjon elektronisk produkter før det produseres, må du kontrollere brukbarheten til alle materialer og komponenter hver for seg. Ellers kan du bli forvirret senere, og som et resultat vil det elektroniske produktet ikke fungere, og det vil være veldig vanskelig å finne årsaken til feilen.

La oss komme i gang.

Første etappe. Installer et gratis programvareskall på datamaskinen din Arduino IDE for å skrive programmer (skisser), sammenstille dem og deretter skrive dem til Mega328P mikrokontroller som er installert på brettet. Jeg anbefaler at du laster ned skallversjonen av ARDUINO 1.6.5. Hvorfor? Opprinnelig var ARDUINO-prosjektet ett, nå har utviklerne spredt seg og fortsetter å utvikle ARDUINO-systemet, men hver på sin måte, med små nyanser. Jeg brukte versjon ARDUINO 1.6.5. Det skal installeres og testes for samarbeid med Arduino Uno-brettet ved å bruke de enkleste eksemplene.

Andre etappe. Vi sjekker GY-BMP280-3.3-tavlen for å måle barometrisk trykk og temperatur. Vi tar 4 ledninger, vi kobler dem GY-BMP280-3.3 og Arduino Uno, som vist på foto og diagram. Kurver tynne flerfargede linjer er ledere.



La oss begynne å sjekke GY-BMP280-3.3-tavlen. For å gjøre dette, må du installere biblioteket i Arduino IDE, skrevet av programmerere som jobber på nettstedet. Etter installasjon av biblioteket i Arduino IDE vises som regel eksempler (eksempler) på kode. Ved å endre prøvekoden litt, kan vi kompilere den til data som mikrokontrolleren forstår, og deretter sende den til mikrokontrollerens minne. Du kan finne et eksempel (eksempel) ved å ta hensyn til de to skjermbildene nedenfor.


Etter å ha skrevet data til mikrokontrolleren på Arduino Uno-brettet, starter den umiddelbart å utføre programmet (koden) og sender dataene via USB-kabelen til datamaskinen som Arduino Uno-kortet er koblet til.Og vi kan se måleresultatet av GY-BMP280-3.3-brettet i Arduino IDE-vinduet, kalt "seriell portmonitor".


Vi kan se resultatet av målinger på GY-BMP280-3.3-brettet i standard Windows Hyper Terminal-program, etter å ha lukket Arduino Uno-skallet og satt opp en økt i Hyper Terminal-programmet. Det vil si at vi kan få resultatene fra GY-BMP280-3.3-brettet ved å koble Arduino Uno til hvilken som helst datamaskin med en USB-kabel som driveren for Arduino Uno-brettet er installert på. Det er flere biblioteker for å jobbe med GY-BMP280-3.3. Alt fungerte for meg med biblioteket. Filen du laster ned fra dette nettstedet, vil se slik ut: bd7e4a37c1f4dba2ebde9b9cd49f45ce.zip. Det må gi nytt navn til: iarduino_Pressure_BMP.zip. Nå må vi installere iarduino_Pressure_BMP-biblioteket i Arduino IDE-skallet.


Start Arduino IDE, gå til Sketch / Include Librari / Add.ZIP Library-menyen ... velg deretter iarduino_Pressure_BMP.zip-filen og klikk Åpne-knappen. Du må også installere bibliotekene:,. Etter å ha installert bibliotekene, starter vi Arduino IDE-skallet på nytt, det vil si, lukker det og starter det på nytt. Velg deretter menyen File / Samples / iarduino Pressure BMP (trykksensorer) / eksempel.

Vi ser koden i vinduet.

Koden må endres litt.

I den femte linjen fjerner du to skråstrek “//” og legger til (0x76) eller (0x77) i den ellevte linjen. (0x76) er adressen til barometertavlen. GY-BMP280-3.3-kortet mitt koblet til I2C-bussen viste seg å ha samme adresse (0x76). Hvordan finne ut nummeret på enheten som er koblet til I2C-bussen? Du vil få svaret på dette spørsmålet ved å lese hele artikkelen.

Så fikset vi koden i vinduet, nå begynner vi å sjekke og sette sammen koden i menyen Sketch / Check / Compile. Hvis bekreftelsen og samlingen av koden er vellykket, starter vi i Sketch / Last-menyen programopptaket i Arduino Uno.

Hvis nedlastingen er vellykket, vil vi ved å åpne serieportmonitoren i menyen: Verktøy / Seriell portmonitor, se dataene som er sendt av GY-BMP280-3.3-styret.

I det følgende skjermbildet er resultatet av GY-BMP280-3.3-brettet som jobber på en datamaskin som Arduino IDE-skallet ikke er installert på. Dataene mottas av PuTTY-programmet.

Samtidig ble et laboratorium aneroidbarometer fotografert, som lå ved siden av GY-BMP280-3.3-tavlen. Ved å sammenligne instrumentavlesningene, kan du selv trekke konklusjoner om nøyaktigheten til GY-BMP280-3.3-tavlen. Aneroidbarometer sertifisert av statlig laboratorium.


Tredje trinn. Kontroller LCD-skjermen med I2C-grensesnittmodulen. Vi finner en LDC-skjerm med en grensesnittmodul som kobles via I2C-bussen til Arduino UNO.
Hjemme værstasjon på GY-BMP280-3.3 og Ds18b20

Vi sjekker driften ved å bruke eksempler fra Arduino IDE-skallet. Men før det bestemmer vi adressen til grensesnittmodulen. Grensesnittmodulen min har en adresse på 0x3F. Jeg la denne adressen inn i skisselinjen: LiquidCrystal_I2C lcd (0x3F, 16.2);
Jeg bestemte denne adressen ved hjelp av "I2C enhetsadresseskanner" -skissen beskrevet i.
Jeg lanserte Arduino IDE-skallet, fra artikkelen kopierte jeg programkoden og limte inn Arduino IDE-vinduet.

Jeg startet samlingen, og skrev deretter koden i Arduino UNO-brettet, som GY-BMP280-3.3-kortet og LDC-skjermen med I2C-grensesnittmodulen ble koblet til. Så på seriell portmonitor fikk jeg følgende resultat. Grensesnittmodulen min har en adresse på 0x3F.

Fjerde etappe. Kontroller temperatursensoren DS18b20. Vi kobler det til som følger.

OneWire Arduino-biblioteket for arbeid med temperatursensoren DS18b20 er allerede installert.

Åpne DS18x20_Temperature-prøven, kompiler, last, se måleresultatet i seriell portmonitor. Hvis alt fungerer, fortsett til neste trinn.

Femte etappe. sammenstilling hjem værstasjoner på GY-BMP280-3.3 og Ds18b20.
Vi monterer enheten i henhold til ordningen:

Jeg mottok koden for enheten ved å kombinere alle eksemplene i ett og sette utdataene på LDC-skjermen. Her er hva jeg fikk:

// Uncomment for en programvareimplementering av I2C-bussen: //
// #definere pin_SW_SDA 3 // Tildel enhver Arduino-pinne til å fungere som en SDA-linje i I2C-programvarebussen.
// #definere pin_SW_SCL 9 // Tildel enhver Arduino-pinne som skal fungere som en SCL-linje til I2C-programvarebussen.
// Uncomment for kompatibilitet med de fleste brett: //
#include
#include // Iarduino-biblioteket vil bruke metodene og funksjonene i Wire-biblioteket.
#include // Bibliotek for å arbeide LDC type 1602 på I2C-bussen

                                                            //
#include // Koble iarduino_Pressure_BMP-biblioteket til å fungere med BMP180 eller BMP280.
iarduino_Pressure_BMP sensor (0x76); // Forklar et sensorobjekt for arbeid med en trykksensor ved bruk av funksjonene og metodene i iarduino_Pressure_BMP-biblioteket.
LiquidCrystal_I2C lcd (0x3F, 16,2);
OneWire ds (10);
ugyldig oppsett () {
    lcd.init ();
    lcd.backlight ();
    Serial.begin (9600); // Start dataoverføring til seriell portmonitor på 9600 baud.
    forsinkelse (1000); // Vi venter på fullføring av transienter når vi bruker strøm
    sensor.begin (73); // Start arbeidet med sensoren. Den nåværende høyden vil bli tatt som 73 moh. - høyden på byen Buzuluk over havet
} //
void loop () {
// Les dataene og vis: temperatur i ° C, trykk i mm. rt., høydeendring i forhold til spesifisert i startfunksjonen (standard 0 meter).
lcd.setCursor (0,0); // definere utgangspunktet "P =" på LDC
lcd.print ("P =");
lcd.print (sensor.pressure / 1000.3); // del verdien av P utstedt av BMP280 med 1000 og angi utgangen på 3 desimaler
lcd.setCursor (12.0); // definere utgangspunktet "kPa" på LDC
lcd.print ("kPa");
lcd.set markør (0,1);
lcd.print ("T =");
lcd.print (sensor.temperature, 1); // angi utgangen på 1 desimal
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. ");}
    else {Serial.println ("HET OTBETA OT CEHCOPA");}
// Les dataene og vis: temperatur i ° C og trykk i Pa, trykk i mm. rt., høydeendring i forhold til spesifisert i startfunksjonen (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.");}
    else {Serial.println ("HET OTBETA OT CEHCOPA");}
    byte i;
  byte tilstede = 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);
    tilbake;
  }
  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!");
      tilbake;
  }
  Serial.println ();
  // den første ROM-byten indikerer hvilken brikke
  bytte (addr [0]) {
    sak 0x10:
      Serial.println ("Chip = DS18S20"); // eller gamle DS1820
      type_s = 1;
      break;
    sak 0x28:
      Serial.println ("Chip = DS18B20");
      type_s = 0;
      break;
    sak 0x22:
      Serial.println ("Chip = DS1822");
      type_s = 0;
      break;
    standard:
      Serial.println ("Enheten er ikke en DS18x20-familieenhet.");
      tilbake;
  }
  ds.reset ();
  ds.select (addr);
  ds.skrive (0x44, 1); // starte konvertering, med parasitt på på slutten
  
  forsinkelse (1000); // kanskje 750 ms er nok, kanskje ikke
  // vi kan gjøre en ds.depower () her, men tilbakestillingen vil ta vare på den.
  present = ds.reset ();
  ds.select (addr);
  ds.write (0xBE); // Les Scratchpad
  Serial.print ("Data =");
  Serial.print (nåværende, HEX);
  Serial.print ("");
  for (i = 0; i & lt; 9; i ++) {// vi trenger 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 faktisk temperatur
  // fordi resultatet er et 16-bits signert heltall, bør det
  // lagres i en "int16_t" type, som alltid er 16 biter
  // selv når den er satt sammen på en 32-bits prosessor.
  int16_t raw = (data [1] & lt; & lt; 8) | data [0];
  if (type_s) {
    rå = rå & lt; & lt; 3; // 9-bits oppløsning standard
    if (data [7] == 0x10) {
      // "count rest" gir full oppløsning på 12 bit
      raw = (raw & amp; 0xFFF0) + 12 - data [6];
    }
  } annet {
    byte cfg = (data [4] & 0x60);
    // ved lavere res er de lave bitene ikke definert, så la oss nullstille dem
    if (cfg == 0x00) raw = raw & amp; ~ 7; // 9 bit opplø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 bits oppløsning, konverteringstid på 750 ms
  }
  celsius = (flyter) 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 utgangspunktet "Tds =" på LDC
lcd.print ("Tds =");
lcd.print (celsius, 1);
    forsinkelse (3000);
}


Her er hva jeg fikk:


GY-BMP280-3.3-brettet gir ut trykk i pascalene, noe som ikke er veldig praktisk. Jeg kunne ikke løse problemet med hvordan lage GY-BMP280-3.3-kortet utdata for trykk i kilopascals. Jeg løste dette problemet på utgangslinjen på LDC-skjermen.

lcd.print (sensor.pressure / 1000.3); // del verdien av P utstedt av BMP280 med 1000 og angi utgangen på 3 desimaler
GY-BMP280-3.3-brettet gir også høydeverdier.

sensor.begin (73); // Start arbeidet med sensoren. Den nåværende høyden vil bli tatt som 73 moh. - høyden på byen Buzuluk over havet
Hvis du slapper av til sjøs og bytter “sensor.begin (73);” på "sensor.begin (0);" i koden, og deretter kompilere og lagre programmet til hjemme-værstasjonen på GY-BMP280-3.3 og Ds18b20, og gi et høydepunkt til LDC-skjermen, så får du også en høydemåler.
// lcd.setCursor (9,1);
// lcd.print ("H =");
// lcd.print (sensor.altitude, 1); // Skriv ut høydeverdiene i meter med ett desimal
Strømmen leveres til kretsen i min versjon via en USB-kabel. Du kan bruke en 5V / 600 mA lavspent boostpulsomformer og værstasjonen din blir bærbar. Denne typen strømforsyning er godt beskrevet i artikkel.

Vellykket samling!
5
8.8
6.3

Legg til en kommentar

    • smilersmilerxaxaokdontknowyahoonea
      sjefscratchlurejaja-jaaggressivhemmelighet
      beklagerdansedance2dance3benådninghjelpdrikkevarer
      stoppvennergodgoodgoodfløytebesvimelsetunge
      røykklappingCrayerklærehånligdon-t_mentionnedlasting
      heteirefullaugh1MDAmøtemoskingnegative
      not_ipopcornstraffeleseskremmeskremmersøk
      spydighetthank_youdetteto_clueumnikakuttenig
      dårligbeeeblack_eyeblum3rødmeskrytekjedsomhet
      sensurertpleasantrysecret2trueseieryusun_bespectacled
      ShokRespektlolPrevedvelkommenKrutoyya_za
      ya_dobryihelperne_huliganne_othodiFLUDforbudnær

Vi anbefaler deg å lese:

Gi den til smarttelefonen ...