Gusto kong mangolekta gawin mo mismo instrumento na susukat sa presyon at temperatura ng atmospheric. Ang sensor ng temperatura ay dapat na malayuan at mahigpit, dahil dapat itong masukat ang temperatura sa isang tiyak na distansya mula sa aparato. Gusto kong magkaroon ng tulad ng isang portable na aparato na may nagtatrabaho saklaw mula -30 ° C hanggang 50 ° C. Ngunit kinakailangan nito na ang lahat ng mga sangkap ay maaaring gumana sa saklaw ng temperatura na ito. Ang mga sangkap na maaaring gumana sa isang pinalawak na saklaw ng temperatura ay mas mahal, at mas mahirap bilhin ito.
Upang matupad ang aking pangarap sa katotohanan, tutulungan ako ng lupon, na inilarawan ko sa artikulong "GY-BMP280-3.3 board para sa pagsukat ng presyon at temperatura ng barometric».
Mula sa kasanayan, kilala na sa panahon ng pagpupulong at pagsasaayos electronic mga produkto bago ang paggawa nito, kailangan mong suriin ang kakayahang magamit ng lahat ng mga materyales at sangkap ng bawat isa nang hiwalay. Kung hindi man, maaari kang malito sa ibang pagkakataon, at bilang isang resulta, ang elektronikong produkto ay hindi gagana, at magiging napakahirap na mahanap ang sanhi ng madepektong paggawa.
Magsimula tayo.
Unang yugto. Mag-install ng isang libreng software na shell sa iyong computer Arduino Ang IDE para sa mga programa ng pagsulat (sketsa), pag-compile ng mga ito at pagkatapos ay isulat ang mga ito sa microcontroller ng Mega328P na naka-install sa board. Inirerekumenda kong i-download ang bersyon ng shell ng ARDUINO 1.6.5. Bakit? Sa una, ang proyekto ng ARDUINO ay isa, ngayon ay nagkalat ang mga nag-develop at patuloy na binuo ang sistema ng ARDUINO, ngunit ang bawat isa sa sarili nitong paraan, na may maliit na nuances. Gumamit ako ng bersyon ARDUINO 1.6.5. Dapat itong mai-install at masuri para sa pakikipagtulungan sa Arduino Uno board gamit ang pinakasimpleng mga halimbawa.
Pangalawang yugto. Nasuri namin ang GY-BMP280-3.3 board para sa pagsukat ng presyon at temperatura ng barometric. Kumuha kami ng 4 na mga wire, ikinonekta namin ang mga ito GY-BMP280-3.3 at Arduino Uno, tulad ng ipinapakita sa larawan at diagram. Ang mga curve manipis na multi-kulay na linya ay conductor.
Simulan nating suriin ang GY-BMP280-3.3 board. Upang gawin ito, kailangan mong i-install ang library sa Arduino IDE, na isinulat ng mga programmer na nagtatrabaho sa site. Bilang isang patakaran, pagkatapos i-install ang library sa Arduino IDE, lilitaw ang mga halimbawa (mga halimbawa) ng code. Sa pamamagitan ng bahagyang pagpapalit ng sample code, maaari nating isulat ito sa data na nauunawaan ng microcontroller, at pagkatapos ay ipadala ito sa memorya ng microcontroller. Maaari kang makahanap ng isang halimbawa (sample) sa pamamagitan ng pagbibigay pansin sa dalawang mga larawan sa ibaba.
Matapos isulat ang data sa microcontroller ng Arduino Uno board, agad itong nagsisimula sa pagsasagawa ng programa (code) at ipinapadala ang data sa pamamagitan ng USB cable sa computer kung saan nakakonekta ang Arduino Uno board.At makikita natin ang resulta ng pagsukat ng GY-BMP280-3.3 board sa Arduino IDE window, na tinawag na "serial port monitor".
Maaari naming makita ang resulta ng mga sukat sa board na GY-BMP280-3.3 sa karaniwang programa ng Windows Hyper Terminal, matapos na isara ang shell ng Arduino Uno at mag-set up ng isang session sa programa ng Hyper Terminal. Iyon ay, makakakuha kami ng mga resulta ng lupon ng GY-BMP280-3.3 sa pamamagitan ng pagkonekta sa Arduino Uno sa anumang computer na may isang USB cable kung saan naka-install ang driver para sa Arduino Uno board. Mayroong maraming mga aklatan para sa pagtatrabaho sa GY-BMP280-3.3. Lahat ay nagtrabaho para sa akin sa library. Ang file na iyong nai-download mula sa site na ito ay magiging ganito: bd7e4a37c1f4dba2ebde9b9cd49f45ce.zip. Kailangan itong palitan ng pangalan bilang: iarduino_Pressure_BMP.zip. Ngayon kailangan nating i-install ang iarduino_Pressure_BMP library sa shell ng Arduino IDE.
Ilunsad ang Arduino IDE, pumunta sa Sketch / Isama ang Librari / Add.ZIP Library menu ... pagkatapos ay piliin ang iarduino_Pressure_BMP.zip file at i-click ang Open button. Kailangan mo ring i-install ang mga aklatan:,. Matapos i-install ang mga aklatan, reboot namin ang Arduino IDE shell, iyon ay, isara ito at simulan itong muli. Pagkatapos ay piliin ang menu File / Samples / iarduino Pressure BMP (pressure sensor) / halimbawa.
Nakita namin ang code sa window.
Ang code ay kailangang bahagyang mabago.
Sa ikalimang linya, alisin ang dalawang slashes na "//" at idagdag (0x76) o (0x77) sa labing-isang linya. (0x76) ay ang address ng barometer board. Ang aking GY-BMP280-3.3 board na nakakonekta sa I2C bus ay may parehong address (0x76). Paano malaman ang bilang ng aparato na nakakonekta sa I2C bus? Makakakuha ka ng sagot sa tanong na ito sa pamamagitan ng pagbabasa ng buong artikulo.
Kaya, naayos namin ang code sa window, ngayon nagsisimula kaming suriin at isama ang code sa menu Sketch / Check / Compile. Kung ang pagpapatunay at pagsasama-sama ng code ay matagumpay, pagkatapos sa menu ng Sketch / Load, sisimulan namin ang pagrekord ng programa sa Arduino Uno.
Kung ang pag-download ay matagumpay, pagkatapos ay sa pamamagitan ng pagbubukas ng serial port monitor sa menu: Mga tool / Serial Port Monitor, makikita namin ang data na ipinadala ng GY-BMP280-3.3 board.
Sa sumusunod na screenshot, ang resulta ng board na GY-BMP280-3.3 sa isang computer kung saan hindi na-install ang shell ng Arduino IDE. Ang data ay natanggap ng programang PuTTY.
Kasabay nito, isang laboratoryo aneroid barometer ang nakuhanan ng litrato, na matatagpuan sa tabi ng lupon ng GY-BMP280-3.3. Sa pamamagitan ng paghahambing ng mga pagbasa ng instrumento, maaari ka mismo makagawa ng mga konklusyon tungkol sa kawastuhan ng GY-BMP280-3.3 board. Aneroid barometer na sertipikado ng laboratoryo ng estado.
Pangatlong yugto. Sinusuri ang LCD display kasama ang module ng interface ng I2C. Nakakahanap kami ng isang LDC display na may isang module ng interface na kumokonekta sa pamamagitan ng I2C bus sa Arduino UNO.
Sinusuri namin ang operasyon nito gamit ang mga halimbawa mula sa shell ng Arduino IDE. Ngunit bago iyon, tinutukoy namin ang address ng module ng interface. Ang aking interface ng module ay may isang address ng 0x3F. Ipinasok ko ang address na ito sa linya ng sketsa: LiquidCrystal_I2C lcd (0x3F, 16.2);
Natukoy ko ang address na ito gamit ang "I2C aparato address scanner" sketch na inilarawan sa.
Inilunsad ko ang shell ng Arduino IDE, mula sa artikulong kinopya ko ang code ng programa at naipasa ang window ng Arduino IDE.
Sinimulan ko ang pag-iipon, pagkatapos ay isinulat ko ang code sa Arduino UNO board, kung saan ang GY-BMP280-3.3 board at ang LDC na may module ng interface ng I2C ay konektado. Pagkatapos sa serial port monitor nakuha ko ang sumusunod na resulta. Ang aking interface ng module ay may isang address ng 0x3F.
Pang-apat na yugto. Sinusuri ang sensor ng temperatura ng DS18b20. Ikinonekta namin ito tulad ng mga sumusunod.
Ang OneWire Arduino Library para sa pagtatrabaho sa sensor ng temperatura ng DS18b20 ay na-install na.
Buksan ang DS18x20_Temperature sample, sumulat ng libro, mag-load, panoorin ang resulta ng pagsukat sa serial port monitor. Kung gumagana ang lahat, magpatuloy sa susunod na hakbang.
Ikalimang yugto. Assembly bahay mga istasyon ng panahon sa GY-BMP280-3.3 at Ds18b20.
Pinagsasama namin ang aparato ayon sa scheme:
Natanggap ko ang code para sa aparato sa pamamagitan ng pagsasama ng lahat ng mga halimbawa sa isa at pagtatakda ng output sa LDC display screen. Narito kung ano ang nakuha ko:
// Uncomment para sa isang pagpapatupad ng software ng bus na I2C: //
// #define pin_SW_SDA 3 // Magtalaga ng anumang Arduino pin upang gumana bilang isang linya ng SDA ng I2C software bus.
// #define pin_SW_SCL 9 // Magtalaga ng anumang Arduino pin upang gumana bilang isang linya ng SCL sa I2C software bus.
// Uncomment para sa pagiging tugma sa karamihan ng mga board: //
#nagsama
#include // Ang library ng iarduino ay gagamitin ang mga pamamaraan at pagpapaandar ng Wire library.
#include // Library para sa pagtatrabaho ng uri ng LDC 1602 sa bus na I2C
//
#include // Ikonekta ang iarduino_Pressure_BMP library upang gumana sa BMP180 o BMP280.
iarduino_Pressure_BMP sensor (0x76); // Ipahayag ang isang object ng sensor para sa pagtatrabaho sa isang sensor ng presyon gamit ang mga pag-andar at pamamaraan ng iarduino_Pressure_BMP library.
LiquidCrystal_I2C lcd (0x3F, 16.2);
OneWire ds (10);
walang pag-setup () {
lcd.init ();
lcd.backlight ();
Serial.begin (9600); // Simulan ang paglipat ng data sa serial port monitor sa 9600 baud.
pagkaantala (1000); // Naghihintay kami para sa pagkumpleto ng mga transients kapag nag-aaplay ng kapangyarihan
sensor.begin (73); // Ipasimulan ang trabaho kasama ang sensor. Ang kasalukuyang taas ay dadalhin bilang 73 m - ang taas ng lungsod ng Buzuluk sa itaas ng antas ng dagat
} //
walang bisa na loop () {
// Basahin ang data at ipakita: temperatura sa ° C, presyon sa mm. rt., pagbabago sa taas na may kaugnayan sa tinukoy sa simula ng pag-andar (default 0 metro).
lcd.setCursor (0,0); // tukuyin ang output point na "P =" sa LDC
lcd.print ("P =");
lcd.print (sensor.pressure / 1000.3); // hatiin ang halaga ng P na inilabas ng BMP280 sa pamamagitan ng 1000 at itakda ang output ng 3 decimal lugar
lcd.setCursor (12.0); // tukuyin ang output point na "kPa" sa LDC
lcd.print ("kPa");
lcd.setCursor (0,1);
lcd.print ("T =");
lcd.print (sensor.temperature, 1); // itakda ang output ng 1 decimal lugar
lcd.setCursor (6.1);
// lcd.print ("C");
// lcd.setCursor (9,1);
// lcd.print ("H =");
// lcd.print (sensor.altitude, 1);
kung (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 = "+ sensor.altitude +" M. ");}
iba pa {Serial.println ("HET OTBETA OT CEHCOPA");}
// Basahin ang data at ipakita: temperatura sa ° C at presyon sa Pa, presyon sa mm. rt., pagbabago sa taas na may kaugnayan sa tinukoy sa simula ng pag-andar (default 0 metro).
kung (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.");}
iba pa {Serial.println ("HET OTBETA OT CEHCOPA");}
byte i;
byte kasalukuyan = 0;
mga byte type_s;
data ng bait [12];
byte addr [8];
float celsius, fahrenheit;
kung (! ds.search (addr)) {
Serial.println ("Wala nang mga address.");
Serial.println ();
ds.reset_search ();
pagkaantala (250);
bumalik
}
Serial.print ("ROM =");
para sa (i = 0; i & lt; 8; i ++) {
Serial.write ('');
Serial.print (addr [i], HEX);
}
kung (OneWire :: crc8 (addr, 7)! = addr [7]) {
Serial.println ("Hindi wasto ang CRC!");
bumalik
}
Serial.println ();
// ang unang ROM byte ay nagpapahiwatig kung aling chip
lumipat (addr [0]) {
kaso 0x10:
Serial.println ("Chip = DS18S20"); // o matandang DS1820
type_s = 1;
masira;
kaso 0x28:
Serial.println ("Chip = DS18B20");
type_s = 0;
masira;
kaso 0x22:
Serial.println ("Chip = DS1822");
type_s = 0;
masira;
default:
Serial.println ("Ang aparato ay hindi isang aparato ng pamilya ng DS18x20.");
bumalik
}
ds.reset ();
ds.select (addr);
ds.write (0x44, 1); // simulan ang conversion, na may kapangyarihan ng parasito sa dulo
pagkaantala (1000); // siguro 750ms ay sapat na, siguro hindi
// maaari naming gawin ang isang ds.depower () dito, ngunit ang pag-reset ay mag-aalaga dito.
kasalukuyan = ds.reset ();
ds.select (addr);
ds.write (0xBE); // Basahin ang Scratchpad
Serial.print ("Data =");
Serial.print (kasalukuyan, HEX);
Serial.print ("");
para sa (i = 0; i & lt; 9; i ++) {// kailangan namin ng 9 bait
data [i] = dread ();
Serial.print (data [i], HEX);
Serial.print ("");
}
Serial.print ("CRC =");
Serial.print (OneWire :: crc8 (data, 8), HEX);
Serial.println ();
// I-convert ang data sa aktwal na temperatura
// dahil ang resulta ay isang 16 bit na naka-sign integer, dapat
// nakaimbak sa isang "int16_t" na uri, na laging 16 na piraso
// kahit na pinagsama-sama sa isang 32 bit na processor.
int16_t raw = (data [1] & lt; & lt; 8) | data [0];
kung (type_s) {
hilaw = raw & lt; & lt; 3; / Default default ang 9 na resolution
kung (data [7] == 0x10) {
// "count remain" ay nagbibigay ng buong 12 bit na resolution
raw = (raw & amp; 0xFFF0) + 12 - data [6];
}
} iba pa {
byte cfg = (data [4] & amp; 0x60);
// sa mas mababang res, ang mga mababang piraso ay hindi natukoy, kaya't zero ang mga ito
kung (cfg == 0x00) raw = raw & amp; ~ 7; // 9 bit na resolusyon, 93.75 ms
kung hindi man kung (cfg == 0x20) raw = raw & amp; ~ 3; // 10 bit res, 187.5 ms
kung hindi man kung (cfg == 0x40) raw = raw & amp; ~ 1; // 11 bit res, 375 ms
//// default ay 12 bit na resolution, 750 ms oras ng pag-convert
}
celsius = (float) raw / 16.0;
fahrenheit = celsius * 1.8 + 32.0;
Serial.print ("Temperatura =");
Serial.print (celsius);
Serial.print ("Celsius,");
Serial.print (fahrenheit);
Serial.println ("Fahrenheit");
lcd.setCursor (8.1); // tukuyin ang punto ng output na "Tds =" sa LDC
lcd.print ("Tds =");
lcd.print (celsius, 1);
pagkaantala (3000);
}
Narito kung ano ang nakuha ko:
Ang board ng GY-BMP280-3.3 ay nagbibigay ng presyon sa mga pascals, na hindi masyadong maginhawa. Hindi ko malulutas ang problema kung paano makagawa ang data ng presyon ng board ng GY-BMP280-3.3 sa kilopascals. Nalutas ko ang problemang ito sa linya ng output ng LDC display.
lcd.print (sensor.pressure / 1000.3); // hatiin ang halaga ng P na inilabas ng BMP280 sa pamamagitan ng 1000 at itakda ang output ng 3 decimal lugar
Nagbibigay din ang lupon ng GY-BMP280-3.3 ng mga halaga ng taas.
sensor.begin (73); // Ipasimulan ang trabaho kasama ang sensor. Ang kasalukuyang taas ay dadalhin bilang 73 m - ang taas ng lungsod ng Buzuluk sa itaas ng antas ng dagat
Kung magpapahinga ka sa dagat at baguhin ang "sensor.begin (73);" sa "sensor.begin (0);" sa code, at pagkatapos ay iipon at i-save ang programa sa istasyon ng panahon ng tahanan sa GY-BMP280-3.3 at Ds18b20, at gumawa ng isang taas na output sa pagpapakita ng LDC, makakakuha ka rin ng isang altimeter.
// lcd.setCursor (9,1);
// lcd.print ("H =");
// lcd.print (sensor.altitude, 1); // I-print ang mga halaga ng taas sa mga metro na may isang lugar na desimal
Ang kapangyarihan ay ibinibigay sa circuit sa aking bersyon sa pamamagitan ng isang USB cable. Maaari kang gumamit ng isang 5V / 600 mA na mababang boltahe na nagpapagaling ng pulso converter at ang iyong istasyon ng panahon ay magiging portable. Ang ganitong uri ng power supply ay mahusay na inilarawan sa artikulo.
Ang matagumpay na compilation!