KUNJUNGI KAMI

KUNJUNGI KITA DI BUKALAPAK, TOKOPEDIA DAN SHOPEE
Tampilkan postingan dengan label PROJECT. Tampilkan semua postingan
Tampilkan postingan dengan label PROJECT. Tampilkan semua postingan

Memulai ESP-NOW (ESP8266 NodeMCU dengan Arduino IDE)

Pada artikel ini, kita akan membahas bagaimana cara menggunakan ESP-NOW untuk bertukar data antara board ESP8266 NodeMCU yang diprogram dengan Arduino IDE. ESP-NOW adalah protokol komunikasi tanpa koneksi yang dikembangkan oleh Espressif, yang memiliki fitur transmisi paket pendek dan dapat digunakan dengan board ESP8266 dan ESP32.


Kita akan memprogram board ESP8266 NodeMCU menggunakan Arduino IDE. Jadi, sebelum melanjutkan tutorial ini, Anda harus menginstal add-on ESP8266 di Arduino IDE Anda. Ikuti panduan berikut:

Install Board ESP8266 di Arduino IDE (Windows, Mac OS X, Linux)

PENGENALAMN ESP NOW


Video berikut memberikan pengantar tentang ESP-NOW. Video ini direkam untuk ESP32, tetapi sebagian besar konsepnya juga berlaku untuk board ESP8266 NodeMCU.




Menurut situs web Espressif, ESP-NOW adalah "protokol yang dikembangkan oleh Espressif, yang memungkinkan beberapa perangkat untuk berkomunikasi satu sama lain tanpa menggunakan Wi-Fi. Protokol ini mirip dengan konektivitas nirkabel 2.4GHz berdaya rendah (...). Pemasangan antara perangkat diperlukan sebelum komunikasi mereka. Setelah pemasangan selesai, koneksi menjadi aman dan peer-to-peer, tanpa memerlukan jabat tangan.

Ini berarti bahwa setelah memasangkan perangkat satu sama lain, koneksinya akan tetap terjaga. Dengan kata lain, jika salah satu board Anda tiba-tiba kehilangan daya atau diatur ulang, saat board tersebut dihidupkan ulang, ia akan secara otomatis terhubung ke board lainnya untuk melanjutkan komunikasi.

ESP-NOW mendukung fitur-fitur berikut:
  1. Komunikasi unicast terenkripsi dan tidak terenkripsi;
  2. Perangkat peer yang tercampur terenkripsi dan tidak terenkripsi;
  3. Dapat membawa payload hingga 250 byte;
  4. Fungsi callback pengiriman yang dapat diatur untuk menginformasikan lapisan aplikasi tentang keberhasilan atau kegagalan transmisi.
Teknologi ESP-NOW juga memiliki batasan berikut:

  1. Peer terenkripsi terbatas. Maksimal 10 peer terenkripsi didukung dalam mode Stasiun; maksimal 6 dalam mode SoftAP atau SoftAP + Stasiun;
  2. Beberapa peer tidak terenkripsi  dapat didukung, namun jumlah totalnya harus kurang dari 20, termasuk peer terenkripsi;
  3. Payload dibatasi hingga 250 byte.
Dengan kata lain, ESP-NOW adalah protokol komunikasi cepat yang dapat digunakan untuk bertukar pesan kecil (hingga 250 byte) antara board ESP8266.

ESP-NOW menawarkan fleksibilitas tinggi, memungkinkan Anda untuk mengatur komunikasi satu arah atau dua arah dalam berbagai skenario.

Komunikasi Satu Arah ESP-NOW


ESP-NOW memungkinkan komunikasi satu arah, contohnya:

  • Satu board ESP8266 mengirim data ke board ESP8266 lainnya.

Konfigurasi ini sangat mudah diterapkan dan cocok untuk mengirim data dari satu board ke board lainnya, seperti pembacaan sensor atau perintah ON dan OFF untuk mengontrol GPIO.


  • Master" ESP8266 mengirim data ke beberapa "slave" ESP8266

Dalam konfigurasi ini, satu board ESP8266 dapat mengirim perintah yang sama atau berbeda ke board ESP8266 lainnya. Konfigurasi ini ideal untuk membangun sesuatu seperti remote control. Anda dapat memiliki beberapa board ESP8266 di sekitar rumah yang dikendalikan oleh satu board ESP8266 utama.


  • Satu "slave" ESP8266 menerima data dari beberapa "master"

