Java'da BME280 ile Raspberry Pi Kullanan Kişisel Hava Durumu İstasyonu: 6 Adım
Java'da BME280 ile Raspberry Pi Kullanan Kişisel Hava Durumu İstasyonu: 6 Adım
Anonim
Image
Image
Temel Ekipman Listesi
Temel Ekipman Listesi

Kötü hava her zaman bir pencereden daha kötü görünür

Her zaman yerel hava durumunu ve pencereden ne gördüğümüzü izlemekle ilgilendik. Ayrıca ısıtma ve klima sistemimiz üzerinde daha iyi kontrol sağlamak istedik. Kişisel Hava Durumu İstasyonu inşa etmek harika bir öğrenme deneyimidir. Bu projeyi tamamladığınızda kablosuz iletişimin nasıl çalıştığını, sensörlerin nasıl çalıştığını ve Raspberry Pi platformunun ne kadar güçlü olabileceğini daha iyi anlayacaksınız. Bu projeyi temel alarak ve edinilen tecrübe ile gelecekte daha karmaşık projeleri kolaylıkla inşa edebileceksiniz.

Adım 1: Temel Ekipman Listesi

Temel Ekipman Listesi
Temel Ekipman Listesi
Temel Ekipman Listesi
Temel Ekipman Listesi
Temel Ekipman Listesi
Temel Ekipman Listesi

1. Ahududu Pi

İlk adım, ellerinizi bir Raspberry Pi panosuna sokmaktır. Raspberry Pi, Linux ile çalışan tek kartlı bir bilgisayardır. Amacı, programlama becerilerini ve donanım anlayışını geliştirmektir. Yenilikçi projeler için hobiler ve elektronik meraklıları tarafından hızla benimsendi.

2. Raspberry Pi için I²C Kalkanı

INPI2(I2C adaptörü), birden fazla I²C cihazıyla kullanım için Raspberry Pi 2/3 bir I²C bağlantı noktası sağlar. Dcube Store'da mevcut

3. Dijital Nem, Basınç ve Sıcaklık Sensörü, BME280

BME280, hızlı tepki süresine ve yüksek genel doğruluğa sahip bir nem, basınç ve sıcaklık sensörüdür. Bu sensörü Dcube Store'dan satın aldık

4. I²C Bağlantı Kablosu

Dcube Store'da I²C bağlantı kablosuna sahiptik

5. Mikro USB kablosu

Mikro USB kablosu Güç kaynağı, Raspberry Pi'ye güç sağlamak için ideal bir seçimdir.

6. İnternet Erişimini Ethernet Kablosu/WiFi Adaptörü ile Yorumlayın

Yapmak isteyeceğiniz ilk şeylerden biri, Raspberry Pi'nizi internete bağlamaktır. Ethernet kablosu kullanarak bağlanabiliriz. Başka bir olasılık da, bir USB kablosuz Adaptör kullanarak kablosuz bir ağa bağlanabilmenizdir.

7. HDMI Kablosu (Ekran ve bağlantı kablosu)

Herhangi bir HDMI/DVI monitörü ve herhangi bir TV, Pi için bir ekran olarak çalışmalıdır. Ama isteğe bağlı. Uzaktan erişim (SSH gibi) olasılığı da göz ardı edilemez. PUTTY yazılımı ile de erişim sağlayabilirsiniz.

Adım 2: Kurulum için Donanım Bağlantıları

Kurulum için Donanım Bağlantıları
Kurulum için Donanım Bağlantıları
Kurulum için Donanım Bağlantıları
Kurulum için Donanım Bağlantıları

Devreyi gösterilen şemaya göre yapın.

Öğrenirken, donanım ve yazılım bilgisi ile ilgili elektroniğin temellerini iyice öğrendik. Bu proje için basit bir elektronik devre şeması çizmek istedik. Elektronik şemalar, elektronik için bir plan gibidir. Bir plan çizin ve tasarımı dikkatlice takip edin. Burada elektroniğin bazı temellerini uyguladık. Mantık sizi A'dan B'ye götürür, Hayal gücü sizi her yere götürür!

Raspberry Pi ve I²C Shield Bağlantısı

Öncelikle Raspberry Pi'yi alın ve üzerine I²C Shield'i (I²C Port İçe Bakan) yerleştirin. Kalkanı Pi'nin GPIO pinlerinin üzerine hafifçe bastırın ve bu adımı pasta kadar kolay bitirdik (resme bakın).

Sensör ve Raspberry Pi Bağlantısı

