» Elektronik » Arduino »Stesen cuaca rumah pada GY-BMP280-3.3 dan Ds18b20

Stesen cuaca rumah di GY-BMP280-3.3 dan Ds18b20


Saya mahu mengumpul lakukan sendiri alat yang akan mengukur tekanan atmosfera dan suhu. Sensor suhu mesti jauh dan ketat, kerana ia mesti mengukur suhu pada jarak tertentu dari peranti. Saya ingin mempunyai peranti mudah alih sedemikian dengan rangkaian kerja dari -30 ° C hingga 50 ° C. Tetapi ini memerlukan semua komponen dapat berfungsi dalam julat suhu ini. Komponen yang boleh berfungsi dalam julat suhu yang lebih tinggi adalah lebih mahal, dan ia lebih sukar untuk dibeli.
Untuk memenuhi impian saya menjadi kenyataan, saya akan dibantu oleh lembaga, yang saya nyatakan dalam artikel "GY-BMP280-3.3 papan untuk mengukur tekanan barometrik dan suhu».

Daripada amalan, diketahui bahawa semasa pemasangan dan konfigurasi elektronik produk sebelum pembuatannya, anda perlu menyemak kebolehpasaran semua bahan dan komponen masing-masing secara berasingan. Jika tidak, anda boleh keliru kemudian, dan hasilnya, produk elektronik tidak akan berfungsi, dan ia akan menjadi sangat sukar untuk mencari punca kerosakan tersebut.

Mari bermula.

Peringkat pertama. Pasang shell perisian percuma pada komputer anda Arduino IDE untuk program penulisan (lakaran), menyusunnya dan kemudian menulisnya kepada mikropengawal Mega328P yang dipasang di papan. Saya cadangkan anda memuat turun versi shell ARDUINO 1.6.5. Mengapa? Pada mulanya, projek ARDUINO adalah satu, sekarang pemaju telah tersebar dan terus mengembangkan sistem ARDUINO, tetapi masing-masing dengan caranya sendiri, dengan nuansa kecil. Saya menggunakan versi ARDUINO 1.6.5. Ia harus dipasang dan diuji untuk kerjasama dengan lembaga Arduino Uno menggunakan contoh yang paling mudah.

Peringkat kedua. Kami menyemak papan GY-BMP280-3.3 untuk mengukur tekanan barometrik dan suhu. Kami mengambil 4 wayar, kami menyambungkannya GY-BMP280-3.3 dan Arduino Uno, seperti yang ditunjukkan dalam gambar dan gambar rajah. Keluk kurus garis berwarna-warni adalah konduktor.



Mari mulakan memeriksa papan GY-BMP280-3.3. Untuk melakukan ini, anda perlu memasang perpustakaan di Arduino IDE, yang ditulis oleh pengaturcara yang bekerja di laman web ini. Sebagai peraturan, selepas memasang pustaka dalam Arduino IDE, contoh (sampel) kod muncul. Dengan sedikit mengubah kod sampel, kita boleh menyusunnya ke dalam data yang difahami oleh mikropengawal, dan kemudian hantar ke memori mikrokontroler. Anda boleh mencari contoh (sampel) dengan memberi perhatian kepada dua gambar skrin di bawah.


Setelah menulis data ke mikrokontroler papan Arduino Uno, ia segera mula melaksanakan program (kod) dan menghantar data melalui kabel USB ke komputer yang mana papan Arduino Uno dihubungkan.Dan kita dapat melihat hasil pengukuran papan GY-BMP280-3.3 dalam tetingkap Arduino IDE, yang dipanggil "monitor port bersiri".


Kita dapat melihat hasil pengukuran pada papan GY-BMP280-3.3 dalam program Windows Hyper Terminal standard, selepas menutup shell Arduino Uno dan membuat sesi dalam program Terminal Hyper. Iaitu, kita boleh mendapatkan keputusan papan GY-BMP280-3.3 dengan menyambung Arduino Uno ke mana-mana komputer dengan kabel USB di mana pemandu untuk papan Arduino Uno dipasang. Terdapat beberapa perpustakaan untuk bekerja dengan GY-BMP280-3.3. Semuanya bekerja untuk saya dengan perpustakaan. Fail yang anda muat turun dari laman web ini akan kelihatan seperti ini: bd7e4a37c1f4dba2ebde9b9cd49f45ce.zip. Ia perlu dinamakan semula sebagai: iarduino_Pressure_BMP.zip. Sekarang kita perlu memasang pustaka iarduino_Pressure_BMP dalam shell IDE Arduino.


Lancarkan IDE Arduino, pergi ke menu Sketch / Include Librari / Add.ZIP Library ... kemudian pilih fail iarduino_Pressure_BMP.zip dan klik butang Buka. Anda juga perlu memasang pustaka:,. Setelah memasang perpustakaan, kami reboot shell Arduino IDE, iaitu menutupnya dan mulailahnya semula. Kemudian pilih menu / Contoh / iarduino Tekanan BMP (sensor tekanan) / contoh.

Kami melihat kod di tetingkap.

Kod ini perlu diubahsuai sedikit.

Dalam garisan kelima, keluarkan dua slash "//" dan tambahkan (0x76) atau (0x77) pada baris kesebelas. (0x76) ialah alamat papan barometer. Papan GY-BMP280-3.3 saya yang disambungkan ke bas I2C ternyata mempunyai alamat yang sama (0x76). Bagaimana untuk mengetahui bilangan peranti yang disambungkan ke bas I2C? Anda akan mendapat jawapan kepada soalan ini dengan membaca artikel penuh.

Oleh itu, kami menetapkan kod dalam tetingkap, kini kami mula menyemak dan menyusun kod dalam menu Sketch / Check / Compile. Sekiranya pengesahan dan kompilasi kod berjaya, maka dalam menu Sketch / Load, kita memulakan rakaman program di Arduino Uno.

Jika muat turun berjaya, maka dengan membuka monitor port bersiri dalam menu: Alat / Monitor Serial Port, kita akan melihat data yang dihantar oleh papan GY-BMP280-3.3.

Dalam tangkapan skrin berikut, hasil papan GY-BMP280-3.3 bekerja pada komputer di mana shell Arduino IDE tidak dipasang. Data diterima oleh program PuTTY.

Pada masa yang sama, barometer aneroid makmal telah difoto, yang terletak di sebelah papan GY-BMP280-3.3. Dengan membandingkan bacaan instrumen, anda sendiri boleh membuat kesimpulan mengenai ketepatan lembaga GY-BMP280-3.3. Barometer aneroid yang disahkan oleh makmal negeri.


Peringkat ketiga. Memeriksa paparan LCD dengan modul antara muka I2C. Kami mencari paparan LDC dengan modul antara muka yang menghubungkan melalui bas I2C ke Arduino UNO.
Stesen cuaca rumah di GY-BMP280-3.3 dan Ds18b20

Kami menyemak operasinya menggunakan contoh-contoh dari shell IDE Arduino. Tetapi sebelum itu, kita menentukan alamat modul antara muka. Modul antara muka saya mempunyai alamat 0x3F. Saya memasukkan alamat ini ke dalam garis lakaran: LiquidCrystal_I2C lcd (0x3F, 16.2);
Saya menentukan alamat ini menggunakan lakaran "pengimbas alamat peranti I2C" yang diterangkan di dalam.
Saya melancarkan shell IDE Arduino, dari artikel yang saya menyalin kod program dan menyisipkan tetingkap Arduino IDEnya.

Saya memulakan kompilasi, kemudian saya menulis kod ke papan UNO Arduino, yang papan GY-BMP280-3.3 dan paparan LDC dengan modul antara muka I2C disambungkan. Kemudian di monitor port siri saya mendapat hasil berikut. Modul antara muka saya mempunyai alamat 0x3F.

Peringkat keempat. Memeriksa sensor suhu DS18b20. Kami menyambungkannya seperti berikut.

Perpustakaan OneWire Arduino untuk bekerja dengan sensor suhu DS18b20 sudah dipasang.

Buka sampel DS18x20_Temperature, menyusun, memuatkan, menonton hasil pengukuran dalam monitor port bersiri. Jika semuanya berfungsi, terus ke langkah seterusnya.

Peringkat kelima. Perhimpunan rumah stesen cuaca pada GY-BMP280-3.3 dan Ds18b20.
Kami memasang peranti mengikut skema:

Saya menerima kod untuk peranti dengan menggabungkan semua contoh menjadi satu dan menetapkan output pada skrin paparan LDC. Inilah yang saya dapat:

// Uncomment untuk pelaksanaan perisian bas I2C: //
/ // #define pin_SW_SDA 3 // Berikan mana-mana pin Arduino untuk berfungsi sebagai bar SDA bas perisian I2C.
/ // #define pin_SW_SCL 9 // Berikan sebarang pin Arduino untuk beroperasi sebagai garis SCL ke bas perisian I2C.
// Uncomment untuk keserasian dengan kebanyakan papan: //
#include
#include // Perpustakaan iarduino akan menggunakan kaedah dan fungsi perpustakaan Wire.
#include // Perpustakaan untuk kerja LDC jenis 1602 pada bas I2C

                                                            //
#include // Sambungkan perpustakaan iarduino_Pressure_BMP untuk bekerjasama dengan BMP180 atau BMP280.
sensor iarduino_Pressure_BMP (0x76); // Nyatakan objek sensor untuk bekerja dengan sensor tekanan menggunakan fungsi dan kaedah pustaka iarduino_Pressure_BMP.
LiquidCrystal_I2C lcd (0x3F, 16.2);
OneWire ds (10);
void setup () {
    lcd.init ();
    lcd.backlight ();
    Serial.begin (9600); // Memulakan pemindahan data ke monitor port siri pada 9600 baud.
    kelewatan (1000); // Kami sedang menunggu penyempurnaan transien apabila menggunakan kuasa
    sensor.begin (73); // Memulakan kerja dengan sensor. Ketinggian semasa akan diambil sejauh 73 m - ketinggian bandar Buzuluk di atas paras laut
} //
kekosongan gelung () {
// Baca data dan paparan: suhu dalam ° C, tekanan dalam mm. rt., perubahan ketinggian berbanding dengan yang dinyatakan dalam fungsi mula (lalai 0 meter).
lcd.setCursor (0,0); // tentukan titik keluaran "P =" pada LDC
lcd.print ("P =");
lcd.print (sensor.pressure / 1000.3); // membahagi nilai P yang dikeluarkan oleh BMP280 sebanyak 1000 dan tetapkan output 3 tempat perpuluhan
lcd.setCursor (12.0); // tentukan titik keluaran "kPa" pada LDC
lcd.print ("kPa");
lcd.setCursor (0,1);
lcd.print ("T =");
lcd.print (sensor.temperature, 1); / // tetapkan output 1 tempat perpuluhan
lcd.setCursor (6.1);
// lcd.print ("C");
// lcd.setCursor (9,1);
// lcd.print ("H =");
// lcd.print (sensor.altitude, 1);
    jika (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. ");}
    lain {Serial.println ("HET OTBETA OT CEHOP");}
// Baca data dan paparan: suhu dalam ° C dan tekanan Pa, tekanan dalam mm. rt., perubahan ketinggian berbanding dengan yang dinyatakan dalam fungsi mula (lalai 0 meter).
    (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.");}
    lain {Serial.println ("HET OTBETA OT CEHOP");}
    byte i;
  byte present = 0;
  type_s byte;
  data bait [12];
  tambah bait [8];
  float celsius, fahrenheit;
  jika (! ds.search (addr)) {
    Serial.println ("Tiada alamat lagi.");
    Serial.println ();
    ds.reset_search ();
    kelewatan (250);
    kembali
  }
  Serial.print ("ROM =");
  untuk (i = 0; i & lt; 8; i ++) {
    Serial.write ('');
    Serial.print (addr [i], HEX);
  }
  jika (OneWire :: crc8 (addr, 7)! = addr [7]) {
      Serial.println ("CRC tidak sah!");
      kembali
  }
  Serial.println ();
  / // ROM pertama byte menunjukkan cip yang mana
  suis (addr [0]) {
    kes 0x10:
      Serial.println ("Chip = DS18S20"); // atau lama DS1820
      type_s = 1;
      pecah;
    kes 0x28:
      Serial.println ("Chip = DS18B20");
      type_s = 0;
      pecah;
    kes 0x22:
      Serial.println ("Chip = DS1822");
      type_s = 0;
      pecah;
    lalai:
      Serial.println ("Peranti bukan peranti keluarga DS18x20.");
      kembali
  }
  ds.reset ();
  ds.select (addr);
  ds.write (0x44, 1); // penukaran mula, dengan kuasa parasit pada akhir
  
  kelewatan (1000); / Mungkin 750ms cukup, mungkin tidak
  / / kami mungkin melakukan ds.depower () di sini, tetapi tetapan semula akan mengurusnya.
  sekarang = ds.reset ();
  ds.select (addr);
  ds.write (0xBE); // Baca Scratchpad
  Serial.print ("Data =");
  Serial.print (sekarang, HEX);
  Serial.print ("");
  untuk (i = 0; i & lt; 9; i ++) {// kita memerlukan 9 bait
    data [i] = ds.read ();
    Serial.print (data [i], HEX);
    Serial.print ("");
  }
  Serial.print ("CRC =");
  Serial.print (OneWire :: crc8 (data, 8), HEX);
  Serial.println ();
  // Mengkonversi data ke suhu sebenar
  // kerana hasilnya adalah integer ditandatangani 16 bit, ia sepatutnya
  / / disimpan ke jenis "int16_t", yang sentiasa 16 bit
  // walaupun dikompilasi pada pemproses 32 bit.
  int16_t raw = (data [1] & lt; & lt; 8) | data [0];
  jika (type_s) {
    mentah = mentah & lt; & lt; 3; / // 9 lalai resolusi lalai
    jika (data [7] == 0x10) {
      // "kiraan kekal" memberikan resolusi 12 bit penuh
      mentah = (mentah & amp; 0xFFF0) + 12 - data [6];
    }
  } else {
    byte cfg = (data [4] & amp; 0x60);
    / / pada res yang rendah, bit rendah tidak ditentukan, jadi mari sifar mereka
    jika (cfg == 0x00) mentah = mentah & amp; ~ 7; @ // 9 bit resolution, 93.75 ms
    lain jika (cfg == 0x20) mentah = mentah & amp; ~ 3; // 10 bit res, 187.5 ms
    lain jika (cfg == 0x40) mentah = mentah & amp; ~ 1; / / 11 bit res, 375 ms
    //// lalai ialah resolusi 12 bit, masa penukaran 750 ms
  }
  celsius = (terapung) mentah / 16.0;
  fahrenheit = celsius * 1.8 + 32.0;
  Serial.print ("Suhu =");
  Serial.print (celsius);
  Serial.print ("Celsius,");
  Serial.print (fahrenheit);
  Serial.println ("Fahrenheit");
lcd.setCursor (8.1); // tentukan titik keluaran "Tds =" pada LDC
lcd.print ("Tds =");
lcd.print (celsius, 1);
    kelewatan (3000);
}


Inilah yang saya dapat:


Papan GY-BMP280-3.3 memberi tekanan pada pascals, yang tidak begitu mudah. Saya tidak dapat menyelesaikan masalah bagaimana membuat data tekanan output papan GY-BMP280-3.3 dalam kilopascals. Saya menyelesaikan masalah ini di baris output paparan LDC.

lcd.print (sensor.pressure / 1000.3); // membahagi nilai P yang dikeluarkan oleh BMP280 sebanyak 1000 dan tetapkan output 3 tempat perpuluhan
Lembaga GY-BMP280-3.3 juga menyediakan nilai ketinggian.

sensor.begin (73); // Memulakan kerja dengan sensor. Ketinggian semasa akan diambil sejauh 73 m - ketinggian bandar Buzuluk di atas paras laut
Jika anda akan berehat di laut dan menukar "sensor.begin (73);" pada "sensor.begin (0);" dalam kod, dan kemudian menyusun dan menyimpan program tersebut ke stesen cuaca rumah pada GY-BMP280-3.3 dan Ds18b20, dan membuat output ketinggian ke paparan LDC, anda juga akan mendapat altimeter.
// lcd.setCursor (9,1);
// lcd.print ("H =");
// lcd.print (sensor.altitude, 1); // Mencetak nilai ketinggian dalam meter dengan satu tempat perpuluhan
Kuasa dibekalkan kepada litar dalam versi saya melalui kabel USB. Anda boleh menggunakan penukar denyut nadi voltan rendah 5V / 600 mA dan stesen cuaca anda akan menjadi mudah alih. Jenis bekalan kuasa ini diterangkan dengan baik dalam artikel.

Penyusunan yang berjaya!
5
8.8
6.3

Tambah komen

    • senyumtersenyumxaxaokdontknowyahoonea
      bosawalbodohyaya-yaagresifrahsia
      maaftariandance2dance3pengampunanmembantuminuman
      berhentikawan-kawanbaikgoodgoodwiseltolaklidah
      asapbertepuk tangancraymengisytiharkanderisivejangan dengarmuat turun
      panasberalunketawa1mdamesyuaratmoskingnegatif
      not_ipopcornmenghukumbacamenakutkanmenakutkancarian
      mengejekterima kasihinito_clueumnikakutbersetuju
      burukbeeeblack_eyeblum3memerahbermegahkebosanan
      ditapiskesenanganrahsia2mengancamkemenanganyusun_bespectacled
      shokrespektloldiingatiselamat datangkrutoyya_za
      ya_dobryipembantune_huliganne_othodifludlarangantutup

Kami menasihati anda untuk membaca:

Bawa ia untuk telefon pintar ...