Konfigurasi ini ideal jika Anda ingin mengumpulkan data dari beberapa sensor node ke dalam satu board ESP8266. Board ini kemudian dapat dikonfigurasi sebagai server web untuk menampilkan data dari semua board lain, misalnya.


Catatan: Dokumentasi ESP-NOW tidak secara eksplisit menggunakan istilah "pengirim/master" dan "penerima/slave". Setiap board ESP8266 dapat berfungsi sebagai pengirim atau penerima. Namun, untuk memperjelas, kita akan menggunakan istilah "pengirim" dan "penerima" atau "master" dan "slave" dalam penjelasan ini.

Komunikasi Dua Arah ESP-NOW

Dengan ESP-NOW, setiap board dapat menjadi pengirim dan penerima secara bersamaan. Ini memungkinkan Anda untuk membangun komunikasi dua arah antar board.

Sebagai contoh, Anda dapat mengatur dua board untuk saling berkomunikasi




Anda dapat menambahkan lebih banyak board ke konfigurasi ini dan membentuk jaringan (semua board ESP8266 saling berkomunikasi).


Singkatnya, ESP-NOW sangat ideal untuk membangun jaringan di mana beberapa board ESP8266 dapat saling bertukar data.

Mendapatkan  MAC Address Board ESP8266

Untuk berkomunikasi melalui ESP-NOW, Anda perlu mengetahui MAC Address  penerima ESP8266. Ini menentukan perangkat mana yang akan Anda kirimi informasi.

Setiap ESP8266 memiliki MAC Address unik, dan ini adalah cara kita mengidentifikasi setiap board untuk mengirim data menggunakan ESP-NOW (pelajari cara Mendapatkan dan Mengubah  MAC Address ESP8266).

Untuk mendapatkan  MAC Address board Anda, unggah kode berikut:

// Complete Instructions to Get and Change ESP MAC Address: https://RandomNerdTutorials.com/get-change-esp32-esp8266-mac-address-arduino/

#include <ESP8266WiFi.h>

void setup(){
Serial.begin(115200);
Serial.println();
Serial.print("ESP8266 Board MAC Address: ");
Serial.println(WiFi.macAddress());
}
void loop(){

}
Setelah mengunggah kode, buka Serial Monitor dengan baud rate 115200 dan tekan tombol RESET ESP8266. MAC Address  akan dicetak seperti berikut:




Simpan alamat MAC board Anda karena Anda akan membutuhkannya untuk mengirim data ke board yang tepat melalui ESP-NOW.

ESP-NOW: Komunikasi Satu Arah Titik ke Titik dengan ESP8266

Untuk mengenalkan  Anda dengan komunikasi nirkabel ESP-NOW, kita akan membuat proyek sederhana yang menunjukkan cara mengirim pesan dari satu ESP8266 ke ESP8266 lainnya. Satu ESP8266 akan bertindak sebagai "pengirim" dan ESP8266 lainnya akan menjadi "penerima".

Kita akan menggunakan struktur data yang berisi variabel bertipe char, int, float, String, dan boolean untuk demonstrasi ini. Namun, Anda dapat memodifikasi struktur ini untuk mengirim jenis variabel apa pun yang sesuai dengan proyek Anda, Aseperti pembacaan sensor atau variabel boolean untuk mengontrol perangkat (misalnya, menyalakan atau mematikan sesuatu).

Untuk memudahkan pemahaman, kita akan menyebut ESP8266 #1 sebagai "pengirim" dan ESP8266 #2 sebagai "penerima".

Berikut hal-hal yang perlu kita sertakan dalam sketsa "pengirim":

  1. Inisialisasi ESP-NOW: Siapkan ESP8266 #1 untuk berfungsi sebagai pengirim dalam komunikasi ESP-NOW.
  2. Registrasi Fungsi Callback Pengiriman Data: Buat fungsi bernama "OnDataSent" yang akan dijalankan ketika pesan berhasil dikirim. Fungsi ini akan memberi tahu kita apakah pesan berhasil dikirim ke penerima atau tidak.
  3. Tambahkan Perangkat Peer (Penerima): Masukkan alamat MAC ESP8266 #2 sebagai perangkat peer yang akan menerima pesan.
  4. Kirim Pesan ke Perangkat Peer: Kirim pesan yang berisi struktur data yang telah kita siapkan ke ESP8266 #2.

Di sisi "penerima", sketsa ESP8266 #2 harus mencakup:

  1. Inisialisasi ESP-NOW: Siapkan ESP8266 #2 untuk berfungsi sebagai penerima dalam komunikasi ESP-NOW.
  2. Registrasi Fungsi Callback Penerimaan Data (OnDataRecv): Buat fungsi bernama "OnDataRecv" yang akan dijalankan ketika pesan diterima dari ESP8266 #1.
  3. Simpan Pesan dalam Callback: Di dalam fungsi "OnDataRecv", simpan pesan yang diterima ke dalam variabel untuk melakukan tindakan apa pun dengan informasi yang terkandung di dalamnya.
ESP-NOW memanfaatkan fungsi callback yang akan dijalankan ketika sebuah perangkat menerima pesan atau ketika pesan dikirim (fungsi ini memberi tahu Anda apakah pesan berhasil dikirim atau gagal).



Function Name and Description
esp_now_init() Initializes ESP-NOW. You must initialize Wi-Fi before initializing ESP-NOW. Returns 0, if succeed.
esp_now_set_self_role(role) the role can be: ESP_NOW_ROLE_IDLE = 0,
ESP_NOW_ROLE_CONTROLLER, ESP_NOW_ROLE_SLAVE, ESP_NOW_ROLE_COMBO, ESP_NOW_ROLE_MAX
esp_now_add_peer(uint8 mac_addr, uint8 role, uint8 channel, uint8 key, uint8 key_len) Call this function to pair a device.
esp_now_send(uint8 mac_address, uint8 data, int len) Send data with ESP-NOW.
esp_now_register_send_cb() Register a callback function that is triggered upon sending data. When a message is sent, a function is called – this function returns whether the delivery was successful or not.
esp_now_register_rcv_cb() Register a callback function that is triggered upon receiving data. When data is received via ESP-NOW, a function is called.

Sketsa Pengirim ESP8266 NodeMCU (ESP-NOW)

Berikut adalah kode untuk board pengirim ESP8266 NodeMCU. Salin kode ini ke Arduino IDE Anda, tetapi jangan langsung unggah. Anda perlu melakukan beberapa modifikasi agar kode ini berfungsi sesuai kebutuhan Anda.


/*
Rui Santos
Complete project details at https://RandomNerdTutorials.com/esp-now-esp8266-nodemcu-arduino-ide/
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
*/

#include <ESP8266WiFi.h>
#include <espnow.h>

// REPLACE WITH RECEIVER MAC Address
uint8_t broadcastAddress[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};

// Structure example to send data
// Must match the receiver structure
typedef struct struct_message {
char a[32];
int b;
float c;
String d;
bool e;
} struct_message;

// Create a struct_message called myData
struct_message myData;

unsigned long lastTime = 0;
unsigned long timerDelay = 2000; // send readings timer

// Callback when data is sent
void OnDataSent(uint8_t *mac_addr, uint8_t sendStatus) {
Serial.print("Last Packet Send Status: ");
if (sendStatus == 0){
Serial.println("Delivery success");
}
else{
Serial.println("Delivery fail");
}
}
void setup() {
// Init Serial Monitor
Serial.begin(115200);
// Set device as a Wi-Fi Station
WiFi.mode(WIFI_STA);

// Init ESP-NOW
if (esp_now_init() != 0) {
Serial.println("Error initializing ESP-NOW");
return;
}

// Once ESPNow is successfully Init, we will register for Send CB to
// get the status of Trasnmitted packet
esp_now_set_self_role(ESP_NOW_ROLE_CONTROLLER);
esp_now_register_send_cb(OnDataSent);
// Register peer
esp_now_add_peer(broadcastAddress, ESP_NOW_ROLE_SLAVE, 1, NULL, 0);
}
void loop() {
if ((millis() - lastTime) > timerDelay) {
// Set values to send
strcpy(myData.a, "THIS IS A CHAR");
myData.b = random(1,20);
myData.c = 1.2;
myData.d = "Hello";
myData.e = false;

// Send message via ESP-NOW
esp_now_send(broadcastAddress, (uint8_t *) &myData, sizeof(myData));

lastTime = millis();
}
}

Cara Kerja Kode

Baris pertama kode program ini dimulai dengan perintah 

