» electronică » Arduino »Stația meteo la domiciliu pe GY-BMP280-3.3 și Ds18b20

Stația meteo la domiciliu pe GY-BMP280-3.3 și Ds18b20


Vreau să colectez fă-o singur instrument care va măsura presiunea și temperatura atmosferică. Senzorul de temperatură trebuie să fie la distanță și strâns, deoarece trebuie să măsoare temperatura la o anumită distanță de dispozitiv. Aș dori să am un astfel de dispozitiv portabil cu o gamă de lucru cuprinsă între -30 ° C și 50 ° C. Dar acest lucru necesită ca toate componentele să poată lucra în acest interval de temperatură. Componentele care pot funcționa într-un interval de temperatură extins sunt mai scumpe și este mai dificil să le cumpărați.
Pentru a-mi îndeplini visul în realitate, voi fi ajutat de consiliu, pe care l-am descris în articolul „Placă GY-BMP280-3.3 pentru măsurarea presiunii și temperaturii barometrice».

Din practică se știe că în timpul asamblării și configurației electronic înainte de fabricația sa, trebuie să verificați funcționalitatea tuturor materialelor și componentelor fiecăruia în parte. În caz contrar, puteți confunda ulterior și, în consecință, produsul electronic nu va funcționa și va fi foarte dificil să găsiți cauza defecțiunii.

Să începem.

Prima etapă. Instalați un shell software gratuit pe computer Arduino IDE pentru scrierea de programe (schițe), compilarea lor și apoi scrierea lor la microcontrolerul Mega328P instalat pe placă. Vă recomand să descărcați versiunea shell a ARDUINO 1.6.5. De ce? Inițial, proiectul ARDUINO a fost unul, acum dezvoltatorii s-au dispersat și continuă să dezvolte sistemul ARDUINO, dar fiecare în felul său, cu mici nuanțe. Am folosit versiunea ARDUINO 1.6.5. Ar trebui să fie instalat și testat pentru colaborare cu placa Arduino Uno folosind cele mai simple exemple.

A doua etapă. Verificăm placa GY-BMP280-3.3 pentru măsurarea presiunii și temperaturii barometrice. Luăm 4 fire, le conectăm GY-BMP280-3.3 și Arduino Uno, așa cum se arată în fotografie și diagramă. Curbele linii subțiri multicolore sunt conductoare.



Să începem să verificăm placa GY-BMP280-3.3. Pentru a face acest lucru, trebuie să instalați biblioteca în IDE Arduino, scrisă de programatorii care lucrează pe site. De regulă, după instalarea bibliotecii în Arduino IDE, apar exemple (mostre) de cod. Modificând ușor codul de eșantion, îl putem compila în date pe care le înțelege microcontrolerul, apoi îl putem trimite în memoria microcontrolerului. Puteți găsi un exemplu (eșantion), acordând atenție celor două fotografii de pe ecran de mai jos.


După scrierea datelor către microcontrolerul plăcii Arduino Uno, acesta începe imediat executarea programului (codului) și trimite datele prin cablu USB către computerul la care este conectată placa Arduino Uno.Și putem vedea rezultatul măsurării plăcii GY-BMP280-3.3 în fereastra IDE Arduino, numită „monitor port serial”.


Putem vedea rezultatul măsurătorilor pe placa GY-BMP280-3.3 din programul standard Windows Hyper Terminal, după închiderea shell-ului Arduino Uno și configurarea unei sesiuni în programul Hyper Terminal. Adică putem obține rezultatele plăcii GY-BMP280-3.3 conectând Arduino Uno la orice computer cu un cablu USB pe care este instalat driverul pentru placa Arduino Uno. Există mai multe biblioteci pentru lucrul cu GY-BMP280-3.3. Totul a funcționat pentru mine cu biblioteca. Fișierul descărcat de pe acest site va arăta astfel: bd7e4a37c1f4dba2ebde9b9cd49f45ce.zip. Trebuie redenumit ca: iarduino_Pressure_BMP.zip. Acum trebuie să instalăm biblioteca iarduino_Pressure_BMP în shell-ul IDE Arduino.


