My Fourth Project [Sistem Embedded]: ESP32 Sensor, External Sensor
Hello!! Welcome back again guys!! All right, jadi kali ini aku akan menceritakan experience selama aku mengerjakan Project 4. Sesuai dengan judul blognya, di Project #4 ini kita akan membahas tentang External Sensor pada ESP32. External Sensor yang aku gunakan di Project #4 ini adalah BMP 280.
— Introduction; —
BMP 280 ini merupakan salah satu sensor eksternal dari ESP 32 yang berfungsi untuk mengukur suhu, tekanan, serta ketinggian dari permukaan laut. Alasan aku memilih BMP 280 adalah karena selain mudah dicari di e-commerce juga harganya lebih murah tetapi kualitasnya tetap mantull. Oiya BMP 280 yang aku gunakan ini sudah disolder dari toko tempat menjualnya. Jadi, untuk teman-teman yang eksternal sensornya belum disolder, jangan lupa untuk disolder terlebih dahulu ya gaiss!!
— Tools; —
Untuk mengerjakan project ini dibutuhkan beberapa tambahan dari Project sebelumnya. Tools yang harus disiapkan, diantaranya:
- ESP 32 DOIT DEVKIT V1
- Breadboard
- Kabel USB (bisa menggunakan kabel yang digunakan pada project sebelumnya).
- Kabel jumper Male to Male (minimum 4 buah). Karena kita akan membuat rangkaian pada breadboard, maka kita memerlukan kabel jumper tipe male to male.
- External Sensor: BMP 280
- Lampu LED 1 buah dengan warna sesuai keinginan.
- 1 buah resistor 330 Ohm.
- Laptop/ Komputer yang memiliki Arduino IDE. Jangan lupa install dan setting Ardunio IDE-mu sama seperti pada project sebelumnya ya guys! [My First ESP32 Project: LED Blink]
— Steps; —
First Steps: Installation
Installation yang perlu dilakukan adalah Library dari BMP 280. Yuk ikuti langkah-langkah sebagai berikut:
- Buka dan jalankan aplikasi Arduino IDE. Kemudian klik Sketch > Include Library > Manage Libraries
- Lakukan search kemudian ketik “Adafruit BMP280 Library” di kolom searching. Lalu, klik Install All.
- Yeayy library untuk Eksternal Sensor BMP 280 sudah berhasil diinstall !!
Next Steps:
- Assemble the Circuit
Langkah berikutnya yang harus kita lakukan sebelum menjalankan program adalah merakit rangkaiannya terlebih dahulu. Berikut kurang lebih ilustrasi dari tampilan rangkaian kita nanti.
Jika kita perhatikan, BMP 280 memiliki 6 pin yang terdiri dari, VCC, GND, SCL, SDA, CSB, dan SDO. Agar dapat terhubung dengan ESP32, pin SDO dan CSB kita akan membiarkannya.
Berikut adalah langkah-langkah untuk merakit rangkaiannya. Check it out!
- Sambungkan pin VCC ke 3.3 Volt (3V3) menggunakan kabel jumper male to male.
- Lalu hubungkan pin GND dengan GND juga pada ESP32.
- Hubungkan pin SCL menuju GPIO22 dan pin SDA ke GPIO21.
Jika sudah selesai merakit rangkaian, sambungkan ESP32 dengan Laptop menggunakan kabel USB.
B. The Code;
Berikut adalah block program yang aku gunakan dalam Project #4 ini:
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_BMP280.h>
#define BMP_SCK (13)
#define BMP_MISO (12)
#define BMP_MOSI (11)
#define BMP_CS (10)
Adafruit_BMP280 bmp; // I2C
//Adafruit_BMP280 bmp(BMP_CS); // hardware SPI
//Adafruit_BMP280 bmp(BMP_CS, BMP_MOSI, BMP_MISO, BMP_SCK);
void setup() {
Serial.begin(115200);
while ( !Serial ) delay(100); // wait for native usb
Serial.println(F("BMP280 test"));
unsigned status;
//status = bmp.begin(BMP280_ADDRESS_ALT, BMP280_CHIPID);
status = bmp.begin(0x76);
if (!status) {
Serial.println(F("Could not find a valid BMP280 sensor, check wiring or " "try a different address!"));
Serial.print("SensorID was: 0x"); Serial.println(bmp.sensorID(),16);
Serial.print(" ID of 0xFF probably means a bad address, a BMP 180 or BMP 085\n");
Serial.print(" ID of 0x56-0x58 represents a BMP 280,\n");
Serial.print(" ID of 0x60 represents a BME 280.\n");
Serial.print(" ID of 0x61 represents a BME 680.\n");
while (1) delay(10);
}
/* Default settings from datasheet. */
bmp.setSampling(Adafruit_BMP280::MODE_NORMAL, /* Operating Mode. */
Adafruit_BMP280::SAMPLING_X2, /* Temp. oversampling */
Adafruit_BMP280::SAMPLING_X16, /* Pressure oversampling */
Adafruit_BMP280::FILTER_X16, /* Filtering. */
Adafruit_BMP280::STANDBY_MS_500); /* Standby time. */
}
void loop() {
Serial.print(F("Temperature = "));
Serial.print(bmp.readTemperature());
Serial.println(" *C");
Serial.print(F("Pressure = "));
Serial.print(bmp.readPressure());
Serial.println(" Pa");
Serial.print(F("Approx altitude = "));
Serial.print(bmp.readAltitude(1013.25)); /* Adjusted to local forecast! */
Serial.println(" m");
Serial.println();
delay(2000);
Ada beberapa fungsi bawaan Adafruit yang dapat langsung digunakan, untuk lebih lengkapnya ada di link berikut. Tapi, di blog kali ini kita akan membahas yang digunakan di project ini saja ya!
- readTemperature: membaca temperature/ suhu dalam satuan Celcius.
- readPressure: membaca tekanan dalam satuan hPa
- readAltitute: membaca ketinggian dari permukaan laut dalam satuan meter.
— The Result
— Analysis
Berdasarkan video hasil percobaan diatas, ketika sensor tidak disentuh, suhu berkisar 27.22℃. Namun, ketika sensor disentuh beberapa waktu, suhunya meningkat menjadi 28.17℃. Berbeda dengan pressure, tekanan tidak banyak berubah ketika sensor disentuh maupun tidak. Hal ini terjadi karena saat kita menyentuh sensor, berarti kita juga memberikan sedikit panas tubuh kita ke sensor sehingga suhunya meningkat.
— Additional Component;
Nah, pada bagian ini aku akan menunjukkan hasil project setelah ditambahkan satu komponen baru yaitu menambahkan satu lampu LED. Nantinya ketika sensor BMP 280 disentuh maka LED akan menyala.
Berikut adalah penampakan dari rangkaiannya.
Berikut adalah langkah-langkah untuk merakit rangkaiannya:
- Hubungkan Ground ESP32 dengan kutub negatif breadboard.
- Hubungkan kabel jumper dengan LED melalui pin GPIO16 menuju kutub positif LED.
- Tambahkan resistor 330 Ohm dari kutub negatif LED menuju jalur negatif breadboard.
- Yeay selesai!!
The code!
Berikut adalah kode program yang akan digunakan pada sesi additional component. Karena kita melakukan variasi rangkaian, kodenya pun aku sedikit modifikasi seperti yang tertera dibawah ini.
// // Inisiasi nomor pin
const int ledPin1 = 16;
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_BMP280.h>
#define BMP_SCK (13)
#define BMP_MISO (12)
#define BMP_MOSI (11)
#define BMP_CS (10)
Adafruit_BMP280 bmp; // I2C
//Adafruit_BMP280 bmp(BMP_CS); // hardware SPI
//Adafruit_BMP280 bmp(BMP_CS, BMP_MOSI, BMP_MISO, BMP_SCK);
void setup() {
Serial.begin(115200);
// Menginisiasi ledPin sebagai output
pinMode (ledPin1, OUTPUT);
while (!Serial) delay(100); // wait for native usb
Serial.println(F("BMP280 test"));
//bmp.begin(BMP280_ADDRESS_ALT, BMP280_CHIPID);
if (!bmp.begin(0x76)) {
Serial.println(F("Could not find a valid BMP280 sensor, check wiring or "
"try a different address!"));
Serial.print("SensorID was: 0x"); Serial.println(bmp.sensorID(),16);
Serial.print(" ID of 0xFF probably means a bad address, a BMP 180 or BMP 085\n");
Serial.print(" ID of 0x56-0x58 represents a BMP 280,\n");
Serial.print(" ID of 0x60 represents a BME 280.\n");
Serial.print(" ID of 0x61 represents a BME 680.\n");
while (1) delay(10);
}
/* Default settings from datasheet. */
bmp.setSampling(Adafruit_BMP280::MODE_NORMAL, /* Operating Mode. */
Adafruit_BMP280::SAMPLING_X2, /* Temp. oversampling */
Adafruit_BMP280::SAMPLING_X16, /* Pressure oversampling */
Adafruit_BMP280::FILTER_X16, /* Filtering. */
Adafruit_BMP280::STANDBY_MS_500); /* Standby time. */
}
void loop() {
Serial.print(F("Temperature = "));
Serial.print(bmp.readTemperature());
Serial.println(" *C");
// Mengubah suhu dalam satuan Fahrenheit
Serial.print(F("Temperature = "));
Serial.print(1.8 * bmp.readTemperature() + 32);
Serial.println(" *F");
Serial.print(F("Pressure = "));
Serial.print(bmp.readPressure() / 100.0F);
Serial.println(" hPa");
Serial.print(F("Approx altitude = "));
Serial.print(bmp.readAltitude(1013.25)); /* Adjusted to local forecast! */
Serial.println(" m");
if(bmp.readTemperature() >= 30){
digitalWrite(ledPin1, HIGH);
}
else{
digitalWrite(ledPin1, LOW);
}
Serial.println();
delay(2000);
}
Dari kode program diatas, kita dapat melihat besaran suhu sekitar sensor, baik dalam celcius maupun fahrenheit. Selain itu, bisa juga menghitung tekanan dalam satuan hPa serta membaca ketinggian dari permukaan laut dalam satuan meter. Jika suhu sudah melibihi 30℃, maka LED akan menyala. Begitupun sebaliknya, jika suhu kurang dari 30℃ makan LED akan mati.
The Result!
Analysis!
Seperti yang sudah aku katakan pada percobaan awal, bahwa dengan menyentuh sensor eksternal menyebabkan suhunya menjadi meningkat. Begitu pula pada project variasi ini. Ketika sensor eksternal disentuh maka suhu akan meningkat dan jika suhunya sudah mencapai lebih dari 30℃ maka LED akan menyala. Sedangkan jika suhunya turun kurang dari 30℃ maka LED akan mati. Suhu dapat meningkat karena melalui tangan kita tubuh mengeluarkan energi panas tubuh. Sementara itu, tekanan dan ketinggian dari permukaan laut akan selalu stabil karena tidak ada suatu perubahan sama sekali. Tekanan tidak mengalami perubahan yang signifikan karena tekanan merupakan sesuatu yang tidak bisa dikontrol sehingga terlihat pada video tekanannya tidak ada perubahan.
— The Problems;
- Jangan lupa untuk mencantumkan I2C address pada program utama yaitu di bagian ini if (!bmp.begin()) menjadi if (!bmp.begin(<I2C address>))
- Suhu sensor eksternal tidak meningkat walaupun sudah disentuh. Nah, pastikan kondisi jari kalian tidak sedang dalam keadaan yang dingin. Berhubung kemarin aku melakukan percobaan di dalam kelas yang ruangannya ber-AC sehingga tangan aku lumayan mengalami kedinginan (emang gampang kedinginan aja anaknya hehehe) sehingga suhu di serial monitornya tidak naik, malahan turun atau bahkan tidak stabil sama sekali. Akibatnya, aku harus meminjam tangan temanku untuk mencoba sensor ekternalnya.
— Closing; —
Yeayy! Project keempat sudah selesai.. Itulah beberapa percobaan mengai External Sensor pada ESP32. Semoga pengalaman yang aku sharing ini bisa bermanfaat bagi teman-teman yang membaca. Masih banyak lagi project-project lain yang gak kalah seru dan menarik. So staytune and see you !!