Arduino için Basınç Sensörü: Bağlantı, Kod ve Ayarlar
Dijital bir basınç sensörünü (örneğin BMP180 veya BME280) Arduino'ya bağlamak için I2C arayüzünü kullanın: SDA ve SCL pinlerini Uno üzerindeki A4 ve A5 analog girişlerine veya diğer kartlardaki ilgili pinlere bağlayın. Güç kaynağı olarak kesinlikle 3.3 V kullanın. Verileri okumak için Adafruit Sensor kütüphanesini kurun ve readPressure() ile readTemperature() hazır fonksiyonlarını kullanın.
Bu sensörler yalnızca atmosferik basıncı değil, aynı zamanda sıcaklığı da ölçmenize olanak tanır; hassas bir referansınız varsa deniz seviyesinden yüksekliği de hesaplayabilirsiniz. Aşağıda modül seçimi, montaj şeması ve yazılım kısmını ele alacağız.
İçindekiler
Sensör Seçimi: BMP180 mi BME280 mi?
Hobi projeleri için Bosch Sensortec'in dijital modülleri fiili standart haline gelmiştir. Kompakt, enerji verimli ve mikrodenetleyici ile I2C veya SPI veri yolu üzerinden iletişim kurarlar.
| Özellik | BMP180 (eski) | BME280 (önerilen) | BMP280 |
|---|---|---|---|
| Ölçülen Büyüklükler | Basınç, Sıcaklık | Basınç, Sıcaklık, Nem | Basınç, Sıcaklık |
| Basınç Doğruluğu | ±0.12 hPa (yüksek) | ±1 hPa (yeterli) | ±1 hPa |
| Arayüz | I2C / SPI | I2C / SPI | I2C / SPI |
| Çalışma Voltajı | 1.8 – 3.6 V | 1.71 – 3.6 V | 1.71 – 3.6 V |
| Maliyet | Düşük | Orta | Düşük |
Öneri: Projeniz nem ölçümü gerektiriyorsa (örneğin ev tipi hava istasyonu), BME280 seçin. Yalnızca yükseklik veya basınç gerekiyorsa daha ucuz olan BMP280 uygun olacaktır. BMP180 modülü eski kabul edilse de hala yaygın olarak bulunabilir; avantajı dar bir aralıkta biraz daha yüksek doğruluk sunmasıdır, ancak kalibrasyonu daha zordur.
Modülleri hazır devre kartları (breakout board) olarak satın alın, örneğin GY serisi (BMP180 için GY-68, GY-BME280). Bunlar zaten voltaj regülatörü ve I2C hatları için pull-up dirençleri içerir, bu da onları Arduino'ya güvenle bağlamanızı sağlar.
Arduino'ya Bağlantı Şeması (I2C)
Dijital BMP/BME sensörleri I2C protokolünü kullanır. Bu, bağlantı için sadece 4 kabloya ihtiyaç duyulduğu anlamına gelir.
Arduino Uno / Nano için Pin Bağlantısı
- VCC → 3.3V (Dikkat! Modül kartında lineer regülatör yoksa 5V'a bağlamayın. Sensör çipi yanar.)
- GND → GND
- SDA (Data) → A4
- SCL (Clock) → A5
Arduino Mega 2560 için Pin Bağlantısı
- VCC → 3.3V
- GND → GND
- SDA → Pin 20
- SCL → Pin 21
Voltaj Kontrolü: Çoğu BMP/BME çipi yalnızca 3.3 V ile çalışır. Modülünüzde "5V tolerant" etiketi veya dahili LDO regülatörü yoksa, 5 V'a bağlamak onu anında bozar. Arduino üzerindeki 3.3V pinini kullanın.
Aynı I2C veri yolunda birden fazla cihaz kullanıyorsanız, adreslerinin çakışmadığından emin olun. BMP180/BMP280'nin varsayılan adresi 0x77'dir. BME280'nin adresi, SDO pininin durumuna göre (toprağa mı yoksa beslemeye mi çekildiğine bağlı olarak) 0x76 veya 0x77 olabilir.
Yazılımsal Kurulum ve Kütüphaneler
Sensörle çalışmak için sıfırdan sürücü yazmanıza gerek yoktur. Karmaşık telafi matematiğini soyutlayan, kanıtlanmış Adafruit kütüphanelerini kullanın.
- Arduino IDE'yi açın.
- Taslak → Kütüphane Ekle → Kütüphaneleri Yönet menüsüne gidin.
- Arama kutusuna
Adafruit BMP280 Library(hem BMP180 hem de BMP280 için uygundur) veyaAdafruit BME280 Libraryyazın. - Yükle düğmesine tıklayın. IDE otomatik olarak bağımlı kütüphane
Adafruit Unified Sensor'ı yüklemeyi önerecektir — onaylayın.
Veri Okuma için Hazır Kod
Aşağıda BMP280/BMP180 için evrensel bir örnek verilmiştir. Kod basıncı, sıcaklığı okur ve yaklaşık yüksekliği hesaplar.
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>
// Sensör nesnesi oluştur
Adafruit_BMP280 bmp;
// I2C Adresi (BMP180/280 için varsayılan 0x77, bazı BME280'ler için 0x76)
#define BMP_ADDR 0x77
void setup() {
Serial.begin(9600);
Serial.println(F("Basınç sensörü başlatılıyor..."));
// Sensörü başlat
if (!bmp.begin(BMP_ADDR)) {
Serial.println(F("Hata: Sensör bulunamadı. Bağlantıları kontrol edin!"));
while (1);
}
// Çalışma modunu ayarla (standart)
bmp.setSampling(Adafruit_BMP280::MODE_NORMAL, /* Çalışma modu */
Adafruit_BMP280::SAMPLING_X2, /* Sıcaklık */
Adafruit_BMP280::SAMPLING_X16, /* Basınç */
Adafruit_BMP280::FILTER_X16, /* Gürültü filtresi */
Adafruit_BMP280::STANDBY_MS_500); /* Uyku aralığı */
Serial.println("Sensör hazır.");
}
void loop() {
// Verileri oku
float temperature = bmp.readTemperature();
float pressure = bmp.readPressure() / 100.0F; // Pa'dan hPa'ya (hektopascal) çevir
// Deniz seviyesine göre yükseklik hesabı (deniz seviyesi basıncının bilinmesi gerekir)
// 1013.25 hPa - standart atmosferik basınç
float altitude = bmp.readAltitude(1013.25);
Serial.print("Sıcaklık: ");
Serial.print(temperature);
Serial.println(" °C");
Serial.print("Basınç: ");
Serial.print(pressure);
Serial.println(" hPa");
Serial.print("Yükseklik: ");
Serial.print(altitude);
Serial.println(" m");
Serial.println("---");
delay(2000); // 2 saniye bekle
}
Nasıl Çalışır:
bmp.begin()I2C veri yolundaki bağlantıyı kontrol eder.setSampling()doğruluğu ve hızı ayarlar. Örnekleme ne kadar yüksekse (örneğinX16), veriler o kadar doğru olur ancak ölçüm daha uzun sürer.readPressure()değeri Pascal cinsinden döndürür. Alışılmış hektopascal (hPa) veya milibar (mbar) birimini elde etmek için 100'e böleriz.
Kalibrasyon ve Doğruluğu Artırma
Sensörler "kutudan çıktığı gibi" standart 1013.25 hPa basıncına göre bağıl yükseklik gösterir. Gerçek atmosferik basınç hava durumuna göre değiştiği için, yükseklik okumaları "dalgalanacaktır".
1. Mevcut Basınca Göre Düzeltme
Doğru yükseklik elde etmek için bölgenizdeki mevcut deniz seviyesi basıncını bilmeniz gerekir.
- Hava durumu servisi üzerinden şehrinizdeki güncel basıncı öğrenin (hPa cinsinden).
bmp.readAltitude(...)fonksiyonundaki1013.25sayısını elde ettiğiniz değerle değiştirin.
2. Gürültü Filtreleme
Sensörler elektriksel parazite ve hava türbülansına karşı hassastır. Okumaları stabilize etmek için basit bir kayan ortalama kullanın:
float getSmoothedPressure(int samples = 10) {
float sum = 0;
for (int i = 0; i < samples; i++) {
sum += bmp.readPressure();
delay(50); // Ölçümler arasında küçük bir gecikme
}
return (sum / samples) / 100.0F;
}
Sızdırmazlık Testi: Sensörü kapalı bir hacimdeki (örneğin bir muhafaza içindeki) basıncı kontrol etmek için kullanıyorsanız, özellikle aşırı basıncı ölçmüyorsanız atmosferle basınç eşitlemesi için bir delik olduğundan emin olun.
Analog Sensörlerle Çalışma (MPX5700)
Yüksek basıncı (borulardaki sıvılar, gazlar, pnömatik sistemler) ölçmeniz gerekiyorsa, barometrik sensörler uygun değildir. NXP'nin MPX5xxx serisi gibi analog sensörler kullanın.
Farklılıklar:
- Çıkış: Analog sinyal (0–5 V).
- Bağlantı: OUT pini Arduino'nun analog girişine (A0–A5).
- Güç Kaynağı: Genellikle 5 V.
MPX5700AP için Örnek Kod (700 kPa'ya kadar)
const int sensorPin = A0;
const float Vcc = 5.0; // Besleme voltajı
void setup() {
Serial.begin(9600);
}
void loop() {
int rawValue = analogRead(sensorPin);
float voltage = rawValue * (Vcc / 1023.0);
// MPX5700 veri sayfasındaki formül: Vout = Vs * (0.009 * P + 0.04)
// Burada P - kPa cinsinden basınçtır. P'yi ifade edelim:
// P = (Vout/Vs - 0.04) / 0.009
float pressure_kPa = (voltage / Vcc - 0.04) / 0.009;
// Sensör yalnızca belirli sınırlar içinde lineer olduğu için aralığı sınırlıyoruz
if (pressure_kPa < 0) pressure_kPa = 0;
if (pressure_kPa > 700) pressure_kPa = 700;
Serial.print("Basınç: ");
Serial.print(pressure_kPa);
Serial.println(" kPa");
delay(500);
}
Bağlantıda Sık Yapılan Hatalar
- Voltaj Karışıklığı (3.3V vs 5V). Arızaların en sık görülen nedeni. BMP/BME çipleri 3.3 voltluktur. Modülde ara regülatör olmadan Arduino'daki VCC'yi 5V'a bağlarsanız, sensör bozulur.
- SDA ve SCL Hatlarının Karıştırılması. Bazı modern kartlarda koruma olsa da, klasik hata sarı (SDA) ve yeşil (SCL) kabloların karıştırılmasıdır. Veri aktarılmayacaktır.
- Pull-up Dirençlerinin Eksikliği. I2C veri yolu, hatların beslemeye çekilmesini (pull-up) gerektirir. Çoğu hazır modülde (GY serisi) bunlar zaten vardır. Eğer çıplak çip bağlıyorsanız, SDA ve SCL'den VCC'ye (3.3V) 4.7–10 kΩ dirençler ekleyin.
- Adres Çakışması.
Arduino'ya
0x77adresli iki cihaz bağlanırsa, yalnızca biri çalışır (veya hiçbiri). Adresi I2C tarayıcı ile kontrol edin.
SSS: Sorular ve Cevaplar
S: BMP180'i doğrudan 5 voltluk Arduino'ya bağlayabilir miyim? C: Yalnızca modülde voltaj regülatörü (LDO) ve veri hatları için seviye dönüştürücü varsa. Modül küçükse ve ek bileşenler olmadan sadece 4 pini varsa — yalnızca 3.3V'a bağlayın.
S: Neden yükseklik okumaları ±10 metre sallanıyor? C: Atmosferik basınç kararsızdır. Hava durumu değişiklikleri deniz seviyesi basıncını değiştirir. Hassas bir altimetre için referans basıncının sürekli olarak güncellenmesi gerekir (internet üzerinden veya manuel girişle). Ayrıca okumaları akımlar ve sensörün çevresindeki bileşenlerden kaynaklanan ısınma etkiler.
S: Çalışmıyorsa sensörün I2C adresini nasıl öğrenebilirim?
C: Arduino'ya I2C Scanner taslağını yükleyin (birçok kütüphanenin örneklerinde veya internette bulunur). Veri yolunu tarar ve seri monitörde bulunan tüm adresleri yazdırır.
S: Bu sensör araba lastiklerindeki basıncı ölçmek için uygun mu? C: Hayır. BMP/BME yaklaşık 1 atmosfer (100 kPa) ölçer. Lastik basıncı 2–3 atmosfer (200–300 kPa) ve üzeridir. Lastikler için MPX5500 serisi özel sensörler veya hazır TPMS sensörleri gerekir.