Lansați ID-ul Arduino, accesați meniul Sketch / Include Librari / Add.ZIP ... apoi selectați fișierul iarduino_Pressure_BMP.zip și faceți clic pe butonul Deschide. De asemenea, trebuie să instalați bibliotecile:,. După instalarea bibliotecilor, repornim shell-ul Arduino IDE, adică îl închidem și îl pornim din nou. Apoi selectați meniul File / Samples / iarduino Pressure BMP (senzori de presiune) / exemplu.

Vedem codul în fereastră.

Codul va trebui să fie ușor modificat.

În a cincea linie, îndepărtați două slashes „//” și adăugați (0x76) sau (0x77) în a unsprezecea linie. (0x76) este adresa plăcii barometrului. Placa mea GY-BMP280-3.3 conectată la magistrala I2C s-a dovedit a avea aceeași adresă (0x76). Cum să aflați numărul dispozitivului conectat la magistrala I2C? Veți obține răspunsul la această întrebare citind articolul complet.

Deci, am fixat codul în fereastră, acum începem să verificăm și să compilăm codul din meniul Sketch / Check / Compile. Dacă verificarea și compilarea codului au succes, atunci în meniul Sketch / Load, începem înregistrarea programului în Arduino Uno.

Dacă descărcarea este reușită, atunci prin deschiderea monitorului portului serial din meniu: Instrumente / Serial Port Monitor, vom vedea datele trimise de placa GY-BMP280-3.3.

În imaginea următoare, rezultatul plăcii GY-BMP280-3.3 care lucrează pe un computer pe care nu este instalată shell-ul IDE Arduino. Datele sunt primite de programul PuTTY.

În același timp, a fost fotografiat un barometru aneroid de laborator, care a fost situat lângă placa GY-BMP280-3.3. Comparând citirile instrumentelor, tu însuți poți trage concluzii cu privire la precizia plăcii GY-BMP280-3.3. Barometru aneroid certificat de laboratorul de stat.


A treia etapă. Verificarea afișajului LCD cu modulul de interfață I2C. Găsim un afișaj LDC cu un modul de interfață care se conectează prin magistrala I2C la Arduino UNO.
Stația meteo la domiciliu pe GY-BMP280-3.3 și Ds18b20

Verificăm funcționarea acestuia folosind exemple din shell-ul IDE Arduino. Dar înainte de aceasta, determinăm adresa modulului de interfață. Modulul meu de interfață are o adresă de 0x3F. Am introdus această adresă în linia de schiță: LiquidCrystal_I2C lcd (0x3F, 16.2);
Am determinat această adresă folosind schița „scanerul adreselor dispozitivului I2C” descris în
Am lansat shell-ul IDE Arduino, din articolul am copiat codul programului și am lipit fereastra lui Arduino IDE.

Am început compilarea, apoi am scris codul pe placa UNO Arduino, la care au fost conectate placa GY-BMP280-3.3 și afișarea LDC cu modulul de interfață I2C. Apoi, în monitorul portului serial am obținut următorul rezultat. Modulul meu de interfață are o adresă de 0x3F.

A patra etapă. Verificarea senzorului de temperatură DS18b20. O conectăm după cum urmează.

OneWire Arduino Library pentru lucrul cu senzorul de temperatură DS18b20 este deja instalat.

Deschideți proba DS18x20_Temperatura, compilați, încărcați, urmăriți rezultatul măsurătorilor în monitorul portului serial. Dacă totul funcționează, treceți la pasul următor.

A cincea etapă. asamblare acasă stații meteo pe GY-BMP280-3.3 și Ds18b20.
Asamblam dispozitivul conform schemei:

Am primit codul dispozitivului combinând toate exemplele într-unul și setând ieșirea pe ecranul afișajului LDC. Iată ce am primit:

// Nerespectarea unei implementări software a magistralei I2C: //
// #define pin_SW_SDA 3 // Alocați orice pin Arduino să funcționeze ca o linie SDA a magistralei software I2C.
// #define pin_SW_SCL 9 // Alocați orice pin Arduino să funcționeze ca linie SCL la magistrala software I2C.
// Nerespectarea compatibilității cu majoritatea plăcilor: //
#include
#include // Biblioteca iarduino va folosi metodele și funcțiile bibliotecii Wire.
#include // Biblioteca pentru funcționarea LDC de tip 1602 pe magistrala I2C

                                                            //