Sensörü alın ve I²C kablosunu ona bağlayın. I²C Çıkışının DAİMA I²C Girişine bağlandığından emin olun. Aynısı Raspberry Pi için de GPIO pinleri üzerine monte edilmiş I²C shield ile takip edilmelidir. tak ve çalıştır seçeneği. Artık pin ve kablolama sorunu yok ve dolayısıyla karışıklık ortadan kalktı. Kendinizi bir teller ağında hayal edin ve bunun içine girin. Bundan bir rahatlama. Bu, işleri karmaşık hale getirir.

Not: Kahverengi kablo her zaman bir cihazın çıkışı ile başka bir cihazın girişi arasındaki Toprak (GND) bağlantısını takip etmelidir

İnternet Bağlantısı Bir İhtiyaçtır

Aslında burada bir seçeneğiniz var. Raspberry Pi'yi LAN kablosu veya WIFI Bağlantısı için kablosuz Nano USB Adaptörü ile bağlayabilirsiniz. Her iki durumda da, tezahür, gerçekleştirilen internete bağlanmaktır.

Devreye Güç Verme

Mikro USB kablosunu Raspberry Pi'nin güç jakına takın. Yumruk at ve işte! Her şey yolunda ve hemen başlayacağız.

Ekran Bağlantısı

HDMI kablosunu bir monitöre veya TV'ye bağlayabiliriz. -SSH (Başka bir bilgisayardan Pi'nin komut satırına erişin) kullanarak bir Raspberry Pi'ye monitöre bağlamadan erişebiliriz. Bunun için PUTTY yazılımını da kullanabilirsiniz. Bu seçenek ileri düzey kullanıcılar içindir, bu nedenle burada ayrıntılı olarak ele almayacağız.

Bir durgunluk olacağını duydum, katılmamaya karar verdim

Adım 3: Java'da Raspberry Pi Programlama

Java'da Raspberry Pi Programlama
Java'da Raspberry Pi Programlama

Raspberry Pi ve BME280 Sensörü için Java Kodu. Github depomuzda mevcuttur.

Kodlara geçmeden önce Readme dosyasında verilen talimatları okuduğunuzdan ve Raspberry Pi'nizi buna göre kurduğunuzdan emin olun. Bunu yapmak sadece bir dakikanızı alacaktır. Kişisel bir hava istasyonu, özel bir kişi, kulüp, dernek ve hatta işletme tarafından işletilen bir dizi hava durumu ölçüm aletidir. Kişisel hava istasyonları yalnızca sahibinin eğlenmesi ve eğitimi için çalıştırılabilir, ancak birçok kişisel hava istasyonu operatörü de verilerini manuel olarak derleyerek ve dağıtarak veya internet veya amatör radyo kullanarak başkalarıyla paylaşır.

Kod, hayal edebileceğiniz en basit formdadır ve bununla ilgili bir sorununuz olmaması gerekir, ancak varsa sorun. Binlerce şey bilsen bile yine de bilen birine sor.

Bu sensör için çalışan java kodunu buradan da kopyalayabilirsiniz.

// Bir özgür irade lisansıyla dağıtılır.// İlişkili eserlerinin lisanslarına uyması koşuluyla, istediğiniz şekilde, kârlı veya ücretsiz olarak kullanın. // BME280 // Bu kod, ControlEverything.com'da bulunan BME280_I2CS I2C Mini Modülü ile çalışmak üzere tasarlanmıştır. //

com.pi4j.io.i2c. I2CBus'u içe aktarın;

com.pi4j.io.i2c. I2CDevice'ı içe aktarın; com.pi4j.io.i2c. I2CFFactory'yi içe aktarın; java.io. IOException'ı içe aktarın;

genel sınıf BME280