#include <ESP8266WiFi.h>
#include <espnow.h>
Pada baris berikutnya, Anda harus memasukkan  MAC Address  penerima ESP8266.
uint8_t broadcastAddress[] = {0x5C, 0xCF, 0x7F, 0x99, 0x9A, 0xEA};
Dalam kasus kita, alamat MAC penerima adalah: 5C:CF:7F:99:9A:EA, tetapi Anda perlu mengganti variabel tersebut dengan alamat MAC Anda sendiri.
Kemudian, buatlah sebuah struktur yang berisi jenis data yang ingin kita kirim. Kita sebut struktur ini sebagai struct_message dan ini berisi 5 jenis variabel yang berbeda. Anda dapat mengubahnya untuk mengirim jenis variabel apa pun yang Anda inginkan.
typedef struct struct_message {
char a[32];
int b;
float c;
String d;
bool e;
} struct_message;
Buat variabel baru bertipe struct_message yang disebut myData yang akan menyimpan nilai-nilai variabel.
struct_message myData;
Selanjutnya, tentukan fungsi OnDataSent(). Ini adalah fungsi callback yang akan dijalankan ketika pesan dikirim. Dalam kasus ini, pesan ini hanya mencetak apakah pesan berhasil dikirim atau tidak.
void OnDataSent(uint8_t *mac_addr, uint8_t sendStatus) {
Serial.print("Last Packet Send Status: ");
if (sendStatus == 0){
Serial.println("Delivery success");
}
else{
Serial.println("Delivery fail");
}
}
Di dalam fungsi setup(), inisialisasi monitor serial untuk keperluan debugging:
Serial.begin(115200);
Atur perangkat sebagai stasiun Wi-Fi
WiFi.mode(WIFI_STA);
Siapkan ESP-NOW
if (esp_now_init() != 0) {
Serial.println("Error initializing ESP-NOW");
return;
}
Konfigurasikan mode ESP8266:
esp_now_set_self_role(ESP_NOW_ROLE_CONTROLLER);
Perangkat ini dapat diatur dengan peran berikut: ESP_NOW_ROLE_CONTROLLER, ESP_NOW_ROLE_SLAVE, ESP_NOW_ROLE_COMBO, ESP_NOW_ROLE_MAX.

Setelah berhasil menginisialisasi ESP-NOW, daftarkan fungsi callback yang akan dipanggil ketika pesan dikirim. Dalam kasus ini, kita mendaftarkan fungsi OnDataSent() yang telah dibuat sebelumnya.

esp_now_register_send_cb(OnDataSent);
Kemudian, pasangkan dengan perangkat ESP-NOW lainnya untuk mengirim data:
esp_now_add_peer(broadcastAddress, ESP_NOW_ROLE_SLAVE, 1, NULL, 0);
Fungsi esp_now_add_peer menerima argumen berikut, dengan urutan sebagai berikut: alamat MAC, peran, saluran Wi-Fi, kunci, dan panjang kunci.

Di dalam loop(), kita akan mengirim pesan melalui ESP-NOW setiap 2 detik (Anda dapat mengubah waktu tunda ini pada variabel timerDelay). Pertama, kita atur nilai variabel sebagai berikut:

strcpy(myData.a, "THIS IS A CHAR");
myData.b = random(1,20);
myData.c = 1.2;
myData.d = "Hello";
myData.e = false;
Ingat bahwa myData adalah sebuah struktur. Di sini kita menetapkan nilai yang ingin kita kirim di dalam struktur tersebut. Sebagai contoh, baris pertama menetapkan sebuah karakter, baris kedua menetapkan angka Int acak, Float, String, dan variabel Boolean.

Kita membuat struktur seperti ini untuk menunjukkan kepada Anda cara mengirim tipe variabel yang paling umum. Anda dapat mengubah struktur tersebut untuk mengirim tipe data lainnya.

Terakhir, kirim pesan sebagai berikut:

esp_now_send(broadcastAddress, (uint8_t *) &myData, sizeof(myData));
Fungsi loop() dijalankan setiap 2000 milidetik (2 detik).
if ((millis() - lastTime) > timerDelay) {
// Set values to send
strcpy(myData.a, "THIS IS A CHAR");
myData.b = random(1,20);
myData.c = 1.2;
myData.d = "Hello";
myData.e = false;

// Send message via ESP-NOW
esp_now_send(broadcastAddress, (uint8_t *) &myData, sizeof(myData));

lastTime = millis();
}
Sketch Penerima ESP8266 NodeMCU (ESP-NOW)
/*
Rui Santos
Complete project details at https://RandomNerdTutorials.com/esp-now-esp8266-nodemcu-arduino-ide/
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
*/

#include <ESP8266WiFi.h>
#include <espnow.h>

// Structure example to receive data
// Must match the sender structure
typedef struct struct_message {
char a[32];
int b;
float c;
String d;
bool e;
} struct_message;

// Create a struct_message called myData
struct_message myData;

// Callback function that will be executed when data is received
void OnDataRecv(uint8_t * mac, uint8_t *incomingData, uint8_t len) {
memcpy(&myData, incomingData, sizeof(myData));
Serial.print("Bytes received: ");
Serial.println(len);
Serial.print("Char: ");
Serial.println(myData.a);
Serial.print("Int: ");
Serial.println(myData.b);
Serial.print("Float: ");
Serial.println(myData.c);
Serial.print("String: ");
Serial.println(myData.d);
Serial.print("Bool: ");
Serial.println(myData.e);
Serial.println();
}
void setup() {
// Initialize Serial Monitor
Serial.begin(115200);
// Set device as a Wi-Fi Station
WiFi.mode(WIFI_STA);

// Init ESP-NOW
if (esp_now_init() != 0) {
Serial.println("Error initializing ESP-NOW");
return;
}
// Once ESPNow is successfully Init, we will register for recv CB to
// get recv packer info
esp_now_set_self_role(ESP_NOW_ROLE_SLAVE);
esp_now_register_recv_cb(OnDataRecv);
}

void loop() {
}

Cara Kerja Kode

Mirip dengan pengirim, mulailah dengan menyertakan library:
#include <esp_now.h>
#include <WiFi.h>
Buat struktur untuk menerima data. Struktur ini harus sama dengan yang didefinisikan dalam skrip pengirim.
typedef struct struct_message {
char a[32];
int b;
float c;
String d;
bool e;
} struct_message;
Buat variabel bertipe struct_message bernama myData.
struct_message myData;
Buat fungsi callback yang akan dipanggil ketika ESP8266 menerima data melalui ESP-NOW. Fungsi tersebut bernama onDataRecv() dan harus menerima beberapa parameter sebagai berikut:
void OnDataRecv(const uint8_t * mac, const uint8_t *incomingData, int len) {
Kita copy konten variabel data incomingData ke dalam variabel myData.
memcpy(&myData, incomingData, sizeof(myData));
cSekarang, struktur myData mengandung beberapa variabel di dalamnya dengan nilai-nilai yang dikirim oleh ESP8266 pengirim. Untuk mengakses variabel a, misalnya, kita hanya perlu memanggil myData.a. 
Dalam contoh ini, kita cukup mencetak data yang diterima, tetapi dalam aplikasi praktis Anda dapat mencetak data tersebut pada layar, misalnya.
Serial.print("Bytes received: ");
Serial.println(len);
Serial.print("Char: ");
Serial.println(myData.a);
Serial.print("Int: ");
Serial.println(myData.b);
Serial.print("Float: ");
Serial.println(myData.c);
Serial.print("String: ");
Serial.println(myData.d);
Serial.print("Bool: ");
Serial.println(myData.e);
Serial.println();
}
Di dalam fungsi setup(), inisialisasi komunikasi Serial untuk keperluan debugging.
Serial.begin(115200);
Atur perangkat sebagai stasiun Wi-Fi:
WiFi.mode(WIFI_STA);
Siapkan ESP-NOW
if (esp_now_init() != ESP_OK) {
Serial.println("Error initializing ESP-NOW");
return;
}
Konfigurasikan mode ESP8266
esp_now_set_self_role(ESP_NOW_ROLE_SLAVE);
Daftarkan untuk fungsi callback yang akan dipanggil ketika data diterima. Dalam kasus ini, kita mendaftarkan untuk fungsi OnDataRecv() yang telah dibuat sebelumnya.
esp_now_register_recv_cb(OnDataRecv);

Pengujian Komunikasi ESP-NOW

Unggah skrip pengirim ke salah satu board dan skrip penerima ke board lainnya. Jangan lupa masukkan alamat MAC penerima pada skrip pengirim.

Sekarang, buka dua jendela Arduino IDE. Satu untuk penerima, dan satu lagi untuk pengirim. Buka Serial Monitor untuk setiap board. Ini harus berupa port COM yang berbeda untuk setiap board.

Berikut ini yang akan Anda lihat di sisi pengirim:


Dan inilah yang akan Anda lihat di sisi penerima. Perhatikan bahwa variabel Int berubah antara setiap pembacaan yang diterima (karena kita mengaturnya menjadi angka acak di sisi pengirim).


Kami telah menguji jangkauan komunikasi antara kedua papan, dan kami dapat memperoleh komunikasi yang stabil hingga 140 meter (sekitar 459 kaki) di lapangan terbuka. Dalam percobaan ini, kedua antena ESP8266 yang terpasang saling berhadapan.


Penutup 

Dalam tutorial ini, Anda telah belajar cara menggunakan ESP-NOW dengan papan ESP8266 NodeMCU. Sekarang, Anda dapat menggabungkan sketch pengirim dan penerima sehingga Anda memiliki komunikasi dua arah (masing-masing papan bertindak sebagai server dan pengirim pada saat yang bersamaan). Anda juga dapat menggunakan lebih banyak papan untuk memiliki komunikasi antara beberapa papan.

Papan ESP8266 dan ESP32 dapat berkomunikasi satu sama lain menggunakan protokol komunikasi ESP-NOW. Anda hanya perlu mengunggah sketch yang tepat ke setiap papan. Untuk mempelajari cara menggunakan ESP-NOW dengan ESP32, Anda dapat membaca panduan pengantar ESP-NOW kami untuk ESP32.

Kami harap tutorial ini bermanfaat bagi Anda. Untuk mempelajari lebih lanjut tentang papan ESP8266

Referensi "Getting Started with ESP-NOW (ESP8266 NodeMCU with Arduino IDE)", Last Minute Engineer, https://randomnerdtutorials.com/esp-now-esp8266-nodemcu-arduino-ide/

TUTORIAL MENGGUNAKAN BME280 DENGAN ARDUINO UNTUK MENGUKUR SUHU, KELEMBABAN DAN TEKANAN

    


Sensor BME280 Bosch adalah sensor presisi yang digunakan dalam berbagai aplikasi mulai dari pemantauan cuaca hingga kontrol game hingga pengukuran ketinggian di mana diperlukan akurasi hanya beberapa kaki.

Sensor ini mudah digunakan, sudah dikalibrasi sebelumnya, dan tidak memerlukan komponen tambahan, sehingga Anda dapat mulai mengukur kelembaban relatif, suhu, tekanan barometrik, dan ketinggian dalam waktu singkat.

Jadi, mari kita mengenal BME280, yang sudah banyak kita dengar.

Mengukur Suhu


BME280 dapat mengukur suhu mulai dari -40°C hingga 85°C. Pada rentang suhu 0 hingga 65°C, akurasinya adalah ±1,0°C; di luar rentang tersebut, akurasinya turun menjadi ±1,5°C.


Perlu dicatat bahwa pengukuran suhu ini digunakan secara internal untuk mengkalibrasi sensor tekanan dan kelembaban. Karena sensor menghasilkan panas sendiri, suhu yang diukur biasanya sedikit lebih tinggi dari suhu sebenarnya. Jika hal ini penting untuk proyek Anda, bandingkan suhu yang diukur dengan suhu sebenarnya dan terapkan offset jika perlu.

Mengukur Kelembaban

BME280 dapat mengukur kelembaban relatif dari 0 hingga 100% dengan akurasi ±3%.

Menurut datasheet, sensor dapat mengukur hingga 100% kelembaban pada rentang suhu 0 hingga 60°C. Namun, kelembaban maksimum yang dapat diukur menurun pada suhu yang sangat tinggi dan rendah.

Mengukur Tekanan

BME280 dapat mengukur tekanan antara 300Pa hingga 1100 hPa dengan akurasi absolut ±1 hPa.

Pada rentang suhu 0 hingga 65°C, akurasi penuh diperoleh, menghasilkan akurasi pengukuran ketinggian sekitar ±1 meter. Di luar rentang itu, akurasi turun menjadi 1,7 hPa.

Menghitung Ketinggian / Elevansi

BME280 dapat mengukur tekanan dengan presisi tinggi (kebisingan ketinggian rendah 0,25m) sehingga dapat juga digunakan sebagai altimeter dengan akurasi ±1 meter.

Sebelum melanjutkan, penting untuk memahami perbedaan antara Ketinggian Absolut dan Ketinggian Relatif. Istilah "ketinggian absolut" mengacu pada ketinggian di atas permukaan laut (MSL), sedangkan "ketinggian relatif" mengacu pada ketinggian di atas permukaan tanah (AGL).

