Želim sakupljati učinite to sami instrument koji će mjeriti atmosferski tlak i temperaturu. Senzor temperature mora biti udaljen i nepropusan, jer mora mjeriti temperaturu na određenoj udaljenosti od uređaja. Volio bih imati takav prijenosni uređaj s radnim rasponom od -30 ° C do 50 ° C. Ali to zahtijeva da sve komponente mogu raditi u ovom temperaturnom rasponu. Komponente koje mogu raditi u proširenom temperaturnom rasponu skuplje su i teže ih je kupiti.
Da bih svoj san ostvario u stvarnosti, pomoći će mi odbor koji sam opisao u članku "GY-BMP280-3.3 ploča za mjerenje barometrijskog tlaka i temperature».
Iz prakse je poznato da tijekom montaže i konfiguriranja elektronički proizvoda prije njegove proizvodnje, morate provjeriti ispravnost svih materijala i komponenata svakog od njih zasebno. Inače se kasnije možete zbuniti, a kao rezultat toga, elektronički proizvod neće raditi, a bit će vrlo teško pronaći uzrok kvara.
Počnimo.
Prva faza, Instalirajte besplatnu softversku ljusku na svoje računalo Težak IDE za pisanje programa (skice), njihovo sastavljanje i zatim upisivanje u mikrokontroler Mega328P instaliran na ploči. Preporučujem vam da preuzmete verziju školjke ARDUINO 1.6.5. Zašto? U početku je projekt ARDUINO bio jedan, sada su se programeri raspršili i nastavljaju razvijati sustav ARDUINO, ali svaki na svoj način, s malim nijansama. Koristio sam verziju ARDUINO 1.6.5. Treba ga instalirati i testirati za suradnju s Arduino Uno pločom koristeći najjednostavnije primjere.
Druga faza, Provjeravamo ploču GY-BMP280-3.3 za mjerenje barometrijskog tlaka i temperature. Uzimamo 4 žice, povezujemo ih GY-BMP280-3.3 i Arduino Uno, kao što je prikazano na fotografiji i dijagramu. Kovrče tanke višebojne crte su vodiči.
Počnimo provjeriti ploču GY-BMP280-3.3. Da biste to učinili, morate instalirati knjižnicu u Arduino IDE, koji su napisali programeri koji rade na web mjestu. U pravilu, nakon instaliranja knjižnice u Arduino IDE, pojavljuju se primjeri (uzorci) koda. Laganom izmjenom uzorka koda, možemo ga sastaviti u podatke koje mikrokontroler razumije, a zatim ga poslati u memoriju mikrokontrolera. Primjer (uzorak) možete pronaći tako da obratite pozornost na dvije fotografije na ekranu u nastavku.
Nakon što upiše podatke u mikrokontroler ploče Arduino Uno, odmah započinje s izvršavanjem programa (koda) i podatke šalje putem USB kabela na računalo na koje je spojena ploča Arduino Uno.I možemo vidjeti rezultat mjerenja ploče GY-BMP280-3.3 u Arduino IDE prozoru, koji se naziva "monitor serijskog porta".
Rezultat mjerenja na ploči GY-BMP280-3.3 u standardnom programu Windows Hyper Terminal, nakon zatvaranja ljuske Arduino Uno i postavljanja sesije u programu Hyper Terminal. To jest, možemo dobiti rezultate ploče GY-BMP280-3.3 povezivanjem Arduino Uno-a na bilo koje računalo s USB kabelom na koji je instaliran upravljački program za Arduino Uno ploču. Postoji nekoliko knjižnica za rad s GY-BMP280-3.3. Sve mi je radilo s knjižnicom. Datoteka koju preuzmete s ove web stranice izgledat će ovako: bd7e4a37c1f4dba2ebde9b9cd49f45ce.zip. Treba ga preimenovati u: iarduino_Pressure_BMP.zip. Sada moramo instalirati knjižnicu iarduino_Pressure_BMP u ljusku Arduino IDE.
Pokrenite Arduino IDE, idite na izbornik Sketch / Include Librari / Add.ZIP Library ... zatim odaberite iarduino_Pressure_BMP.zip datoteku i kliknite gumb Open. Morate instalirati i biblioteke:,. Nakon što instaliramo knjižnice, ponovno pokrećemo Arduino IDE ljusku, odnosno zatvorimo je i pokrenemo ponovo. Zatim odaberite izbornik Datoteka / uzorci / iarduino tlaka BMP (tlačni senzori) / primjer.
Kod vidimo u prozoru.
Kôd će trebati malo izmijeniti.
U petom retku uklonite dvije crte "//" i dodajte (0x76) ili (0x77) u jedanaesti redak. (0x76) je adresa ploče barometra. Pokazalo se da je moja ploča GY-BMP280-3.3 spojena na I2C sabirnicu imala istu adresu (0x76). Kako saznati broj uređaja spojenog na I2C sabirnicu? Odgovor na to pitanje dobit ćete tako što ćete pročitati cijeli članak.
Dakle, kôd smo fiksirali u prozoru, sada započinjemo provjeru i sastavljanje koda u izborniku Sketch / Check / Compile. Ako su provjera i kompilacija koda uspješni, tada u izborniku Sketch / Load pokrećemo snimanje programa u Arduino Uno.
Ako je preuzimanje uspješno, otvorit ćemo monitor serijskog ulaza u izborniku: Alati / Monitor serijskog ulaza, vidjet ćemo podatke koje je poslala ploča GY-BMP280-3.3.
Na sljedećem snimku zaslona rezultat je ploča GY-BMP280-3.3 koja radi na računalu na kojem nije instalirana Arduino IDE školjka. Podatke prima PuTTY program.
Istodobno je fotografiran laboratorijski aneroidni barometar, koji se nalazio pored ploče GY-BMP280-3.3. Uspoređujući očitanja instrumenta, sami možete izvući zaključke o točnosti ploče GY-BMP280-3.3. Aneroidni barometar certificiran u državnoj laboratoriji.
Treća faza, Provjera LCD zaslona pomoću modula sučelja I2C. Pronalazimo LDC zaslon s modulom sučelja koji se preko I2C sabirnice povezuje na Arduino UNO.
Njezin rad provjeravamo na primjerima Arduino IDE školjke. Ali prije toga određujemo adresu modula sučelja. Moj sučelje modul ima adresu 0x3F. Umetnuo sam ovu adresu u liniju skice: LiquidCrystal_I2C lcd (0x3F, 16.2);
Ovu sam adresu odredio pomoću skice "Skener adresa uređaja I2C" opisanu u.
Pokrenuo sam Arduino IDE školjku, iz članka sam kopirao programski kod i zalijepio njegov Arduino IDE prozor.
Pokrenuo sam kompilaciju, a zatim sam zapisao kod na Arduino UNO ploču, na koju su spojeni ploča GY-BMP280-3.3 i LDC zaslon s I2C sučeljem. Zatim sam u monitoru serijskog porta dobio sljedeći rezultat. Moj sučelje modul ima adresu 0x3F.
Četvrta faza, Provjera DS18b20 osjetnika temperature. Povezujemo ga na sljedeći način.
Biblioteka OneWire Arduino za rad s senzorom temperature DS18b20 već je instalirana.
Otvorite uzorak temperature DS18x20_Temperature, kompilirajte, učitajte, gledajte rezultate mjerenja na monitoru serijskog porta. Ako sve uspije, prijeđite na sljedeći korak.
Peta faza, zbor dom meteorološke stanice na GY-BMP280-3.3 i Ds18b20.
Sastavljamo uređaj prema shemi:
Kôd za uređaj primio sam kombinirajući sve primjere u jedan i podešavajući izlaz na zaslonu LDC. Evo što sam dobio:
// Komentar za softversku implementaciju I2C sabirnice: //
// #define pin_SW_SDA 3 // Dodijelite bilo koji Arduino pin da djeluje kao SDA linija I2C softverske sabirnice.
// #define pin_SW_SCL 9 // Dodijelite bilo koji Arduino pin da djeluje kao SCL linija na softverskoj magistrali I2C.
// Komentar za kompatibilnost s većinom ploča: //
#include
#include // Knjižnica iarduino koristit će metode i funkcije žičane knjižnice.
#include // Biblioteka za rad LDC tipa 1602 na I2C magistrali
//
#include // Spojite iarduino_Pressure_BMP knjižnicu za rad s BMP180 ili BMP280.
iarduino_Pressure_BMP senzor (0x76); // Najavite objekt senzora za rad sa senzorom tlaka pomoću funkcija i metoda knjižnice iarduino_Pressure_BMP.
LiquidCrystal_I2C LCD (0x3F, 16,2);
OneWire DS (10);
poništavanje postave () {
lcd.init ();
lcd.backlight ();
Serijski počet (9600); // Inicirajte prijenos podataka na monitor serijskog porta brzinom od 9600 baud.
kašnjenje (1000); // Čekamo završetak prijelaznih razdoblja pri primjeni snage
sensor.begin (73); // Započnite rad sa senzorom. Trenutna visina uzima se kao 73 m. - visina grada Buzuluk nadmorske visine
} //
void petlja () {
// Pročitajte podatke i prikaz: temperatura u ° C, tlak u mm. rt., promjena visine u odnosu na specificiranu u početnoj funkciji (zadano 0 metara).
lcd.setCursor (0,0); // definirati izlaznu točku "P =" na LDC-u
lcd.print ("P =");
lcd.print (senzor.tlak / 1000.3); // podijeli vrijednost P koju je izdao BMP280 na 1000 i postavi izlaz 3 decimalna mjesta
lcd.setCursor (12,0); // definirati izlaznu točku "kPa" na LDC-u
lcd.print ("kPa");
lcd.setCursor (0,1);
lcd.print ("T =");
lcd.print (senzor.temperature, 1); // postaviti izlaz 1 decimalnog mjesta
lcd.setCursor (6.1);
// lcd.print ("C");
// lcd.setCursor (9,1);
// lcd.print ("H =");
// lcd.print (senzor. visina, 1);
if (sensor.read (1)) {Serial.println ((String) "CEHCOP BMP" + sensor.type + ": \ t P =" + sensor.pressure + "\ tMM.PT.CT, \ t T = "+ sensor.temperature +" * C, \ t \ t B = "+ senzor. visina +" M. ");}
else {Serial.println ("HET OTBETA OT CEHCOPA");}
// Pročitajte podatke i prikaz: temperatura u ° C i tlak u Pa, tlak u mm. rt., promjena visine u odnosu na specificiranu u početnoj funkciji (zadano 0 metara).
if (sensor.read (2)) {Serial.println ((String) "CEHCOP BMP" + sensor.type + ": \ t P =" + sensor.pressure + "\ tPa, \ t \ t T =" + senzor.temperature + "* C, \ t \ t B =" + senzor. visina + "M.");}
else {Serial.println ("HET OTBETA OT CEHCOPA");}
byte i;
bajt prisutan = 0;
byte type_s;
bajtni podaci [12];
dodatak bajtova [8];
plutaju Celzijus, Fahrenheit;
if (! ds.search (addr)) {
Serial.println ("Nema više adresa.");
Serijski.println ();
ds.reset_search ();
kašnjenje (250);
povratak;
}
Serial.print ("ROM =");
za (i = 0; i <8; i ++) {
Serial.write ('');
Serijski.print (addr [i], HEX);
}
if (OneWire :: crc8 (addr, 7)! = addr [7]) {
Serial.println ("CRC nije valjan!");
povratak;
}
Serijski.println ();
// prvi bajt ROM-a označava koji čip
sklopka (addr [0]) {
kućište 0x10:
Serial.println ("Chip = DS18S20"); // ili stari DS1820
type_s = 1;
razbiti;
kućište 0x28:
Serial.println ("Chip = DS18B20");
type_s = 0;
razbiti;
kućište 0x22:
Serial.println ("Chip = DS1822");
type_s = 0;
razbiti;
default:
Serial.println ("Uređaj nije obiteljski uređaj DS18x20.");
povratak;
}
ds.reset ();
ds.select (addr);
ds.write (0x44, 1); // započeti pretvorbu, s parazitskim napajanjem na kraju
kašnjenje (1000); // možda je 750ms dovoljno, možda nije
// mogli bismo ovdje napraviti ds.depower (), ali to će se pobrinuti za resetiranje.
prisutan = ds.reset ();
ds.select (addr);
ds.write (0xBE); // Pročitajte Scratchpad
Serial.print ("Podaci =");
Serijski otisak (prisutan, HEX);
Serijski.print ("");
za (i = 0; i <9; i ++) {// treba nam 9 bajtova
podaci [i] = ds.read ();
Serijski.print (podaci [i], HEX);
Serijski.print ("");
}
Serijski.print ("CRC =");
Serijski.print (OneWire :: crc8 (podaci, 8), HEX);
Serijski.println ();
// Pretvaranje podataka u stvarnu temperaturu
// jer je rezultat 16-bitni cijeli broj, trebao bi
// biti spremljen u "int16_t" tip, koji je uvijek 16 bita
// čak i kada se kompilira na 32-bitnom procesoru.
int16_t raw = (podaci [1] & 8) | podaci [0];
ako je (type_s) {
sirova = sirova & lt; 3; // zadana 9-bitna razlučivost
ako (podaci [7] == 0x10) {
// "count count остаće" daje punu 12-bitnu razlučivost
raw = (sirovi & 0xFFF0) + 12 - podaci [6];
}
} else {
byte cfg = (podaci [4] & 0x60);
// pri nižoj rezoluciji, niski bitovi su nedefinirani, pa ih nulajmo
ako je (cfg == 0x00) raw = raw & amp; ~ 7; // 9-bitna razlučivost, 93,75 ms
drugo ako je (cfg == 0x20) raw = raw & amp; ~ 3; // 10-bitna res, 187,5 ms
drugo ako je (cfg == 0x40) raw = raw & amp; ~ 1; // 11-bitna res, 375 ms
//// zadana je 12-bitna razlučivost, vrijeme pretvorbe 750 ms
}
celsius = (pluta) sirov / 16.0;
fahrenheit = celzijus * 1,8 + 32,0;
Serijski.print ("Temperatura =");
Serijski otisak (celzijus);
Serijski.print ("Celzijus");
Serijski otisak (fahrenheit);
Serial.println ("Fahrenheit");
lcd.setCursor (8.1); // definirati izlaznu točku "Tds =" na LDC-u
lcd.print ("Tds =");
lcd.print (celzija, 1);
kašnjenje (3000);
}
Evo što sam dobio:
GY-BMP280-3.3 ploča daje pritisak u paskalima, što nije baš prikladno. Nisam mogao riješiti problem kako napraviti podatke o izlaznom tlaku ploče GY-BMP280-3.3 u kilopaskalima. Ovaj problem sam riješio u izlaznoj liniji LDC zaslona.
lcd.print (senzor.tlak / 1000.3); // podijeli vrijednost P koju je izdao BMP280 na 1000 i postavi izlaz 3 decimalna mjesta
Ploča GY-BMP280-3.3 također nudi visinske vrijednosti.
sensor.begin (73); // Započnite rad sa senzorom. Trenutna visina uzet će se kao 73 m. - visina grada Buzuluk nadmorske visine
Ako se opustite na moru i promijenite "sensor.begin (73);" na "sensor.begin (0);" u kod, a zatim sastavite i spremite program na kućnu meteorološku stanicu na GY-BMP280-3.3 i Ds18b20 i napravite izlaz visine na LDC zaslon, dobit ćete i visinomjer.
// lcd.setCursor (9,1);
// lcd.print ("H =");
// lcd.print (senzor. visina, 1); // Ispišite vrijednosti visine u metrima s jednim decimalnim brojem
Napajanje se u mojoj verziji napaja putem USB kabela. Možete upotrijebiti 5V / 600 mA pojačani pretvarač impulsa i vaša će vremenska postaja postati prenosiva. Ova vrsta napajanja dobro je opisana u članak.
Uspješna kompilacija!