{ public static void main(String args) İstisna atar { // I2C veri yolu oluştur I2CBus veri yolu = I2CFactory.getInstance(I2CBus. BUS_1); // I2C cihazını al, BME280 I2C adresi 0x76(108) I2CDevice cihazı = bus.getDevice(0x76); // 0x88(136) adresinden 24 bayt veri oku bayt b1 = yeni bayt[24]; device.read (0x88, b1, 0, 24); // Verileri dönüştür // geçici katsayılar int dig_T1 = (b1[0] & 0xFF) + ((b1[1] & 0xFF) * 256); int dig_T2 = (b1[2] & 0xFF) + ((b1[3] & 0xFF) * 256); if(dig_T2 > 32767) { dig_T2 -= 65536; } int dig_T3 = (b1[4] & 0xFF) + ((b1[5] & 0xFF) * 256); if(dig_T3 > 32767) { dig_T3 -= 65536; } // basınç katsayıları int dig_P1 = (b1[6] & 0xFF) + ((b1[7] & 0xFF) * 256); int dig_P2 = (b1[8] & 0xFF) + ((b1[9] & 0xFF) * 256); if(dig_P2 > 32767) { dig_P2 -= 65536; } int dig_P3 = (b1[10] & 0xFF) + ((b1[11] & 0xFF) * 256); if(dig_P3 > 32767) { dig_P3 -= 65536; } int dig_P4 = (b1[12] & 0xFF) + ((b1[13] & 0xFF) * 256); if(dig_P4 > 32767) { dig_P4 -= 65536; } int dig_P5 = (b1[14] & 0xFF) + ((b1[15] & 0xFF) * 256); if(dig_P5 > 32767) { dig_P5 -= 65536; } int dig_P6 = (b1[16] & 0xFF) + ((b1[17] & 0xFF) * 256); if(dig_P6 > 32767) { dig_P6 -= 65536; } int dig_P7 = (b1[18] & 0xFF) + ((b1[19] & 0xFF) * 256); if(dig_P7 > 32767) { dig_P7 -= 65536; } int dig_P8 = (b1[20] & 0xFF) + ((b1[21] & 0xFF) * 256); if(dig_P8 > 32767) { dig_P8 -= 65536; } int dig_P9 = (b1[22] & 0xFF) + ((b1[23] & 0xFF) * 256); if(dig_P9 > 32767) { dig_P9 -= 65536; } // 0xA1(161) adresinden 1 bayt veri oku int dig_H1 = ((byte)device.read(0xA1) & 0xFF); // 0xE1(225) adresinden 7 bayt veri oku device.read(0xE1, b1, 0, 7); // Verileri dönüştürün // nem katsayıları int dig_H2 = (b1[0] & 0xFF) + (b1[1] * 256); if(dig_H2 > 32767) { dig_H2 -= 65536; } int dig_H3 = b1[2] & 0xFF; int dig_H4 = ((b1[3] & 0xFF) * 16) + (b1[4] & 0xF); if(dig_H4 > 32767) { dig_H4 -= 65536; } int dig_H5 = ((b1[4] & 0xFF) / 16) + ((b1[5] & 0xFF) * 16); if(dig_H5 > 32767) { dig_H5 -= 65536; } int dig_H6 = b1[6] & 0xFF; if(dig_H6 > 127) { dig_H6 -= 256; } // Kontrol nem kaydını seçin // Örnekleme oranı üzerinden nem = 1 cihaz.write(0xF2, (byte)0x01); // Kontrol ölçüm kaydını seçin // Normal mod, sıcaklık ve örnekleme oranı üzerinden basınç = 1 cihaz.write(0xF4, (byte)0x27); // Yapılandırma kaydını seçin // Bekleme süresi = 1000 ms device.write(0xF5, (byte)0xA0); // 0xF7(247) adresinden 8 bayt veri okuyun // basınç msb1, basınç msb, basınç lsb, sıcaklık msb1, sıcaklık msb, sıcaklık lsb, nem lsb, nem msb bayt veri = yeni bayt[8]; device.read(0xF7, veri, 0, 8); // Basınç ve sıcaklık verilerini 19 bit uzunluğunda dönüştürün adc_p = (((uzun)(data[0] & 0xFF) * 65536) + ((uzun)(data[1] & 0xFF) * 256) + (uzun) (veri[2] & 0xF0)) / 16; uzun adc_t = (((uzun)(veri[3] ve 0xFF) * 65536) + ((uzun)(veri[4] ve 0xFF) * 256) + (uzun)(veri[5] ve 0xF0)) / 16; // Nem verilerini dönüştürün long adc_h = ((long)(data[6] & 0xFF) * 256 + (long)(data[7] & 0xFF)); // Sıcaklık ofset hesaplamaları double var1 = (((double)adc_t) / 16384.0 - ((double)dig_T1) / 1024.0) * ((double)dig_T2); double var2 = ((((double)adc_t) / 131072.0 - ((double)dig_T1) / 8192.0) * (((double)adc_t)/131072.0 - ((double)dig_T1)/8192.0)) * ((double)dig_T3); double t_fine = (uzun)(var1 + var2); double cTemp = (var1 + var2) / 5120.0; çift fTemp = cTemp * 1.8 + 32; // Basınç ofset hesaplamaları var1 = ((double)t_fine / 2.0) - 64000.0; var2 = var1 * var1 * ((çift)dig_P6) / 32768.0; var2 = var2 + var1 * ((çift)dig_P5) * 2.0; var2 = (var2 / 4.0) + (((double)dig_P4) * 65536.0); var1 = (((çift) dig_P3) * var1 * var1 / 524288.0 + ((çift) dig_P2) * var1) / 524288.0; var1 = (1.0 + var1 / 32768.0) * ((çift)dig_P1); çift p = 1048576,0 - (çift)adc_p; p = (p - (var2 / 4096.0)) * 6250.0 / var1; var1 = ((çift) dig_P9) * p * p / 2147483648.0; var2 = p * ((çift) dig_P8) / 32768.0; çift basınç = (p + (var1 + var2 + ((double)dig_P7)) / 16.0) / 100; // Nem ofset hesaplamaları double var_H = (((double)t_fine) - 76800.0); var_H = (adc_h - (dig_H4 * 64.0 + dig_H5 / 16384.0 * var_H)) * (dig_H2 / 65536.0 * (1.0 + dig_H6 / 67108864.0 * var_H * (1.0 + dig_H3 / 67108864.0 * var_H))); çift nem = var_H * (1.0 - dig_H1 * var_H / 524288.0); if(nem > 100.0) { nem = 100.0; }else if(nem < 0.0) { nem = 0.0; } // Ekrana veri çıktısı System.out.printf("Santigrat cinsinden Sıcaklık: %.2f C %n", cTemp); System.out.printf("Sıcaklık Fahrenhayt cinsinden: %.2f F %n", fTemp); System.out.printf("Basınç: %.2f hPa %n", basınç); System.out.printf("Bağıl Nem: %.2f %% RH %n", nem); } }

Adım 4: Kod Uygulanabilirliği

Kod Pratikliği
Kod Pratikliği

Şimdi kodu indirin (veya git pull) ve Raspberry Pi'de açın.

Terminaldeki kodu Derlemek ve Yüklemek için komutları çalıştırın ve Monitördeki çıktıya bakın. Birkaç dakika sonra, tüm parametreleri görüntüleyecektir. Sorunsuz bir kod geçişi ve sakin(ish) bir sonuç elde ettiğinizden emin olarak, daha fazla değişiklik yapmak için daha fazla fikir düşünürsünüz (Her Proje bir Hikaye ile başlar).

Adım 5: Yapıcı Dünyada Kullanım

BME280, nem ve basınç ölçümü gerektiren tüm uygulamalarda yüksek performans sağlar. Ortaya çıkan bu uygulamalar Bağlam Farkındalığıdır, ör. Cilt Algılama, Oda Değişikliği Algılama, Fitness İzleme / Sağlık, Kuruluk veya Yüksek Sıcaklık Uyarısı, Hacim ve Hava Akışı Ölçümü, Ev Otomasyonu Kontrolü, Kontrol Isıtma, Havalandırma, Klima (HVAC), Nesnelerin İnterneti (IoT), GPS Geliştirme (örn. İlk Düzeltme Süresi İyileştirmesi, Ölü Hesaplama, Eğim Algılama), İç Mekan Navigasyonu (Zemin Değişimi Algılama, Asansör Algılama), Dış Mekan Navigasyonu, Boş Zaman ve Spor Uygulamaları, Hava Tahmini ve Dikey Hız Göstergesi (Yükselme/Düşme) Hız).

6. Adım: Sonuç

Gördüğünüz gibi, bu proje, donanım ve yazılımın neler yapabileceğini gösteren harika bir gösteri. Kısa bir süre içinde, böyle etkileyici bir proje inşa edilebilir! Tabii ki, bu sadece bir başlangıç. Otomatik Havaalanı Kişisel Hava İstasyonları gibi daha karmaşık bir Kişisel Hava İstasyonu yapmak, Anemometre(rüzgar hızı), Transmissometer(görünürlük), Piranometre(güneş radyasyonu) vb. gibi bazı sensörleri içerebilir. Youtube'da temel işleyişine sahip bir video eğitimimiz var. Rasp Pi ile I²C sensörü. I²C iletişimlerinin sonuçlarını ve çalışmasını görmek gerçekten şaşırtıcı. Onu da kontrol edin. İnşa ederken ve öğrenirken iyi eğlenceler! Lütfen bu talimat hakkında ne düşündüğünüzü bize bildirin. Gerekirse bazı iyileştirmeler yapmak isteriz.

Önerilen: