Komponen · 12 mnt baca

Panduan BME280 Arduino: Suhu, Kelembapan, Tekanan, dan Ketinggian

Hubungkan BME280 atau BMP280 ke Arduino: alamat I2C 0x76/0x77, library Adafruit, ketinggian dari tekanan permukaan laut, peringatan 3,3 V, stasiun cuaca ESP32, dan Pico.

BME280 adalah sensor lingkungan digital buatan Bosch yang mengukur suhu, kelembapan relatif, dan tekanan udara dalam satu chip mungil. Untuk memakainya dengan Arduino, kamu cuma butuh empat kabel (VCC, GND, SDA, SCL) dan library Adafruit BME280; beberapa baris kode sudah cukup untuk menampilkan nilai °C, %, dan hPa di Serial Monitor. Karena mengukur tekanan, sensor ini juga bisa menghitung tinggimu di atas permukaan laut, alias ketinggian. Saudaranya, BMP280, terlihat hampir sama persis tetapi tidak mengukur kelembapan; sensor itu hanya memberi suhu dan tekanan.

Di panduan ini kamu akan mempelajari perbedaan kedua sensor, kenapa alamat I2C-nya kadang 0x76 dan kadang 0x77, cara menghubungkannya ke Arduino Uno, ESP32, dan Raspberry Pi Pico, cara kerja rumus ketinggian, serta cara memilih tekanan permukaan laut yang tepat. Setelah itu kamu akan membuat stasiun cuaca mini ESP32 yang bisa dibuka di ponsel, menjalankan driver MicroPython tanpa library di Pico, dan melihat bagaimana satu sketch saja bisa membongkar masalah yang sangat umum, yaitu “BMP280 yang dijual sebagai BME280”.

Modul sensor suhu, kelembapan, dan tekanan BME280
Modul BME280: chip mungil bertutup logam ini mengukur suhu, kelembapan, dan tekanan, lalu terhubung lewat I2C atau SPI.

Apa itu BME280 dan bagaimana cara kerjanya?

BME280 berisi tiga elemen pengindra. Sensor tekanan mengukur seberapa jauh sebuah membran silikon tipis melengkung karena ditekan udara, memakai efek piezoresistif. Sensor kelembapan berupa lapisan polimer yang kapasitansinya berubah ketika menyerap uap air dari udara. Sensor suhu melaporkan suhu sekitar dan juga dipakai untuk mengoreksi dua pengukuran lainnya. Setiap chip dikalibrasi satu per satu di pabrik dan koefisiennya disimpan di memori internal; library membacanya ketika mulai berjalan, lalu mengubah angka mentah menjadi satuan sungguhan dengan rumus dari datasheet. Lubang kecil di tutup logam membuat udara bisa mencapai sensor, jadi jangan pernah menutupnya dengan selotip atau lem.

FiturBME280BMP280
Yang diukurSuhu, kelembapan, tekananSuhu, tekanan
Suhu-40…+85 °C, ±1 °C (±0,5 °C pada 25 °C)-40…+85 °C, ±1 °C (±0,5 °C pada 25 °C)
Kelembapan relatif0–100%, ±3%Tidak ada
Rentang tekanan300–1100 hPa300–1100 hPa
Akurasi tekananAbsolut ±1 hPa, relatif ±0,12 hPa (≈ ±1 m)Absolut ±1 hPa, relatif ±0,12 hPa (≈ ±1 m)
Tegangan catu chip1,71–3,6 V1,71–3,6 V
Arus (1 pembacaan per detik)3,6 µA (ketiga pengukuran)2,7 µA
Arus sleep0,1 µA0,1 µA
AntarmukaI2C (sampai 3,4 MHz) dan SPI (sampai 10 MHz)I2C dan SPI
ID chip (register 0xD0)0x600x58
Ukuran chip2,5 × 2,5 mm (persegi)2,0 × 2,5 mm (persegi panjang)

Singkatnya, BMP280 adalah BME280 yang sedikit lebih murah tanpa sensor kelembapan; pembacaan tekanan dan suhunya sama bagusnya. Kalau kamu hanya butuh ketinggian atau tekanan udara, BMP280 sudah cukup. Untuk proyek yang memerlukan kelembapan, seperti stasiun cuaca, rumah kaca, atau pemantauan iklim ruangan, pilih BME280. Satu tingkat di atasnya dalam keluarga yang sama, BME680/BME688 menambahkan sensor gas yang mendeteksi senyawa organik volatil (VOC) di udara, tetapi harganya beberapa kali lipat.

BME280 atau DHT11/DHT22?

FiturDHT11DHT22BME280
Rentang dan akurasi suhu0–50 °C, ±2 °C-40…+80 °C, ±0,5 °C-40…+85 °C, ±1 °C
Akurasi kelembapan±5%±2–5%±3%
Tekanan dan ketinggianTidakTidakYa
Pembacaan tercepatSekali per detikSekali tiap 2 detikPuluhan kali per detik
KoneksiSatu kabel dataSatu kabel dataI2C atau SPI
Arus (ketika mengukur)≈ 1 mA≈ 1,5 mADi bawah 1 mA

Sensor DHT murah dan sederhana, tetapi lambat, sesekali gagal dibaca, dan tidak bisa mengukur tekanan. BME280 berbagi bus I2C yang sama dengan perangkat lain seperti layar, hampir tidak menarik arus ketika sleep, dan ideal untuk proyek yang berjalan berbulan-bulan dengan baterai. Untuk detail DHT11, lihat Sensor Suhu dan Kelembapan DHT11, dan untuk melihat semua pilihan berdampingan, baca perbandingan sensor suhu.

Jenis modul dan peringatan 3,3 V

Chip telanjangnya sangat kecil sehingga selalu dipakai di atas breakout board, dan ada dua jenis yang umum. Modul 6 pin (biasanya ungu dan dijual sebagai GY-BME280-3.3 atau GY-BMP280-3.3) punya pin VCC, GND, SCL, SDA, CSB, dan SDO; kebanyakan tidak punya regulator, dan angka 3.3 di namanya memberi tahu persis hal itu: beri daya hanya dari 3,3 V. Modul 4 pin (VIN, GND, SCL, SDA) biasanya membawa regulator 3,3 V kecil dan sering juga transistor pengubah level untuk jalur I2C, jadi bisa dipasang ke pin 5V Arduino Uno. Kalau kamu tidak yakin jenis mana yang kamu punya, cari chip regulator mungil berkaki tiga di board; kalau tidak ada, pakai 3,3 V.

Menghubungkan modul 3,3 V tanpa regulator ke pin 5V bisa merusak sensor; batas maksimum absolut chip ini 4,25 V. Sensor yang rusak tidak selalu mati total; kadang suhunya meleset beberapa derajat atau nilai tekanannya tidak menentu, sehingga kerusakannya lebih sulit dikenali.

Pengkabelan BME280: Arduino Uno, ESP32, dan Pico

Pin BME280Arduino UnoESP32Raspberry Pi Pico
VCC / VIN3.3V (6 pin) atau 5V (4 pin, dengan regulator)3V33V3(OUT), pin 36
GNDGNDGNDGND, pin 38
SCLA5GPIO 22GP5, pin 7
SDAA4GPIO 21GP4, pin 6
CSB (6 pin)3.3V (memilih I2C)3V33V3
SDO (6 pin)Dibiarkan atau GND: 0x76, 3.3V: 0x77Dibiarkan atau GND: 0x76, 3V3: 0x77Dibiarkan atau GND: 0x76, 3V3: 0x77

Alamat adalah bagian tempat kebanyakan orang mentok. Kalau pin SDO chip berada di GND, alamatnya 0x76; kalau di 3,3 V, alamatnya 0x77. Kebanyakan modul murah menarik SDO ke GND dengan resistor, jadi alamatnya 0x76, sedangkan board buatan Adafruit sendiri memakai 0x77, dan library secara default mencoba 0x77. Karena itu, tulis alamatnya secara eksplisit di kodemu. Kalau pin CSB berada di GND ketika daya dinyalakan, chip pindah ke mode SPI dan tidak akan menjawab di I2C; kalau kamu memakai I2C, hubungkan CSB ke 3,3 V atau pastikan modulnya sudah menarik pin itu ke atas. Pin I2C board-mu bisa kamu temukan di alat Pinout, dan logika bus I2C di Apa Itu I2C?.

Kalau ingin dua sensor di bus yang sama, hubungkan pin SDO salah satu sensor ke 3,3 V untuk mengubah alamatnya menjadi 0x77; di modul 4 pin, hal ini biasanya dilakukan dengan solder jumper di bagian belakang. Untuk lebih dari dua sensor, SPI lebih cocok: SCL ke SCK (13 di Uno), SDA ke MOSI (11), SDO ke MISO (12), dan pin CSB tiap sensor ke pin digitalnya sendiri; di kode kamu cukup mendeklarasikan objeknya sebagai Adafruit_BME280 bme(10);. Karena Uno 5 V menggerakkan jalur SPI secara langsung, kamu wajib memasang level shifter antara Uno dan modul 3,3 V.

Arduino Uno bekerja pada 5 V, dan library Wire menyalakan resistor pull-up internal di A4 dan A5 ke 5 V. Modul 6 pin 3,3 V biasanya tetap berfungsi karena resistor pull-up di modul menahan bus di sekitar 3,3 V, tetapi untuk proyek permanen pilihan paling aman adalah modul 4 pin dengan regulator atau konverter level logika. ESP32 dan Pico sudah bekerja pada 3,3 V, jadi keduanya tidak punya masalah ini.

Menginstal library Adafruit BME280

  1. Di Arduino IDE, buka Tools > Manage Libraries dan cari Adafruit BME280.
  2. Ketika mengeklik Install, pilih Install all di jendela yang menanyakan dependensi, supaya Adafruit Unified Sensor dan Adafruit BusIO ikut terinstal.
  3. Kalau sensormu BMP280, instal library Adafruit BMP280 dengan cara yang sama; library BME280 tidak mengenali BMP280.
  4. Kalau mau, buka File > Examples > Adafruit BME280 Library > bme280test, tetapi jangan lupa menulis alamatnya (0x76) di baris begin().

Sketch pertama: membaca suhu, kelembapan, dan tekanan dengan BME280

C++ (Arduino IDE)
1#include <Wire.h>
2#include <Adafruit_Sensor.h>
3#include <Adafruit_BME280.h>
4
5#define DENIZ_SEVIYESI_HPA 1013.25   // bugünkü deniz seviyesi basıncı / today's sea-level pressure
6
7Adafruit_BME280 bme;
8
9void setup() {
10  Serial.begin(9600);
11  // Önce 0x76, olmazsa 0x77 dene / try 0x76 first, then 0x77
12  if (!bme.begin(0x76) && !bme.begin(0x77)) {
13    Serial.println(F("BME280 bulunamadi! Kablolari ve adresi kontrol et."));
14    Serial.print(F("Chip ID: 0x"));
15    Serial.println(bme.sensorID(), HEX);       // 0x58 ise bu bir BMP280 / 0x58 means BMP280
16    while (true) delay(10);
17  }
18  Serial.println(F("BME280 hazir"));
19}
20
21void loop() {
22  float sicaklik = bme.readTemperature();          // °C
23  float nem      = bme.readHumidity();             // % bağıl nem / % relative humidity
24  float basinc   = bme.readPressure() / 100.0F;    // Pa -> hPa
25  float irtifa   = bme.readAltitude(DENIZ_SEVIYESI_HPA);   // metre / meters
26
27  Serial.print(F("Sicaklik: ")); Serial.print(sicaklik, 1); Serial.println(F(" C"));
28  Serial.print(F("Nem:      ")); Serial.print(nem, 1);      Serial.println(F(" %"));
29  Serial.print(F("Basinc:   ")); Serial.print(basinc, 1);   Serial.println(F(" hPa"));
30  Serial.print(F("Irtifa:   ")); Serial.print(irtifa, 0);   Serial.println(F(" m"));
31  Serial.println();
32  delay(2000);
33}
FungsiKegunaannya
bme.begin(0x76)Memulai sensor; mengembalikan true jika ada perangkat yang menjawab di alamat itu dan ID chip-nya 0x60
readTemperature()Suhu, °C
readHumidity()Kelembapan relatif, %
readPressure()Tekanan, Pa (bagi 100 untuk hPa)
readAltitude(P0)Tinggi relatif terhadap tekanan permukaan laut P0 (hPa), dalam meter
seaLevelForAltitude(altitude, P)Tekanan permukaan laut dari ketinggian yang diketahui, hPa
sensorID()ID chip yang terbaca: 0x60 BME280, 0x58 BMP280
setTemperatureCompensation(x)Menambahkan x °C ke setiap pembacaan suhu; kelembapan dan tekanan ikut dikoreksi

Ketika kamu meng-upload sketch dan membuka Serial Monitor pada 9600 baud, kamu akan melihat nilai kira-kira 23,4 °C, kelembapan 45%, dan 1009,8 hPa pada kondisi ruangan. Tekanan berubah perlahan dalam hitungan jam; embuskan napas ke sensor dan kelembapan akan naik dalam beberapa detik, sentuh dengan jari dan suhunya naik. Secara default, library mengukur terus-menerus dalam mode normal dengan oversampling tertinggi (x16); ini ideal untuk uji pertama, tetapi seperti yang akan kamu lihat di bawah, pengaturan lain memberi hasil yang lebih akurat untuk pengukuran cuaca jangka panjang.

Mode pengukuran: forced, normal, dan pengaturan yang tepat

BME280 punya tiga mode. Dalam mode sleep, sensor tidak mengukur dan menarik 0,1 µA. Dalam mode forced, sensor mengambil satu pengukuran lalu kembali sleep; untuk setiap nilai baru kamu memanggil takeForcedMeasurement(). Dalam mode normal, sensor terus mengukur sendiri dengan waktu standby yang kamu tentukan. Oversampling mengukur nilai yang sama beberapa kali lalu merata-ratakannya untuk mengurangi noise, dan filter IIR meredam lonjakan tekanan mendadak (pintu dibanting, embusan angin). Di datasheet-nya, Bosch merekomendasikan pengaturan berikut sesuai kegunaannya:

KegunaanModeOversampling (tekanan / suhu / kelembapan)Filter IIRArus rata-rata
Pemantauan cuacaForced, 1 pembacaan per menitx1 / x1 / x1Mati≈ 0,16 µA
Pengukuran kelembapanForced, 1 pembacaan per detikDilewati / x1 / x1Mati≈ 2,9 µA
Navigasi dalam gedung (lantai, lift)Normal, standby 0,5 msx16 / x2 / x116≈ 633 µA
Ketika sensor mengukur terus-menerus, chip dan board-nya menjadi sedikit hangat; ini disebut self-heating (pemanasan diri). Kalau kamu mengukur suhu ruangan atau luar ruangan, pakai mode forced dan cukupkan dengan beberapa pembacaan per menit. Kalau hasilnya tetap lebih tinggi dengan selisih tetap dibanding termometer yang kamu percaya, kamu bisa menambahkan koreksi seperti bme.setTemperatureCompensation(-1.0);.

Tekanan permukaan laut dan menghitung ketinggian

Tekanan udara turun makin tinggi kamu naik, jadi ketinggian bisa dihitung dari tekanan yang terukur. Library memakai rumus barometrik ini: h = 44330 × (1 − (P / P0)^0,1903). Di sini P adalah tekanan yang kamu ukur dan P0 adalah tekanan permukaan laut terkini (keduanya dalam hPa). Atmosfer standar mengasumsikan P0 = 1013,25 hPa, dan di dekat permukaan laut selisih 1 hPa setara dengan sekitar 8,3 meter.

Masalahnya, P0 tidak tetap; nilainya bergerak kira-kira antara 990 dan 1035 hPa mengikuti cuaca. Kalau nilai sebenarnya hari ini 1023 hPa dan kamu membiarkan 1013.25 di kodemu, sensor akan menunjukkan ketinggian sekitar 80 meter terlalu rendah. Untuk hasil yang akurat, P0 harus selalu diperbarui: pakai nilai “tekanan permukaan laut” dari layanan cuaca, atau nilai Q di laporan METAR bandara terdekat (misalnya Q1018, artinya 1018 hPa). Kamu juga bisa membaliknya: kalau ketinggian lokasimu diketahui, hitung P0 dengan seaLevelForAltitude(altitude, pressure). Contohnya, kalau sensor membaca 905 hPa di Ankara (sekitar 938 m), tekanan yang dikonversi ke permukaan laut sekitar 1012,6 hPa, yaitu angka yang kamu lihat di aplikasi cuaca.

Untuk ketinggian absolut, akurasi absolut ±1 hPa berarti ketidakpastian sekitar ±8 meter. Namun dalam pengukuran relatif, sensor ini jauh lebih baik: ±0,12 hPa ≈ ±1 m. Satu lantai gedung tingginya sekitar 3 meter, atau 0,36 hPa, jadi BME280 dengan mudah bisa tahu kamu ada di lantai berapa atau mendeteksi lift yang bergerak. Sketch di bawah mengambil rata-rata 20 pembacaan ketika mulai sebagai referensi, lalu mencetak tinggi relatif terhadap titik itu dan tekanan permukaan laut yang dihitung dari ketinggian yang diketahui:

C++ (Arduino IDE)
1#include <Wire.h>
2#include <Adafruit_Sensor.h>
3#include <Adafruit_BME280.h>
4
5#define BILINEN_IRTIFA 938.0   // bulunduğun yerin rakımı (m), örnek Ankara / your altitude (m), e.g. Ankara
6
7Adafruit_BME280 bme;
8float referansHpa;             // açılıştaki basınç / pressure at start-up
9
10void setup() {
11  Serial.begin(9600);
12  if (!bme.begin(0x76)) {
13    Serial.println(F("BME280 bulunamadi!"));
14    while (true) delay(10);
15  }
16  // İç mekan navigasyonu ayarı: düşük gürültü / indoor navigation preset: low noise
17  bme.setSampling(Adafruit_BME280::MODE_NORMAL,
18                  Adafruit_BME280::SAMPLING_X2,    // sıcaklık / temperature
19                  Adafruit_BME280::SAMPLING_X16,   // basınç / pressure
20                  Adafruit_BME280::SAMPLING_X1,    // nem / humidity
21                  Adafruit_BME280::FILTER_X16,     // IIR filtre / IIR filter
22                  Adafruit_BME280::STANDBY_MS_0_5);
23  delay(1000);                                      // filtre otursun / let the filter settle
24
25  float toplam = 0;
26  for (int i = 0; i < 20; i++) {                   // 20 ölçümün ortalaması / average of 20 readings
27    toplam += bme.readPressure() / 100.0F;
28    delay(50);
29  }
30  referansHpa = toplam / 20;
31}
32
33void loop() {
34  float basinc = bme.readPressure() / 100.0F;                               // istasyon basıncı / station pressure
35  float denizSeviyesi = bme.seaLevelForAltitude(BILINEN_IRTIFA, basinc);    // hPa
36  float bagilYukseklik = bme.readAltitude(referansHpa);                     // başlangıca göre / relative to start
37
38  Serial.print(F("Istasyon basinci: "));   Serial.print(basinc, 2);         Serial.println(F(" hPa"));
39  Serial.print(F("Deniz seviyesi (QNH): ")); Serial.print(denizSeviyesi, 1); Serial.println(F(" hPa"));
40  Serial.print(F("Baslangica gore: "));    Serial.print(bagilYukseklik, 2); Serial.println(F(" m"));
41  Serial.println();
42  delay(1000);
43}

Kalau kamu mengangkat board dari lantai sampai di atas kepala, nilai “Baslangica gore” (relatif terhadap titik awal, dalam bahasa Turki) akan naik sekitar 2 meter. Karena tekanan udara berubah beberapa hPa sepanjang hari, pembacaan relatif ini bergeser setelah beberapa jam, jadi untuk pemakaian jangka panjang referensinya perlu diperbarui sesekali. Untuk membuat pembacaan makin tenang, kamu bisa menambahkan moving average dari Menyaring Data Sensor.

Stasiun cuaca mini ESP32: halaman web yang dibuka di ponselmu

Berkat Wi-Fi ESP32, kamu bisa melihat pembacaan BME280 di halaman web dari ponsel atau komputer mana pun di jaringan yang sama. Sketch di bawah memakai library WebServer yang sudah ikut dengan core ESP32, jadi tidak butuh library tambahan. Halaman utama dimuat sekali, lalu sepotong kecil JavaScript di dalamnya mengambil JSON dari /veri setiap 5 detik dan memperbarui nilainya tanpa memuat ulang halaman. Sensor berjalan dalam mode forced, jadi hanya mengukur ketika ada yang membuka halaman, dan tekanannya ditampilkan setelah dikonversi ke permukaan laut supaya bisa kamu bandingkan dengan prakiraan cuaca. Kalau ini pertama kalinya kamu memakai ESP32, mulailah dari Apa Itu ESP32?.

  1. Hubungkan BME280 seperti di tabel: VCC ke 3V3, SDA ke GPIO 21, SCL ke GPIO 22.
  2. Masukkan data jaringanmu di kolom WIFI_ADI (nama jaringan) dan WIFI_SIFRE (kata sandi) di kode, dan ketinggian lokasimu di RAKIM_M.
  3. Pilih ESP32 Dev Module sebagai board lalu upload sketch-nya.
  4. Buka Serial Monitor pada 115200 baud; begitu terhubung, alamat IP akan tercetak.
  5. Ketik alamat itu (misalnya 192.168.1.42) di browser ponsel yang terhubung ke jaringan Wi-Fi yang sama; kartu suhu, kelembapan, dan tekanan akan muncul.
C++ (Arduino IDE)
1#include <WiFi.h>
2#include <WebServer.h>
3#include <Wire.h>
4#include <Adafruit_Sensor.h>
5#include <Adafruit_BME280.h>
6
7const char* WIFI_ADI   = "WiFiAdin";      // kendi ağ adın / your network name
8const char* WIFI_SIFRE = "WiFiSifren";    // kendi şifren / your password
9const float RAKIM_M    = 938.0;           // bulunduğun yerin rakımı / your local altitude
10
11Adafruit_BME280 bme;
12WebServer server(80);
13
14// Telefonda açılan sayfa, 5 sn'de bir /veri'yi okur / phone page, reads /veri every 5 s
15const char SAYFA[] PROGMEM = R"rawliteral(
16<!DOCTYPE html><html><head><meta charset="utf-8">
17<meta name="viewport" content="width=device-width,initial-scale=1">
18<title>Mini Hava İstasyonu</title>
19<style>
20body{font-family:sans-serif;text-align:center;background:#0f172a;color:#e2e8f0;margin:0;padding:16px}
21.k{display:inline-block;min-width:140px;margin:8px;padding:16px;border-radius:14px;background:#1e293b}
22.d{font-size:2.2em;font-weight:bold;margin:6px 0}
23</style></head><body>
24<h2>Mini Hava İstasyonu</h2>
25<div class="k">Sıcaklık<div class="d" id="t">--</div>°C</div>
26<div class="k">Nem<div class="d" id="h">--</div>%</div>
27<div class="k">Basınç<div class="d" id="p">--</div>hPa</div>
28<script>
29async function guncelle() {
30  const v = await (await fetch('/veri')).json();
31  document.getElementById('t').textContent = v.t.toFixed(1);
32  document.getElementById('h').textContent = v.h.toFixed(0);
33  document.getElementById('p').textContent = v.p.toFixed(1);
34}
35guncelle();
36setInterval(guncelle, 5000);
37</script>
38</body></html>
39)rawliteral";
40
41void anaSayfa() {
42  server.send(200, "text/html", SAYFA);
43}
44
45void veriGonder() {
46  bme.takeForcedMeasurement();                     // tek ölçüm al, sonra uyu / one measurement, then sleep
47  float p = bme.readPressure() / 100.0F;
48  String json = "{\"t\":" + String(bme.readTemperature(), 2) +
49                ",\"h\":" + String(bme.readHumidity(), 1) +
50                ",\"p\":" + String(bme.seaLevelForAltitude(RAKIM_M, p), 1) + "}";
51  server.send(200, "application/json", json);
52}
53
54void setup() {
55  Serial.begin(115200);
56  Wire.begin(21, 22);                              // SDA, SCL
57  if (!bme.begin(0x76)) {
58    Serial.println("BME280 bulunamadi!");
59    while (true) delay(10);
60  }
61  // Hava durumu izleme ayarı: kendi kendini ısıtmayı azaltır / weather monitoring preset: less self-heating
62  bme.setSampling(Adafruit_BME280::MODE_FORCED,
63                  Adafruit_BME280::SAMPLING_X1,    // sıcaklık / temperature
64                  Adafruit_BME280::SAMPLING_X1,    // basınç / pressure
65                  Adafruit_BME280::SAMPLING_X1,    // nem / humidity
66                  Adafruit_BME280::FILTER_OFF);
67
68  WiFi.mode(WIFI_STA);
69  WiFi.begin(WIFI_ADI, WIFI_SIFRE);
70  while (WiFi.status() != WL_CONNECTED) {
71    delay(500);
72    Serial.print(".");
73  }
74  Serial.print("\nTarayicida ac / open in browser: http://");
75  Serial.println(WiFi.localIP());
76
77  server.on("/", anaSayfa);
78  server.on("/veri", veriGonder);
79  server.begin();
80}
81
82void loop() {
83  server.handleClient();
84}
ESP32 menjadi lebih hangat beberapa derajat ketika bekerja, dan kalau sensor diletakkan tepat di sebelah board, panas itu merusak pembacaan. Jauhkan BME280 dari board dengan kabel 10–15 cm, letakkan di dekat lubang ventilasi casing, dan jauhkan dari sinar matahari. Untuk dashboard yang lebih canggih dengan grafik dan kendali tombol, lanjutkan ke Web Server dan WebSocket ESP32.

BME280 dengan Raspberry Pi Pico (MicroPython)

MicroPython tidak punya modul bawaan untuk BME280. Alih-alih mengunduh file driver, kode di bawah membawa driver kecil di dalamnya: kode ini membaca koefisien kalibrasi, menyuruh sensor mengambil satu pengukuran dalam mode forced, dan menghitung hasilnya dengan rumus datasheet. Karena memeriksa ID chip, kode ini juga bekerja dengan BMP280 dan otomatis melewati baris kelembapan. Hubungkan sensor ke GP4 (SDA), GP5 (SCL), dan 3V3(OUT), lalu simpan kodenya ke Pico di Thonny sebagai main.py. Kalau Pico masih baru bagimu, Apa Itu Raspberry Pi Pico? dan Dasar-Dasar MicroPython akan memudahkanmu.

MicroPython
1from machine import Pin, I2C
2import struct, time
3
4i2c = I2C(0, sda=Pin(4), scl=Pin(5), freq=400000)
5ADR = 0x76                                   # olmazsa 0x77 dene / try 0x77 if it fails
6P0 = 1013.25                                 # deniz seviyesi basıncı (hPa) / sea-level pressure (hPa)
7
8def s8(x):                                   # işaretli 8 bit / signed 8-bit
9    return x - 256 if x > 127 else x
10
11chip = i2c.readfrom_mem(ADR, 0xD0, 1)[0]
12BME = chip == 0x60                           # 0x60 BME280, 0x58 BMP280
13print("Chip ID:", hex(chip), "BME280" if BME else "BMP280 (nem yok / no humidity)")
14
15# Fabrika kalibrasyon katsayıları / factory calibration coefficients
16T1, T2, T3, P1, P2, P3, P4, P5, P6, P7, P8, P9 = struct.unpack("<HhhHhhhhhhhh", i2c.readfrom_mem(ADR, 0x88, 24))
17if BME:
18    H1 = i2c.readfrom_mem(ADR, 0xA1, 1)[0]
19    e = i2c.readfrom_mem(ADR, 0xE1, 7)
20    H2 = struct.unpack("<h", e[0:2])[0]
21    H3 = e[2]
22    H4 = (s8(e[3]) << 4) | (e[4] & 0x0F)
23    H5 = (s8(e[5]) << 4) | (e[4] >> 4)
24    H6 = s8(e[6])
25    i2c.writeto_mem(ADR, 0xF2, b"\x01")      # nem x1 (ctrl_meas'tan önce) / humidity x1 (before ctrl_meas)
26
27def oku():
28    i2c.writeto_mem(ADR, 0xF4, b"\x25")      # sıcaklık x1, basınç x1, forced mod / temp x1, press x1, forced mode
29    time.sleep_ms(15)                        # ölçümün bitmesini bekle / wait for the measurement
30    d = i2c.readfrom_mem(ADR, 0xF7, 8 if BME else 6)
31    adc_p = (d[0] << 12) | (d[1] << 4) | (d[2] >> 4)
32    adc_t = (d[3] << 12) | (d[4] << 4) | (d[5] >> 4)
33
34    # Sıcaklık (datasheet formülü) / temperature (datasheet formula)
35    v1 = (adc_t / 16384 - T1 / 1024) * T2
36    v2 = (adc_t / 131072 - T1 / 8192) ** 2 * T3
37    t_fine = v1 + v2
38    t = t_fine / 5120
39
40    # Basınç, Pa / pressure, Pa
41    v1 = t_fine / 2 - 64000
42    v2 = v1 * v1 * P6 / 32768 + v1 * P5 * 2
43    v2 = v2 / 4 + P4 * 65536
44    v1 = (P3 * v1 * v1 / 524288 + P2 * v1) / 524288
45    v1 = (1 + v1 / 32768) * P1
46    p = 1048576 - adc_p
47    p = (p - v2 / 4096) * 6250 / v1
48    p = p + (P9 * p * p / 2147483648 + p * P8 / 32768 + P7) / 16
49
50    h = None
51    if BME:                                  # nem, % / humidity, %
52        adc_h = (d[6] << 8) | d[7]
53        x = t_fine - 76800
54        x = (adc_h - (H4 * 64 + H5 / 16384 * x)) * (H2 / 65536 * (1 + H6 / 67108864 * x * (1 + H3 / 67108864 * x)))
55        x = x * (1 - H1 * x / 524288)
56        h = min(max(x, 0), 100)
57    return t, p / 100, h                     # °C, hPa, %
58
59while True:
60    t, p, h = oku()
61    irtifa = 44330 * (1 - (p / P0) ** 0.1903)    # metre / meters
62    print("Sicaklik: %.1f C  Basinc: %.1f hPa  Irtifa: %.0f m" % (t, p, irtifa))
63    if h is not None:
64        print("Nem: %.1f %%" % h)
65    time.sleep(2)

Ada beberapa detail di kode yang patut dicatat. Pengaturan kelembapan (register 0xF2) baru berlaku setelah ada penulisan ke 0xF4, jadi pengaturan kelembapan dikirim lebih dulu dan perintah pengukuran sesudahnya. Nilai 0x25 yang ditulis ke 0xF4 berarti “suhu x1, tekanan x1, mode forced”; dengan pengaturan ini satu pengukuran paling lama sekitar 10 ms, jadi menunggu 15 ms sudah cukup. Ketika diuji dengan contoh nilai kalibrasi dari datasheet BMP280 Bosch, kode ini menghasilkan 25,08 °C dan 1006,5 hPa, jadi perhitungannya persis sama dengan rumus Bosch.

BMP280 yang dijual sebagai BME280: sensor apa yang sebenarnya kamu punya?

Karena kedua chip muat di desain board yang sama, sebagian penjual menjual modul BMP280 sebagai BME280; kadang board-nya cuma bertuliskan “BME/BMP280”. Gejalanya selalu sama: library Adafruit BME280 mencetak “Could not find a valid BME280 sensor, check wiring, address, sensor ID!” dan tepat di bawahnya SensorID was: 0x58. Library lain tidak menampilkan error, tetapi selalu melaporkan kelembapan 0 atau nan. Tidak ada yang salah dengan pengkabelanmu; chip yang kamu punya adalah BMP280, yang memang tidak mengukur kelembapan.

Chip BME280
Chip BME280
Chip BMP280
Chip BMP280
  • Lihat bentuk chip-nya: kalau tutup logamnya persegi (2,5 × 2,5 mm), itu BME280; kalau jelas persegi panjang (2,0 × 2,5 mm), itu BMP280. Perbesar dengan kamera ponselmu dan perbedaannya mudah terlihat.
  • Baca ID chip: cara paling andal adalah sketch di bawah; sketch ini membaca ID di register 0xD0 chip dan memberi tahu sensor apa itu.
  • Perhatikan harganya: BME280 asli jauh lebih mahal daripada BMP280, jadi curigai modul “BME280” yang dijual jauh di bawah harga pasar.
C++ (Arduino IDE)
1#include <Wire.h>
2
3void setup() {
4  Serial.begin(9600);
5  Wire.begin();
6  bool bulundu = false;
7
8  for (uint8_t adres = 0x76; adres <= 0x77; adres++) {
9    Wire.beginTransmission(adres);
10    if (Wire.endTransmission() != 0) continue;   // bu adreste cihaz yok / no device at this address
11
12    Wire.beginTransmission(adres);
13    Wire.write(0xD0);                             // chip ID register'ı / chip ID register
14    Wire.endTransmission();
15    Wire.requestFrom(adres, (uint8_t)1);
16    uint8_t id = Wire.read();
17    bulundu = true;
18
19    Serial.print(F("Adres 0x"));
20    Serial.print(adres, HEX);
21    Serial.print(F("  Chip ID 0x"));
22    Serial.print(id, HEX);
23    if (id == 0x60)                    Serial.println(F("  -> BME280 (sicaklik + nem + basinc)"));
24    else if (id >= 0x56 && id <= 0x58) Serial.println(F("  -> BMP280 (nem olcmez)"));
25    else if (id == 0x61)               Serial.println(F("  -> BME680 / BME688"));
26    else if (id == 0x55)               Serial.println(F("  -> BMP180"));
27    else                               Serial.println(F("  -> bilinmeyen yonga / unknown chip"));
28  }
29
30  if (!bulundu) Serial.println(F("0x76 ve 0x77'de sensor yok: kablolari kontrol et"));
31}
32
33void loop() {
34}

Kalau hasilnya 0x58, jangan khawatir: pembacaan suhu dan tekanan BMP280 sama bagusnya dengan BME280. Instal library Adafruit BMP280 dan pakai sketch di bawah; kalau kamu butuh kelembapan, tambahkan DHT22 terpisah ke proyek atau kembalikan produknya. Sesekali kamu juga akan menemukan sampel BMP280 dengan ID 0x56 atau 0x57; untuk yang seperti itu, tulis baris begin sebagai bmp.begin(0x76, 0x56).

C++ (Arduino IDE)
1#include <Wire.h>
2#include <Adafruit_BMP280.h>
3
4Adafruit_BMP280 bmp;
5
6void setup() {
7  Serial.begin(9600);
8  if (!bmp.begin(0x76) && !bmp.begin(0x77)) {
9    Serial.println(F("BMP280 bulunamadi! Kablolari ve adresi kontrol et."));
10    while (true) delay(10);
11  }
12  // Datasheet'in önerdiği varsayılan ayarlar / default settings from the datasheet
13  bmp.setSampling(Adafruit_BMP280::MODE_NORMAL,
14                  Adafruit_BMP280::SAMPLING_X2,     // sıcaklık / temperature
15                  Adafruit_BMP280::SAMPLING_X16,    // basınç / pressure
16                  Adafruit_BMP280::FILTER_X16,      // IIR filtre / IIR filter
17                  Adafruit_BMP280::STANDBY_MS_500); // bekleme süresi / standby time
18}
19
20void loop() {
21  Serial.print(F("Sicaklik: ")); Serial.print(bmp.readTemperature(), 1);       Serial.println(F(" C"));
22  Serial.print(F("Basinc:   ")); Serial.print(bmp.readPressure() / 100.0F, 1); Serial.println(F(" hPa"));
23  Serial.print(F("Irtifa:   ")); Serial.print(bmp.readAltitude(1013.25), 0);   Serial.println(F(" m"));
24  Serial.println();
25  delay(2000);
26}

Ide proyek BME280

  • Stasiun cuaca meja: tampilkan suhu, kelembapan, dan tekanan di layar OLED atau LCD I2C yang berbagi bus I2C yang sama.
  • Prakiraan cuaca barometrik: catat tekanan setiap jam; penurunan lebih dari 2 hPa dalam 3 jam biasanya pertanda cuaca memburuk, sedangkan kenaikan yang stabil menunjukkan langit cerah.
  • Titik embun dan peringatan jamur: hitung titik embun dengan rumus Magnus (a = 17.62, b = 243.12 °C) dan bunyikan peringatan ketika suhu dinding mendekatinya.
  • Rumah kaca pintar: jalankan kipas atau pompa pengabut berdasarkan kelembapan dan suhu; detailnya di proyek rumah kaca pintar Arduino.
  • Data logger: tulis pembacaan ke modul kartu SD atau, dengan ESP32, ke Google Sheets lalu gambar grafik mingguan.
  • Sensor rumah pintar: kirim nilai dari ESP32 ke Home Assistant lewat MQTT.
  • Stasiun luar ruangan bertenaga baterai: bangunkan ESP32 dari deep sleep setiap 10 menit; BME280 hanya menarik 0,1 µA ketika sleep.
  • Penghitung lantai: pakai sketch ketinggian relatif untuk menampilkan lantai yang sudah kamu capai di lift atau tangga.

Kesalahan umum dan cara memperbaikinya

GejalaKemungkinan penyebabSolusi
“Could not find a valid BME280 sensor”, SensorID 0x0 atau 0xFFAlamat salah atau pengkabelan bermasalahPakai begin(0x76), pastikan SDA dan SCL tidak tertukar dan GND terhubung, jalankan I2C scanner
Error yang sama, SensorID 0x58Chip-nya sebenarnya BMP280Pakai library Adafruit BMP280 dan tambahkan sensor terpisah untuk kelembapan
“fatal error: Adafruit_Sensor.h: No such file or directory”Ada library dependensi yang belum terinstalInstal library Adafruit Unified Sensor
Pembacaan bernilai nanTidak ada permintaan pengukuran baru dalam mode forced, atau begin() gagalPanggil takeForcedMeasurement() sebelum setiap pembacaan dan periksa hasil begin()
Suhu 1–3 °C terlalu tinggiSelf-heating karena pengukuran terus-menerus, panas dari ESP32 atau regulator di dekatnyaPindah ke mode forced, jauhkan sensor dari board, pakai setTemperatureCompensation() bila perlu
Tekanan serendah 900 hPaIni tekanan stasiun; nilainya turun seiring naiknya ketinggianKonversikan ke permukaan laut dengan seaLevelForAltitude() untuk dibandingkan dengan prakiraan
Ketinggian meleset puluhan meterTekanan permukaan laut dibiarkan di 1013.25Masukkan P0 terkini (QNH) atau kalibrasi dengan ketinggian yang diketahui
Macet acak pada kabel panjangBus I2C terlalu panjang dan penuh noiseBuat kabel di bawah 50 cm, turunkan kecepatan I2C, atau pakai SPI
Jangan memasukkan sensor ke kotak tertutup yang kedap udara; udara harus mencapai chip untuk pengukuran kelembapan dan tekanan. Di luar ruangan, casing berkisi (louver) yang terbuka di bagian bawah dan melindungi dari hujan serta sinar matahari langsung (seperti sangkar sensor di stasiun cuaca) memberi hasil paling akurat. Kalau sensor basah karena embun, sensor bisa menunjukkan kelembapan 100% untuk sementara; nilainya kembali normal begitu kering.

BME280 menangani semua pengukuran dasar stasiun cuaca di satu board kecil: pertama pastikan alamat dan ID chip-nya, lalu pilih mode pengukuran sesuai tujuanmu, dan selalu perbarui tekanan permukaan laut untuk ketinggian. Di aplikasi BlueGrays kamu akan menemukan proyek yang bisa digabungkan dengan panduan ini, seperti pengukuran suhu dan kelembapan dengan DHT11 dan DHT22, layar cuaca ESP32, pencatat suhu, dan web server ESP32, masing-masing dengan skema rangkaian dan kode langkah demi langkah.

Pertanyaan umum

Apa bedanya BME280 dan BMP280?

BME280 mengukur suhu, kelembapan relatif, dan tekanan; BMP280 hanya mengukur suhu dan tekanan serta tidak punya sensor kelembapan. Akurasi tekanan dan suhunya sama. Chip-nya juga berbeda: BME280 berbentuk persegi (2,5 × 2,5 mm), BMP280 persegi panjang (2,0 × 2,5 mm), dan ID chip-nya 0x60 dan 0x58.

Alamat I2C BME280 itu 0x76 atau 0x77?

Alamatnya 0x76 kalau pin SDO terhubung ke GND dan 0x77 kalau terhubung ke 3,3 V. Kebanyakan modul murah memakai 0x76, sedangkan board Adafruit memakai 0x77. Library Adafruit secara default mencoba 0x77, jadi kamu mungkin perlu menulis bme.begin(0x76) di kodemu; kalau ragu, jalankan sketch I2C scanner.

Apakah BME280 bisa dipakai dengan 5V?

Chip-nya sendiri bekerja paling tinggi pada 3,6 V. Kebanyakan modul 4 pin berlabel VIN punya regulator, jadi bisa dihubungkan ke 5V. Modul 6 pin 3,3 V tanpa regulator hanya boleh diberi daya dari 3,3 V; 5 V bisa merusak sensornya.

Bagaimana cara mengatasi “Could not find a valid BME280 sensor”?

Pertama, periksa nilai SensorID yang tercetak di bawah error. Kalau nilainya 0x58, sensormu adalah BMP280 dan kamu harus memakai library Adafruit BMP280. Kalau 0x0 atau 0xFF, itu masalah alamat atau pengkabelan: coba begin(0x76), pastikan SDA dan SCL tidak tertukar, dan pin CSB berada di 3,3 V.

Seberapa akurat pengukuran ketinggian BME280?

Sensor ini mengukur perubahan tinggi relatif sampai sekitar ±1 m, cukup untuk mendeteksi perpindahan lantai. Ketinggian absolut bergantung pada tekanan permukaan laut yang kamu masukkan; kesalahan 1 hPa menggeser hasil sekitar 8 m. Kalau kamu memasukkan nilai QNH terkini atau mengalibrasi dengan ketinggian yang diketahui, hasilnya bisa meleset hanya beberapa meter.

Kenapa BME280-ku membaca suhu terlalu tinggi?

Penyebab paling umum adalah self-heating karena pengukuran terus-menerus dan panas dari komponen di dekatnya seperti ESP32 atau regulator. Pindah ke mode forced, ambil beberapa pembacaan per menit, dan jauhkan sensor dari board dengan kabel. Kalau masih ada selisih tetap, bandingkan dengan termometer yang andal dan koreksi dengan setTemperatureCompensation().

Lihat semua proyek
Suhu dan Kelembapan dengan DHT11
#55Menengah

Suhu dan Kelembapan dengan DHT11

Seberapa hangat kamarmu, dan apakah udaranya lembap atau kering? Sensor DHT11 mengukur suhu dan kelembapan, dan Arduino menulis nilainya di layar LCD dua baris, diperbarui setiap beberapa detik. Jika

4.7(47)
73
Suhu dan Kelembapan DHT22 ESP32 (dengan Layar LCD)
#117Menengah

Suhu dan Kelembapan DHT22 ESP32 (dengan Layar LCD)

Proyek ini mengukur suhu dan kelembapan sekitar dengan sensor DHT22 dan menampilkan datanya secara real-time di LCD I2C 16x2. Data dibaca dari sensor dengan protokol satu kabel lewat library Adafruit DHT. Proyek ini menjadi dasar untuk stasiun cuaca IoT, otomasi rumah pintar, atau sistem pemantauan lingkungan di rumah kaca. Komunikasi dengan DHT22 dilakukan lewat pin GPIO 4 ESP32.

4.8(38)
56
Jam, Kalender, dan Stasiun Cuaca Dot Matrix (MAX7219, DS1307)
#85Menengah
Premium

Jam, Kalender, dan Stasiun Cuaca Dot Matrix (MAX7219, DS1307)

Papan teks berjalan untuk meja atau dinding yang menampilkan waktu, tanggal, dan cuaca ruangan secara bergantian. Di layar LED 8x32, kamu pertama melihat suhu dalam Celsius dan Fahrenheit, lalu kelemb

5.0(50)
66
Pencatat Data Suhu ESP32 (DHT22 + RTC DS1307 + microSD + OLED)
#144Mahir
Premium

Pencatat Data Suhu ESP32 (DHT22 + RTC DS1307 + microSD + OLED)

Buat pencatat suhu bercap waktu dengan ESP32! Baca suhu/kelembapan DHT22 setiap menit, ambil waktu sebenarnya dari RTC DS1307, dan catat ke kartu microSD sebagai CSV. OLED menampilkan suhu langsung (font besar), kelembapan, cap waktu, dan penghitung catatan. File /temp_log.csv bisa dibuka di Excel, Google Sheets, atau Python pandas; cocok untuk rumah kaca, suhu kamar, data laboratorium, penyimpanan makanan, atau sarang lebah.

4.7(7)
12
HTTPClient + API Cuaca ESP32 (dengan Layar OLED SSD1306)
#134Mahir
Premium

HTTPClient + API Cuaca ESP32 (dengan Layar OLED SSD1306)

Di proyek ini, kita memakai ESP32 untuk melakukan panggilan REST API ke API cuaca (wttr.in) lewat internet dengan HTTPClient.h. Berbeda dengan versi LCD I2C sebelumnya, di sini kita memakai layar OLED SSD1306 (128×64), yang memungkinkan font besar, ikon vektor, dan tampilan visual yang kaya di satu layar. Tujuh ikon vektor untuk kondisi cuaca (cerah, berawan sebagian, berawan, hujan, salju, badai, berkabut) digambar ketika program berjalan (tanpa file bitmap).

4.3(10)
19
Web Server Asinkron ESP32 (dengan Tampilan IP di LCD)
#129Mahir

Web Server Asinkron ESP32 (dengan Tampilan IP di LCD)

Di proyek ini, kita mengubah ESP32 menjadi web server asinkron yang bisa kamu kendalikan dari ponsel atau komputer di jaringan Wi-Fi yang sama. Berkat library ESPAsyncWebServer, server bisa memproses beberapa permintaan bersamaan (berbeda dengan WebServer.h klasik, yang memblokir pada satu permintaan). Kamu bisa membuka alamat IP ESP32 di browser dan mengklik tombol ON/OFF (rute /on dan /off) untuk menyalakan dan mematikan LED yang tersambung ke GPIO 5.

4.8(16)
26
HTTPClient + API Cuaca ESP32 (dengan Layar LCD)
#133Mahir
Premium

HTTPClient + API Cuaca ESP32 (dengan Layar LCD)

Di proyek ini, kita memakai ESP32 untuk melakukan panggilan REST API ke API cuaca (wttr.in) lewat internet dengan HTTPClient.h. Kita mengurai respons JSON yang diterima dengan ArduinoJson v7 dan menampilkan kota, suhu, kelembapan, cuaca, dan informasi angin di layar LCD I2C dalam bahasa Turki dan Inggris. wttr.in gratis dan tidak butuh kunci API; kamu cukup memasukkan nama kota apa pun untuk mengambil kondisi cuaca terkini kota itu. Data diperbarui otomatis setiap 30 menit.

4.7(13)
20
Layar LCD I2C ESP32 (16x2)
#119Menengah
Premium

Layar LCD I2C ESP32 (16x2)

Di proyek ini, kita menampilkan teks dengan menyambungkan layar LCD karakter 16x2 ke ESP32 lewat protokol I2C. Berkat I2C, kita bisa mengendalikan layar hanya dengan dua pin data (SDA dan SCL), sehingga tidak perlu memboroskan 6+ pin seperti pada sambungan paralel klasik. Kode mencetak pesan tetap di baris pertama dan penghitung yang naik setiap detik di baris kedua. Selain itu, kita menjalankan pemindai I2C di awal untuk mencetak alamat layar ke Serial Monitor (biasanya 0x27).

4.9(23)
40