Perlu dicatat bahwa BME280 tidak dapat langsung mengukur ketinggian tetapi dapat memperkirakannya menggunakan pembacaan tekanan. Karena BME280 sangat baik dalam mengukur tekanan, ia dapat menghitung ketinggian relatif secara akurat. Misalnya, jika Anda mengetahui ketinggian benda yang diletakkan di atas meja dan Anda memindahkannya ke lantai, BME280 akan menunjukkan penurunan ketinggian 2 kaki.

Namun, jika Anda mencoba mengukur ketinggian absolut, hal-hal menjadi sedikit lebih rumit karena BME280 perlu mengetahui tekanan permukaan laut saat ini.

Jadi, untuk mendapatkan pengukuran ketinggian absolut yang akurat, konstanta SEA_LEVEL_PRESSURE disediakan dalam contoh kode di bawah ini, yang harus Anda perbarui dengan tekanan permukaan laut saat ini di lokasi Anda.

Riview Perangkat Keras

IC BME280

Pada inti modul ini terdapat sensor suhu, kelembaban, dan tekanan digital generasi berikutnya dari Bosch - BME280. Ini merupakan penerus dari sensor-sensor seperti BMP180, BMP085, dan BMP183.



Daya

Modul ini dilengkapi dengan regulator tegangan LM6206 3.3V dan Penerjemah Tegangan I2C, sehingga Anda dapat menggunakannya dengan mikrokontroler logika 3.3V atau 5V seperti Arduino tanpa khawatir.



Pemakaian Daya dan Regulator Tegangan I2C Modul BME280
BME280 mengonsumsi kurang dari 1mA selama pengukuran dan hanya 5μA saat tidak digunakan. Karena konsumsi daya yang rendah, sensor ini dapat digunakan dalam perangkat bertenaga baterai seperti ponsel, modul GPS, dan jam tangan.

Antarmuka I2C

Modul BME280 berkomunikasi melalui I2C dan mendukung dua alamat I2C, yaitu 0x76 dan 0x77, memungkinkan penggunaan dua sensor pada bus yang sama.

Alamat I2C default modul ini adalah 0x76HEX, yang dapat dengan mudah diubah menjadi 0x77HEX menggunakan jumper solder yang disediakan.



Untuk mengubah alamat i2c menjadi 0x77, potong jejak antara pad tembaga tengah dan kiri dengan pisau tajam. Kemudian, tambahkan gumpalan solder antara pad tembaga tengah dan kanan untuk menyambungkannya.

Spesifikasi Teknis 


Bersukut Spesifikasinya : 


Input voltage3.3V – 5V
Current consumption1mA (typ.) and 5μA (idle)
Temperature-40°C to 85°C (±1.0°C accuracy)
Humidity0 to 100% RH (±3% accuracy)
Pressure300Pa to 1100 hPa (±1 hPa accuracy)
Altitude0 to 30,000 ft. (±1 m accuracy)

Untuk informasi lebih lanjut, silakan lihat lembar data di bawah ini.


Diagram Pin Sensor BME280

Modul BME280 hanya memiliki 4 pin yang berinteraksi dengan dunia luar. Koneksi-koneksi tersebut adalah sebagai berikut


VIN memberikan pasokan daya ke modul. Hubungkan tegangan antara 3.3V dan 5V ke pin ini.

GND adalah pin tanah.

SCL adalah pin clock serial untuk antarmuka I2C.

SDA adalah pin data serial untuk antarmuka I2C.

Menghubungkan Modul BME280 ke Arduino
Mari menghubungkan modul BME280 ke Arduino.

Koneksi-koneksi ini cukup sederhana. Mulailah dengan menghubungkan pin VCC ke output 5V Arduino dan pin GND ke ground.

Sekarang, kita tinggal dengan pin-pin yang digunakan untuk komunikasi I2C. Perhatikan bahwa setiap papan Arduino memiliki pin I2C yang berbeda-beda yang harus dihubungkan dengan benar. Pada papan Arduino dengan tata letak R3, pin SDA (garis data) dan SCL (garis clock) berada di header pin yang dekat dengan pin AREF. Mereka juga disebut sebagai A5 (SCL) dan A4 (SDA).

Tabel berikut mencantumkan koneksi pin.

Diagram di bawah ini menunjukkan bagaimana menghubungkan semua komponen




Instalasi Library  yang Diperlukan

Untuk mulai membaca data sensor, Anda harus terlebih dahulu menginstal Library BME280 dari Adafruit. Library ini tersedia dari manajer library  Arduino.

