» elektronik » Arduino »GY-BMP280-3.3 ve Ds18b20'deki ev hava istasyonu

Ev hava istasyonu GY-BMP280-3.3 ve Ds18b20


Toplamak istiyorum kendin yap atmosferik basınç ve sıcaklığı ölçecek alet. Sıcaklık sensörü uzak ve sıkı olmalıdır, çünkü sıcaklığı cihazdan belirli bir mesafede ölçmelidir. Çalışma aralığı -30 ° C ila 50 ° C olan taşınabilir bir cihaza sahip olmak istiyorum. Ancak bu, tüm bileşenlerin bu sıcaklık aralığında çalışabilmesini gerektirir. Genişletilmiş sıcaklık aralığında çalışabilen bileşenler daha pahalıdır ve bunları satın almak daha zordur.
Hayalimi gerçeğe dönüştürmek için, yönetim kurulunda bana yardım edeceğim.Barometrik basınç ve sıcaklığı ölçmek için GY-BMP280-3.3 kartı».

Uygulamadan, montaj ve konfigürasyon sırasında elektronik üretimden önce, her bir malzemenin ve bileşenlerin servisini ayrı ayrı kontrol etmeniz gerekir. Aksi takdirde, daha sonra kafanız karışabilir ve sonunda elektronik ürün çalışmaz ve arızanın nedenini bulmak çok zor olacaktır.

Başlayalım.

İlk aşama. Bilgisayarınıza ücretsiz bir yazılım kabuğu yükleyin Arduino Programları (taslakları) yazmak, derlemek ve daha sonra bunları kartta kurulu olan Mega328P mikro denetleyicisine yazmak için IDE. ARDUINO 1.6.5'in kabuk sürümünü indirmenizi tavsiye ederim. Neden? Başlangıçta, ARDUINO projesi birdi, şimdi geliştiriciler ARDUINO sistemini dağıtıp geliştirmeye devam ediyor, ancak her biri kendi tarzında, küçük nüanslarla. ARDUINO 1.6.5 sürümünü kullandım. En basit örnekler kullanılarak Arduino Uno kartı ile işbirliği için kurulmalı ve test edilmelidir.

İkinci aşama. Barometrik basınç ve sıcaklığı ölçmek için GY-BMP280-3.3 kartını kontrol ediyoruz. 4 kablo alıyoruz, fotoğraf ve şemada gösterildiği gibi GY-BMP280-3.3 ve Arduino Uno'yu bağlarız. Eğriler ince çok renkli çizgiler iletkenlerdir.



GY-BMP280-3.3 kartını kontrol etmeye başlayalım. Bunu yapmak için, sitede çalışan programcılar tarafından yazılan Arduino IDE'ye kütüphaneyi yüklemeniz gerekir. Kural olarak, kitaplığı Arduino IDE'ye yükledikten sonra kod örnekleri (örnekler) görünür. Örnek kodu biraz değiştirerek, mikro denetleyicinin anladığı verilere derleyebilir ve sonra mikro denetleyicinin belleğine gönderebiliriz. Aşağıdaki iki ekran fotoğrafına dikkat ederek bir örnek (örnek) bulabilirsiniz.


Arduino Uno kartının mikro denetleyicisine veri yazdıktan sonra, hemen programı (kodu) yürütmeye başlar ve verileri USB kablosu aracılığıyla Arduino Uno kartının bağlı olduğu bilgisayara gönderir.Ve Arduino IDE penceresinde GY-BMP280-3.3 panosunun ölçüm sonucunu “seri port monitör” olarak görebiliriz.


Arduino Uno kabuğunu kapatıp Hyper Terminal programında bir oturum ayarladıktan sonra standart Windows Hyper Terminal programında GY-BMP280-3.3 panosundaki ölçümlerin sonucunu görebiliriz. Yani, Arduino Uno'yu, Arduino Uno kartı sürücüsünün kurulu olduğu bir USB kablosuyla herhangi bir bilgisayara bağlayarak GY-BMP280-3.3 kartının sonuçlarını elde edebiliriz. GY-BMP280-3.3 ile çalışmak için birkaç kütüphane vardır. Her şey benim için kütüphane ile çalıştı. Bu siteden indirdiğiniz dosya şöyle görünecektir: bd7e4a37c1f4dba2ebde9b9cd49f45ce.zip. Yeniden adlandırılması gerekiyor: iarduino_Pressure_BMP.zip. Şimdi iarduino_Pressure_BMP kütüphanesini Arduino IDE kabuğuna kurmamız gerekiyor.