#include // Conectați biblioteca iarduino_Pressure_BMP pentru a funcționa cu BMP180 sau BMP280.
iarduino_Pressure_BMP senzor (0x76); // Declarați un obiect senzor pentru lucrul cu un senzor de presiune utilizând funcțiile și metodele bibliotecii iarduino_Pressure_BMP.
LiquidCrystal_I2C lcd (0x3F, 16,2);
OneWire ds (10);
void setup () {
    lcd.init ();
    lcd.backlight ();
    Serial.begin (9600); // Inițiați transferul de date pe monitorul portului serial la 9600 baud.
    întârziere (1000); // Așteptăm finalizarea tranzitorilor la aplicarea puterii
    senzor.begin (73); // Începeți lucrul cu senzorul. Altitudinea actuală va fi luată ca 73 m. - înălțimea orașului Buzuluk deasupra nivelului mării
} //
void loop () {
// Citiți datele și afișați: temperatura în ° C, presiunea în mm. rt., modificarea înălțimii în raport cu cele specificate în funcția de început (implicit 0 metri).
lcd.setCursor (0,0); // definiți punctul de ieșire "P =" pe LDC
lcd.print ("P =");
lcd.print (senzor.presiune / 1000.3); // împărțiți valoarea P emisă de BMP280 la 1000 și setați ieșirea a 3 zecimale
lcd.setCursor (12.0); // definiți punctul de ieșire "kPa" pe LDC
lcd.print ("kPa");
lcd.setCursor (0,1);
lcd.print ("T =");
lcd.print (senzor.temperatura, 1); // setați ieșirea cu 1 zecimală
lcd.setCursor (6.1);
// lcd.print ("C");
// lcd.setCursor (9,1);
// lcd.print ("H =");
// lcd.print (senzor.altitudine, 1);
    if (sensor.read (1)) {Serial.println ((String) "CEHCOP BMP" + sensor.type + ": \ t P =" + sensor.pressure + "\ tMM.PT.CT, \ t T = "+ senzor.temperatura +" * C, \ t \ t B = "+ senzor.altitudine +" M. ");}
    else {Serial.println ("HET OTBETA OT CEHCOPA");}
// Citiți datele și afișarea: temperatura în ° C și presiunea în Pa, presiunea în mm. rt., modificarea înălțimii în raport cu cele specificate în funcția de început (implicit 0 metri).
    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 =" + senzor.altitudine + "M.");}
    else {Serial.println ("HET OTBETA OT CEHCOPA");}
    byte i;
  byte prezent = 0;
  tip byte_s;
  date de byte [12];
  byte addr [8];
  float celsius, fahrenheit;
  if (! ds.search (addr)) {
    Serial.println ("Nu mai sunt adrese.");
    Serial.println ();
    ds.reset_search ();
    întârziere (250);
    return;
  }
  Serial.print ("ROM =");
  pentru (i = 0; i & lt; 8; i ++) {
    Serial.write ('');
    Serial.print (addr [i], HEX);
  }
  if (OneWire :: crc8 (addr, 7)! = addr [7]) {
      Serial.println ("CRC nu este valid!");
      return;
  }
  Serial.println ();
  // primul octet ROM indică ce cip
  switch (addr [0]) {
    carcasa 0x10:
      Serial.println ("Chip = DS18S20"); // sau DS1820 vechi
      tip_s = 1;
      pauză;
    carcasa 0x28:
      Serial.println ("Chip = DS18B20");
      tip_s = 0;
      pauză;
    carcasa 0x22:
      Serial.println ("Chip = DS1822");
      tip_s = 0;
      pauză;
    implicit:
      Serial.println ("Dispozitivul nu este un dispozitiv familial DS18x20.");
      return;
  }
  resetare ();
  ds.select (addr);
  ds.write (0x44, 1); // începe conversia, cu pornirea parazitului la sfârșit
  
  întârziere (1000); // poate 750ms este suficient, poate nu
  // am putea face aici un ds.dower (), dar resetarea va avea grijă de el.
  prezent = ds.reset ();
  ds.select (addr);
  ds.write (0xBE); // Citiți Scratchpad
  Serial.print ("Date =");
  Serial.print (prezent, HEX);
  Serial.print ("");
  for (i = 0; i & lt; 9; i ++) {// avem nevoie de 9 octeți
    date [i] = ds.read ();
    Serial.print (date [i], HEX);
    Serial.print ("");
  }
  Serial.print ("CRC =");
  Serial.print (OneWire :: crc8 (date, 8), HEX);
  Serial.println ();
  // Convertiți datele la temperatura reală
  // deoarece rezultatul este un număr întreg semnat pe 16 biți, ar trebui
  // să fie stocate la un tip "int16_t", care este întotdeauna 16 biți
  // chiar și atunci când este compilat pe un procesor pe 32 de biți.
  int16_t brut = (date [1] & lt; & lt; 8) | date [0];
  if (type_s) {
    raw = raw & lt; & lt; 3; // implicit rezolvare 9 biți
    if (date [7] == 0x10) {
      // „count rămâne” dă o rezoluție completă de 12 biți
      raw = (raw & amp; 0xFFF0) + 12 - date [6];
    }
  } altfel {
    byte cfg = (date [4] & 0x60);
    // la rezoluții inferioare, biții joși nu sunt definiți, deci să le zero
    if (cfg == 0x00) raw = raw & amp; ~ 7; // Rezoluție 9 biți, 93,75 ms
    altfel if (cfg == 0x20) raw = raw & amp; ~ 3; // 10 bit res, 187,5 ms
    altfel if (cfg == 0x40) raw = raw & amp; ~ 1; // 11 bit res, 375 ms
    //// implicit este rezoluția pe 12 biți, timp de conversie de 750 ms
  }
  celsius = (float) raw / 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); // definiți punctul de ieșire "Tds =" pe LDC