Untuk menginstal Library, buka Sketch > Include Library > Manage Libraries... Tunggu hingga Library Manager mengunduh indeks library dan memperbarui daftar library yang diinstal.



Filter  pencarian Anda dengan memasukkan 'bme280'. Cari Library Adafruit BME280 oleh Adafruit. Klik pada entri tersebut, lalu pilih Install.


Library  sensor BME280 menggunakan dukungan backend Adafruit Sensor. Jadi, cari Adafruit Unified Sensor dan pasang juga (Anda mungkin perlu menggulir/scroll  sedikit).


Kode Contoh Arduino

Berikut adalah program sederhana yang membaca suhu, kelembaban relatif, tekanan, dan perkiraan ketinggian dari modul BME280 dan mencetaknya di monitor serial.

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>

#define SEALEVELPRESSURE_HPA (1013.25)

Adafruit_BME280 bme;

void setup() {
	Serial.begin(9600);

	if (!bme.begin(0x76)) {
		Serial.println("Could not find a valid BME280 sensor, check wiring!");
		while (1);
	}
}

void loop() {
	Serial.print("Temperature = ");
	Serial.print(bme.readTemperature());
	Serial.println("*C");

	Serial.print("Pressure = ");
	Serial.print(bme.readPressure() / 100.0F);
	Serial.println("hPa");

	Serial.print("Approx. Altitude = ");
	Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
	Serial.println("m");

	Serial.print("Humidity = ");
	Serial.print(bme.readHumidity());
	Serial.println("%");

	Serial.println();
	delay(1000);
}
Anda seharusnya melihat keluaran yang serupa di monitor serial


Penjelasan Kode:

Sketsa ini dimulai dengan menyertakan tiga libraries, yaitu Wire.h, Adafruit Sensor.h, dan Adafruit BME280.h.
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
Variabel SEALEVELPRESSURE_HPA kemudian didefinisikan. Variabel ini menyimpan tekanan permukaan laut dalam milibar dan digunakan untuk menghitung ketinggian absolut untuk tekanan tertentu dengan membandingkannya dengan tekanan permukaan laut. Nilai default (1013.25) digunakan dalam sketsa ini, tetapi untuk hasil yang akurat, gantilah dengan tekanan permukaan laut saat ini di lokasi Anda.

Objek dari library Adafruit BME280 juga dibuat sehingga kita dapat mengakses fungsinya.
#define SEALEVELPRESSURE_HPA (1013.25)

Adafruit_BME280 bme;
Pada bagian setup kode, kita menginisialisasi komunikasi serial dengan PC dan memanggil fungsi begin().

Fungsi begin(I2C_ADDR) mengambil alamat I2C modul sebagai parameter. Jika Anda mengubah alamat I2C modul Anda, Anda harus menentukannya dengan benar. Fungsi ini menginisialisasi antarmuka I2C dengan alamat I2C yang diberikan dan memvalidasi ID chip. Kemudian, chip diatur ulang secara lunak (soft-reset) dan menunggu sensor melakukan kalibrasi setelah bangun dari tidur.

Serial.begin(9600);

if (!bme.begin(0x76)) {
	Serial.println("Could not find a valid BME280 sensor, check wiring!");
	while (1);
}
Pada bagian loop kode, kami menggunakan fungsi-fungsi berikut untuk membaca suhu, kelembaban relatif, dan tekanan barometrik dari modul BME280.

Fungsi readTemperature() mengembalikan nilai suhu.

Fungsi readPressure() mengembalikan nilai tekanan barometrik.

Fungsi readAltitude(SEALEVELPRESSURE_HPA) menghitung ketinggian (dalam meter) dengan membandingkan tekanan atmosfer yang ditentukan (dalam hPa) dengan tekanan permukaan laut (dalam hPa).

Fungsi readHumidity() mengembalikan nilai kelembaban relatif.
 Serial.print("Temperature = ");
Serial.print(bme.readTemperature());
Serial.println("*C");

Serial.print("Pressure = ");
Serial.print(bme.readPressure() / 100.0F);
Serial.println("hPa");

Serial.print("Approx. Altitude = ");
Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
Serial.println("m");

Serial.print("Humidity = ");
Serial.print(bme.readHumidity());
Serial.println("%");
Referensi 
"Interface BME280 Temperature, Humidity & Pressure Sensor with Arduino", Last Minute Engineer , https://lastminuteengineers.com/bme280-arduino-tutorial/