Arduino IDE'yi başlatın, Eskiz / Dahil Et Librari / Add.ZIP Kütüphanesi menüsüne gidin ... sonra iarduino_Pressure_BMP.zip dosyasını seçin ve Aç düğmesine tıklayın. Ayrıca şu kütüphaneleri de yüklemeniz gerekir:,. Kütüphaneleri kurduktan sonra, Arduino IDE kabuğunu yeniden başlatıyoruz, yani kapatın ve tekrar başlatın. Ardından Dosya / Örnekler / iarduino Basınç BMP (basınç sensörleri) / örnek menüsünü seçin.

Kodu pencerede görüyoruz.

Kodun biraz değiştirilmesi gerekir.

Beşinci satırda, “//” iki eğik çizgiyi kaldırın ve onbirinci satıra (0x76) veya (0x77) ekleyin. (0x76), barometre kartının adresidir. I2C veriyoluna bağlı GY-BMP280-3.3 kartımın aynı adrese (0x76) sahip olduğu ortaya çıktı. I2C veriyoluna bağlı cihazın sayısı nasıl bulunur? Makalenin tamamını okuyarak bu sorunun cevabını alacaksınız.

Bu yüzden, kodu pencerede sabitledik, şimdi Sketch / Check / Compile menüsünde kodu kontrol etmeye ve derlemeye başlıyoruz. Kodun doğrulanması ve derlenmesi başarılıysa, Çizim / Yükle menüsünde Arduino Uno'da program kaydını başlatırız.

İndirme başarılı olursa, seri bağlantı noktası monitörünü menüden açarak: Araçlar / Seri Bağlantı Noktası İzleyicisi, GY-BMP280-3.3 kartı tarafından gönderilen verileri göreceğiz.

Aşağıdaki ekran görüntüsünde, Arduino IDE kabuğunun kurulu olmadığı bir bilgisayarda çalışan GY-BMP280-3.3 panosunun sonucu. Veriler PuTTY programı tarafından alınır.

Aynı zamanda, GY-BMP280-3.3 panosunun yanında bulunan bir laboratuvar aneroid barometresi fotoğraflandı. Enstrüman okumalarını karşılaştırarak, GY-BMP280-3.3 kartının doğruluğu hakkında sonuçlar çıkarabilirsiniz. Devlet laboratuarı tarafından onaylanmış aneroid barometresi.


Üçüncü aşama. LCD ekranın I2C arayüz modülü ile kontrol edilmesi. I2C veri yolu üzerinden Arduino UNO'ya bağlanan bir arabirim modülüne sahip bir LDC ekranı buluyoruz.
Ev hava istasyonu GY-BMP280-3.3 ve Ds18b20

Arduino IDE kabuğundan örnekler kullanarak çalışmasını kontrol ediyoruz. Ancak bundan önce arayüz modülünün adresini belirliyoruz. Arayüz modülümün adresi 0x3F. Bu adresi eskiz satırına ekledim: LiquidCrystal_I2C lcd (0x3F, 16.2);
Bu adresi, bölümünde açıklanan “I2C aygıt adres tarayıcı” taslağını kullanarak belirledim.
Arduino IDE kabuğunu başlattım, makaleden program kodunu kopyaladım ve Arduino IDE penceresini yapıştırdım.

Derlemeye başladım, sonra kodu GY-BMP280-3.3 panosunun ve I2C arayüz modüllü LDC ekranın bağlı olduğu Arduino UNO panosuna yazdım. Sonra seri port monitörde aşağıdaki sonucu aldım. Arayüz modülümün adresi 0x3F.

Dördüncü aşama. DS18b20 sıcaklık sensörünün kontrol edilmesi. Aşağıdaki gibi bağlarız.

DS18b20 sıcaklık sensörü ile çalışmak için OneWire Arduino Kütüphanesi zaten kurulu.

DS18x20_Temperature örneğini açın, derleyin, yükleyin, seri port monitörde ölçüm sonucunu izleyin. Her şey işe yararsa, bir sonraki adıma geçin.

Beşinci aşama. montaj ev -BMP280-3.3 ve Ds18b20'deki hava istasyonları.
Cihazı şemaya göre monte ediyoruz:

Tüm örnekleri bir araya getirip LDC görüntüleme ekranında çıkışı ayarlayarak cihazın kodunu aldım. İşte ne var:

// I2C veriyolunun yazılım uygulaması için tavsiye: //
// #define pin_SW_SDA 3 // I2C yazılım veriyolunun SDA hattı olarak çalışmak için herhangi bir Arduino pinini atayın.
// #define pin_SW_SCL 9 // I2C yazılım veriyoluna SCL hattı olarak çalışmak için herhangi bir Arduino pinini atayın.
// Çoğu anakartla uyumluluk önerisi: //
#include
#include // iarduino kütüphanesi, Tel kütüphanesinin yöntem ve fonksiyonlarını kullanacaktır.
#include // I2C veriyolunda LDC tip 1602'nin çalışması için kütüphane

                                                            //