lcd.print ("Tds =");
lcd.print (celsius, 1);
    întârziere (3000);
}


Iată ce am primit:


Placa GY-BMP280-3.3 produce presiune în pascali, ceea ce nu este foarte convenabil. Nu am putut rezolva problema modului de a face datele de presiune de ieșire a placii GY-BMP280-3.3 în kilopascali. Am rezolvat această problemă în linia de ieșire a afișajului LDC.

lcd.print (senzor.presiune / 1000.3); // împărțiți valoarea P emisă de BMP280 la 1000 și setați ieșirea a 3 zecimale
Placa GY-BMP280-3.3 oferă, de asemenea, valori de altitudine.

senzor.begin (73); // Începeți lucrul cu senzorul. Altitudinea actuală va fi luată ca 73 m. - înălțimea orașului Buzuluk deasupra nivelului mării
Dacă vă relaxați la mare și schimbați „senzor.begin (73);” pe „sensor.begin (0);" în cod, apoi compilați și salvați programul la stația meteo de acasă pe GY-BMP280-3.3 și Ds18b20 și faceți o ieșire în înălțime pe afișajul LDC, veți obține și un altimetru.
// lcd.setCursor (9,1);
// lcd.print ("H =");
// lcd.print (senzor.altitudine, 1); // Tipăriți valorile înălțimii în metri cu o zecimă
Alimentarea este furnizată circuitului în versiunea mea printr-un cablu USB. Puteți utiliza un convertor de impuls cu impuls de joasă tensiune de 5V / 600 mA, iar stația dvs. meteorologică va deveni portabilă. Acest tip de alimentare este bine descris în articol.

Compilație de succes!
5
8.8
6.3

Adaugă un comentariu

    • zâmbetzâmbetexaxabinedontknowYahooNea
      șefzgârieturăpăcălidada-daagresivsecret
      scuzedansdance2dance3iertareajutorbăuturi
      oprireprietenibungoodgoodfluiersincopălimbă
      fumaplauzeCrayvestimbatjocoritorDon-t_mentiondescărcare
      căldurămânioslaugh1mdaîntâlniremoskingnegativ
      not_ifloricele de porumbpedepsicititsperiasperiecăutare
      batjocurăthank_youacestto_clueUmnikacutconveni
      răubeeeblack_eyeblum3roșilăudăroșenieplictiseală
      cenzuratpleasantrysecret2amenințavictorieyusun_bespectacled
      ShokRespektlolprevedbun venitKrutoyya_za
      ya_dobryiajutorne_huliganne_othodifludinterdicțieînchide

Vă sfătuim să citiți:

Înmânează-l pentru smartphone ...