#include // BMP180 veya BMP280 ile çalışmak için iarduino_Pressure_BMP kütüphanesini bağlayın.
iarduino_Pressure_BMP sensörü (0x76); // iarduino_Pressure_BMP kütüphanesinin işlevlerini ve yöntemlerini kullanarak bir basınç sensörü ile çalışmak için bir sensör nesnesi bildirin.
LiquidCrystal_I2C lcd (0x3F, 16.2);
OneWire ds (10);
void setup () {
    lcd.init ();
    lcd.backlight ();
    Serial.begin (9600); // 9600 baud'da seri port monitöre veri aktarımını başlatın.
    gecikme (1000); // Güç uygularken geçici akımların tamamlanmasını bekliyoruz
    sensör. başlangıç ​​(73); // Sensörle çalışmaya başlayın. Mevcut rakım 73 m. - Buzuluk şehrinin deniz seviyesinden yüksekliği
} //
void loop () {
// Verileri okuyun ve gösterin: ° C cinsinden sıcaklık, mm cinsinden basınç. rt., başlatma işlevinde belirtilene göre yükseklik değişikliği (varsayılan 0 metre).
lcd.setCursor (0,0); // LDC'deki "P =" çıkış noktasını tanımlayın
lcd.print ("P =");
lcd.print (sensör basınç / 1000.3); // BMP280 tarafından verilen P değerini 1000'e bölün ve 3 ondalık basamak çıkışını ayarlayın
lcd.setİmleç (12.0); // LDC'deki "kPa" çıkış noktasını tanımlayın
lcd.print ("kPa");
lcd.setİmleç (0,1);
lcd.print ("T =");
lcd.print (sensör sıcaklığı, 1); // 1 ondalık basamak çıkışını ayarla
lcd.setİmleç (6.1);
// lcd.print ("C");
// lcd.setİmleç (9,1);
// lcd.print ("H =");
// lcd.print (sensör.altitude, 1);
    eğer (sensor.read (1)) {Seri.println ((Dize) "CEHCOP BMP" + sensor.type + ": \ t P =" + sensor.pressure + "\ tMM.PT.CT, \ t T = "+ sensor.temperature +" * C, \ t \ t B = "+ sensor.altit +" M. ");}
    else {Serial.println ("HET OTBETA OT CEHCOPA");}
// Verileri okuyun ve görüntüleyin: ° C cinsinden sıcaklık ve Pa cinsinden basınç, mm cinsinden basınç. rt., başlatma işlevinde belirtilene göre yükseklik değişikliği (varsayılan 0 metre).
    eğer (sensor.read (2)) {Seri.println ((Dize) "CEHCOP BMP" + sensor.type + ": \ t P =" + sensör. basınç + "\ tPa, \ t \ t T =" + sensor.temperature + "* C, \ t \ t B =" + sensor.altitude + "M.");}
    else {Serial.println ("HET OTBETA OT CEHCOPA");}
    bayt i;
  bayt mevcut = 0;
  bayt türü_;
  bayt verileri [12];
  bayt adresi [8];
  şamandıra celsius, fahrenheit;
  if (! ds.search (addr)) {
    Serial.println ("Başka adres yok.");
    Serial.println ();
    ds.reset_search ();
    gecikme (250);
    return;
  }
  Serial.print ("ROM =");
  for (i = 0; i <8; i ++) {
    Serial.write ('');
    Serial.print (addr [i], HEX);
  }
  if (OneWire :: crc8 (adres, 7)! = adres [7]) {
      Serial.println ("CRC geçerli değil!");
      return;
  }
  Serial.println ();
  // ilk ROM baytı hangi çipi gösterir
  switch (addr [0]) {
    vaka 0x10:
      Serial.println ("Çip = DS18S20"); // veya eski DS1820
      type_s = 1;
      break;
    vaka 0x28:
      Serial.println ("Çip = DS18B20");
      type_s = 0;
      break;
    vaka 0x22:
      Serial.println ("Chip = DS1822");
      type_s = 0;
      break;
    varsayılan:
      Serial.println ("Aygıt bir DS18x20 aile aygıtı değil.");
      return;
  }
  ds.reset ();
  ds.sel (addr);
  d.write (0x44, 1); // sonunda parazit gücü açıkken dönüşümü başlat
  
  gecikme (1000); // belki 750ms yeter, belki değil
  // burada bir ds.depower () yapabiliriz, ancak sıfırlama bununla ilgilenecektir.
  mevcut = ds.reset ();
  ds.sel (addr);
  ds.write (0xBE); // Scratchpad'i okuyun
  Serial.print ("Veri =");
  Serial.print (mevcut, HEX);
  Serial.print ("");
  (i = 0; i <9; i ++) {// 9 bayta ihtiyacımız var
    veri [i] = ds.read ();
    Seri.print (veri [i], HEX);
    Serial.print ("");
  }
  Serial.print ("CRC =");
  Serial.print (OneWire :: crc8 (veri, 8), HEX);
  Serial.println ();
  // Verileri gerçek sıcaklığa dönüştürün
  // sonuç 16 bit işaretli bir tam sayı olduğu için,
  // her zaman 16 bit olan bir "int16_t" türünde saklanmalıdır
  // 32 bit işlemcide derlendiğinde bile.
  int16_t raw = (veri [1] <8) | veri [0];
  if (type_s) {
    ham = ham & lt; 3; // 9 bit çözünürlük varsayılan
    if (veri [7] == 0x10) {
      // "sayım kalır" tam 12 bit çözünürlük verir
      raw = (raw & 0xFFF0) + 12 - veri [6];
    }
  } başka {
    bayt cfg = (veri [4] & 0x60);
    // düşük çözünürlükte düşük bitler tanımsızdır, bu yüzden onları sıfırlayalım
    (cfg == 0x00) raw = raw & amp; -7; // 9 bit çözünürlük, 93,75 ms
    else (cfg == 0x20) raw = raw & amp; ~ 3; // 10 bit çözünürlük, 187.5 ms
    else (cfg == 0x40) raw = raw & amp; % 1; // 11 bit çözünürlük, 375 ms
    //// varsayılan 12 bit çözünürlük, 750 ms dönüştürme süresidir
  }
  celsius = (şamandıra) ham / 16.0;
  fahrenhayt = santigrat * 1.8 + 32.0;
  Seri.print ("Sıcaklık =");
  Serial.print (celsius);
  Serial.print ("Santigrat");
  Seri.print (Fahrenhayt);
  Serial.println ("Fahrenheit");
lcd.setCursor (8.1); // LDC'deki "Tds =" çıkış noktasını tanımlayın
lcd.print ("Tds =");
lcd.print (santigrat, 1);
    gecikme (3000);
}


İşte ne var:


GY-BMP280-3.3 kartı paskallarda çok uygun olmayan basınç verir. GY-BMP280-3.3 kart çıkış basıncı verilerinin kilopaskal olarak nasıl yapılacağı sorununu çözemedim. Bu sorunu LDC ekranının çıkış satırında çözdüm.

lcd.print (sensör basınç / 1000.3); // BMP280 tarafından verilen P değerini 1000'e bölün ve 3 ondalık basamak çıkışını ayarlayın
GY-BMP280-3.3 kartı yükseklik değerleri de sağlar.

sensör. başlangıç ​​(73); // Sensörle çalışmaya başlayın. Mevcut rakım 73 m. - Buzuluk şehrinin deniz seviyesinden yüksekliği
Denizde rahatlayacak ve “sensor.begin (73);” değiştirecekseniz "sensor.begin (0);" ve ardından programı derleyip GY-BMP280-3.3 ve Ds18b20 üzerindeki ev hava istasyonuna kaydedin ve LDC ekranına bir yükseklik çıkışı yapın, ayrıca bir altimetre alırsınız.
// lcd.setİmleç (9,1);
// lcd.print ("H =");
// lcd.print (sensör.altitude, 1); // Yükseklik değerlerini bir ondalık basamak ile metre cinsinden yazdırın
Güç, versiyonumdaki devreye bir USB kablosu ile sağlanıyor. 5V / 600 mA düşük voltaj yükseltme darbe dönüştürücü kullanabilirsiniz ve hava istasyonunuz taşınabilir hale gelecektir. Bu tip güç kaynağı, makale.

Başarılı derleme!
5
8.8
6.3

Yorum ekle

    • gülümsegülümsemelerxaxatamamdontknowyahoonea
      patronçizikaptalevetevet-evetagresifgizli
      üzgünümdansdance2dance3pardonyardımiçecekler
      Durarkadaşlariyigoodgooddüdükbaygınlıkdil
      dumanzırıltıcraybeyanalaycıDon-t_mentionindir
      ısıöfkelilaugh1mdatoplantımoskingnegatif
      Not_ipatlamış mısırcezalandırmakokumakkorkutmakkorkutuyorarama
      alaythank_youbuto_clueumnikakutanlaşmak
      kötübeeeblack_eyeblum3kızarmakövünçcan sıkıntısı
      sansürlüşakasecret2tehdit etmekzaferyusun_bespectacled
      shokrespektlolPrevedkarşılamaKrutoyya_za
      ya_dobryiyardımcıne_huliganne_othodiFludyasakyakın

Okumanızı tavsiye ederiz:

Akıllı telefon için verin ...