Project 4 — External Sensor

Fathiyya Teddy
14 min readFeb 20, 2021

--

Halo teman-temann!!

Selamat datang pada proyek percobaanku menggunakan ESP32. Ini adalah projek keempat dan topiknya adalah external sensor. Setelah minggu lalu mencoba 3 buah sensor internal yang terdapat pada ESP32, pada percobaan ini, akan digunakan beberapa sensor untuk mengetahui suhu, kelembaban, ketinggian, dan lainnya.

Sensor adalah bagian dari sistem yang berfungsi untuk meraba dan memahami fenomena yang terdapat pada lingkungan sekitarnya. Sensor dapat dibagi menjadi 2 jenis, yaitu sensor internal dan sensor eksternal. Sebagai contoh, pada sistem tubuh manusia, sensor internal berupa mendeteksi suhu tubuh dan akan berkeringat jika suhu tinggi. Sedangkan sensor eksternal berupa panca indra. Mata untuk mendeteksi gambar, hidung untuk mendeteksi bau, ada juga sensor suara, sensor rasa dan sensor raba.

Sistem komputer juga dapat dilengkapi sensor untuk mengetahui kondisi lingkungannya. Saat ini, sudah terdapat berbagai macam sensor yang dapat digunakan pada sistem embedded. Namun, pada projek ini, hanya akan dibahas sensor eksternal pengukur temperatur, tekanan, kelembaban, posisi ketinggian, percepatan gravitasi, dan kecepatan gerak. Sebuah komponen dapat mendeteksi beberapa pengukuran di atas.

Perlu diingat bahwa terdapat berbagai jenis sensor yang bekerja pada rentang tegangan tertentu serta protokol komunikasi tertentu. Pada ESP32, sensor akan bekerja pada tegangan 3,3 V. Oleh karena itu, jika akan menggunakan sensor yang bekerja pada tegangan 5 V, perlu sebuah komponen untuk melakukan konversi tegangan. ESP32 berkomunikasi dengan sensor menggunakan protokol komunikasi 12C atau SPI.

Pada percobaan ini, aku menggunakan 4 buah sensor, yaitu BMP280, BME280, BMP280, dan MPU6050.

Sensor yang digunakan

Let’s get started!!

BMP280

BMP280 adalah sensor untuk mendeteksi temperatur, tekanan, dan ketinggian. Sensor ini menggunakan protokol komunikasi 12C atau SPI untuk bertukar data dengan microcontroller.

Komponen yang dibutuhkan adalah sebagai berikut.

  1. ESP32
  2. Breadboard
  3. Kabel microUSB
  4. Sensor BMP280
  5. Kabel jumper
  6. Library BMP280

Library ini di dapat dari Sketch>Include Library>Manage Libraries. Setelah terbuka window Library Manager, lakukan pencarian adafruit bmp280 kemudian install.

Adafruit BMP280

7. Adafruit Unified Sensor

Library ini di dapat dari Sketch>Include Library>Manage Libraries. Setelah terbuka window Library Manager, lakukan pencarian Adafruit Unified Sensor kemudian install.

Adafruit Unified Sensor (Pilih yang paling bawah)

Rangkaian untuk menjalankan sensor BMP280 adalah sebagai berikut.

Rangkaian untuk menggunakan sensor BMP280

Rangkaian menggunakan 4 buah kabel jumper. Pin pada sensor harus dihubungkan dengan pin pada ESP32. Walaupun pada sensor terdapat 6 pin, hanya digunakan 4 pin saja, yaitu VCC, GND, SCL, dan SDA. Pin VCC dihubungkan dengan pin 3V3 pada, pin GND sensor dihubungkan dengan GND pada ESP32, pin SCL dihubungkan dengan pin 22, dan pin SDA dihubungkan dengan pin 21.

Kode program bisa didapatkan dari File > Examples > Adafruit BMP280 library > bmp280test. Akan muncul kode program pada window baru.

KODE PROGRAM BMP280
/***************************************************************************
This is a library for the BMP280 humidity, temperature & pressure sensor
Designed specifically to work with the Adafruit BMP280 Breakout
----> http://www.adafruit.com/products/2651
These sensors use I2C or SPI to communicate, 2 or 4 pins are required
to interface.
Adafruit invests time and resources providing this open source code,
please support Adafruit andopen-source hardware by purchasing products
from Adafruit!
Written by Limor Fried & Kevin Townsend for Adafruit Industries.
BSD license, all text above must be included in any redistribution
***************************************************************************/
#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);
Serial.println(F("BMP280 test"));
if (!bmp.begin(0x76)) {
Serial.println(F("Could not find a valid BMP280 sensor, check wiring!"));
while (1);
}
/* 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);
}

Program diawali dengan memasukkan library wire, SPI, dan Adafruit BMP280. Sensor ini menggunakan protokol komunikasi SPI dan 12C, maka dibuatlah 4 buah variabel dan membuat objek bernama bmp.

Pada bagian setup, buat komunikasi serial dan inisialisasi sensor. Dengan buad rate 115200 dan alamat 0x76. Jika tidak sesuai, akan mengeluarkan pesan error. Pada bagian loop, BMP280 membaca fungsi yang dimiliki untuk mengukur temperatur, tekanan, dan ketinggian, yaitu bmp.readTemperature(), bmp.readPressure(), dan bmp.readAltitude(). Diberikan juga delay selama beberapa detik sebelum sensor kembali mengupdate kondisinya.

Pada percobaanku, jika kode tidak ditambahkan tulisan bertanda tebal seperti diatas, tidak bisa ditampilkan informasi mengenai temperatur, tekanan, dan ketinggian. Pesan yang muncul adalah “Could not find a valid BMP280 sensor, check wiring!”.

Untuk mencari tahu alamat 12C yang terhubung dengan sensor, cek menggunakan kode seperti dibawah ini.

/*********
Rui Santos
Complete project details at https://randomnerdtutorials.com
*********/
#include <Wire.h>

void setup() {
Wire.begin();
Serial.begin(115200);
Serial.println("\nI2C Scanner");
}

void loop() {
byte error, address;
int nDevices;
Serial.println("Scanning...");
nDevices = 0;
for(address = 1; address < 127; address++ ) {
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0) {
Serial.print("I2C device found at address 0x");
if (address<16) {
Serial.print("0");
}
Serial.println(address,HEX);
nDevices++;
}
else if (error==4) {
Serial.print("Unknow error at address 0x");
if (address<16) {
Serial.print("0");
}
Serial.println(address,HEX);
}
}
if (nDevices == 0) {
Serial.println("No I2C devices found\n");
}
else {
Serial.println("done\n");
}
delay(5000);
}

Setelah kode di atas di jalankan, akan muncul tulisan seperti di bawah ini pada serial monitor.

Mencari port 12C

Pesan yang ditampilkan adalah address 0x76. Maka, masukkanlah nilai tersebut pada bmp.begin.

Setelah bmp280test kembali di upload dan di compile, buka serial monitor dan tekan tombol EN pada ESP32. Akan ditampilkan perhitungan temperatur, tekanan dan ketinggian.

Hasil percobaan BMP280

BME280

BME280 adalah sensor untuk mendeteksi temperatur, tekanan, ketinggian, dan kelembaban. Sensor ini menggunakan 12C atau SPI sebagai protokol komunikasi untuk bertukar data dengan microcontroller.

Komponen yang dibutuhkan adalah sebagai berikut.

  1. ESP32
  2. Breadboard
  3. Kabel microUSB
  4. Sensor BME280
  5. Kabel jumper
  6. Library BME280

Library ini di dapat dari Sketch>Include Library>Manage Libraries. Setelah terbuka window Library Manager, lakukan pencarian adafruit bme280 kemudian install.

Adafruit BME280

7. Adafruit Unified Sensor

Library ini adalah library yang sama saat menggunakan sensor BMP280. Dapat dilihat tata caranya pada bagian BMP280.

Rangkaian untuk menjalankan sensor BME280 adalah sebagai berikut.

Rangkaian untuk menggunakan sensor BME280

Rangkaian menggunakan 4 buah kabel jumper. Pin pada sensor harus dihubungkan dengan pin pada ESP32. Digunakan 4 pin saja, yaitu VIN, GND, SCL, dan SDA. Pin VIN dihubungkan dengan pin 3V3 pada, pin GND sensor dihubungkan dengan GND pada ESP32, pin SCL dihubungkan dengan pin 22, dan pin SDA dihubungkan dengan pin 21.

Kode program bisa didapatkan dari File > Examples > Adafruit BME280 library > bme280test. Akan muncul kode program pada window baru. Bisa juga menggunakan kode lain, seperti di bawah ini.

/*********
Complete project details at http://randomnerdtutorials.com
*********/
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
/*#include <SPI.h>
#define BME_SCK 18
#define BME_MISO 19
#define BME_MOSI 23
#define BME_CS 5*/
#define SEALEVELPRESSURE_HPA (1013.25)Adafruit_BME280 bme; // I2C
//Adafruit_BME280 bme(BME_CS); // hardware SPI
//Adafruit_BME280 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK); // software SPI
unsigned long delayTime;void setup() {
Serial.begin(9600);
Serial.println(F("BME280 test"));
bool status;// default settings
// (you can also pass in a Wire library object like &Wire2)
status = bme.begin(0x76);
if (!status) {
Serial.println("Could not find a valid BME280 sensor, check wiring!");
while (1);
}
Serial.println("-- Default Test --");
delayTime = 1000;
Serial.println();
}
void loop() {
printValues();
delay(delayTime);
}
void printValues() {
Serial.print("Temperature = ");
Serial.print(bme.readTemperature());
Serial.println(" *C");

// Convert temperature to Fahrenheit
/*Serial.print("Temperature = ");
Serial.print(1.8 * bme.readTemperature() + 32);
Serial.println(" *F");*/

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();
}

Program diawali dengan memasukkan library wire untuk menggunakan protokol komunikasi 12C, Adafruit_Sensor, dan Adafruit untuk BME280. Kemudian, terdapat bagian yang dijadikan komentar. Bagian tersebut diubah menjadi kode apabila ingin menggunakan protokol komunikasi SPI. Selanjutnya, dibuat variabel untuk menyimpan nilai tekanan pada ketinggian laut untuk dibandingkan dengan ketinggian kita saat ini. Setelah itu, dibuat objek bernama BME jika menggunakan protokol komunikasi 12C.

Pada bagian setup, buat komunikasi serial dan inisialisasi sensor. Dengan alamat 0x76, jika tidak sesuai, akan mengeluarkan pesan error. Pada bagian loop, BME280 membaca fungsi yang dimiliki untuk mengukur temperatur, kelembaban, tekanan, dan ketinggian, yaitu bme.readTemperature(), bme.readHumidity(), dan seterusnya. Diberikan juga delay selama beberapa detik sebelum sensor kembali mengupdate kondisinya.

Setelah kode program di upload dan di compile, buka serial monitor dan tekan tombol EN pada ESP32. Akan ditampilkan perhitungan temperatur, tekanan, ketinggian, dan kelembaban.

Hasil percobaan BME280

BMP180

BMP180 adalah sensor untuk mendeteksi temperatur, tekanan, dan ketinggian. Sensor ini menggunakan 12C sebagai protokol komunikasi.

Komponen yang dibutuhkan adalah sebagai berikut.

  1. ESP32
  2. Breadboard
  3. Kabel microUSB
  4. Sensor BMP180
  5. Kabel jumper
  6. Library BMP180

Library ini di dapat dari Sketch>Include Library>Manage Libraries. Setelah terbuka window Library Manager, lakukan pencarian adafruit bmp085 kemudian install.

7. Adafruit Unified Sensor

Library ini adalah library yang sama saat menggunakan sensor BMP280. Dapat dilihat tata caranya pada bagian BMP280.

Rangkaian untuk menjalankan sensor BMP180 adalah sebagai berikut.

Rangkaian untuk menggunakan sensor BMP180

Rangkaian menggunakan 4 buah kabel jumper. Pin pada sensor harus dihubungkan dengan pin pada ESP32. Digunakan 4 pin, yaitu VIN, GND, SCL, dan SDA. Pin VCC dihubungkan dengan pin 3V3 pada, pin GND sensor dihubungkan dengan GND pada ESP32, pin SCL dihubungkan dengan pin 22, dan pin SDA dihubungkan dengan pin 21.

Kode program bisa didapatkan dari File > Examples > Adafruit BMP085 library > bmp085test. Akan muncul kode program pada window baru. Bisa juga menggunakan kode program seperti di bawah ini.

/*
* Rui Santos
* Complete Project Details http://randomnerdtutorials.com
*/
#include <Wire.h>
#include <Adafruit_BMP085.h>
Adafruit_BMP085 bmp;

void setup() {
Serial.begin(9600);
if (!bmp.begin()) {
Serial.println("Could not find a valid BMP085/BMP180 sensor, check wiring!");
while (1) {}
}
}

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

Serial.print("Pressure = ");
Serial.print(bmp.readPressure());
Serial.println(" Pa");

// Calculate altitude assuming 'standard' barometric
// pressure of 1013.25 millibar = 101325 Pascal
Serial.print("Altitude = ");
Serial.print(bmp.readAltitude());
Serial.println(" meters");
Serial.print("Pressure at sealevel (calculated) = ");
Serial.print(bmp.readSealevelPressure());
Serial.println(" Pa");
// you can get a more precise measurement of altitude
// if you know the current sea level pressure which will
// vary with weather and such. If it is 1015 millibars
// that is equal to 101500 Pascals.
Serial.print("Real altitude = ");
Serial.print(bmp.readAltitude(102000));
Serial.println(" meters");

Serial.println();
delay(2000);
}

Program diawali dengan memasukkan library wire untuk menggunakan protokol komunikasi 12C dan Adafruit untuk BMP085. Setelah itu, dibuat objek bernama BMP.

Pada bagian setup, buat komunikasi serial dan inisialisasi sensor. Jika tidak sesuai dengan status yang diberikan, akan dikeluarkan pesan error. Pada bagian loop, BMP180 membaca fungsi yang dimiliki untuk mengukur temperatur, tekanan, dan ketinggian, yaitu bmp.readTemperature(), bme.readPressure(). Untuk mengukur ketinggian, diberikan 2 cara, yaitu fungsi yang diberikan parameter dan tanpa parameter. Fungsi bmp.readAltitude tanpa parameter mengasumsikan tekanan pada ketinggian laut adalah 10132, sedangkan fungsi yang diberikan parameter mengasumsikan tekanan pada ketinggian laut adalah parameter tersebut. Pada kode program di atas, diberikan 102000. Diberikan juga delay selama beberapa detik sebelum sensor kembali mengupdate kondisinya.

Setelah kode program di upload dan di compile, buka serial monitor dan tekan tombol EN pada ESP32. Akan ditampilkan perhitungan temperatur, tekanan, dan ketinggian.

Hasil percobaan BMP180

MPU-6050

MPU-6050 adalah sensor accelerometer, gyroscope, dan temperatur. Sensor accelerometer mengukur percepatan gravitasi dan sensor gyroscope mengukur kecepatan rotasi. Sehingga, MPU-6050 tepat untuk digunakan pada objek yang bergerak. Pada bagian ini, terdapat pengaplikasian MPU-6050 tanpa OLED dan dengan OLED.

Komponen yang dibutuhkan adalah sebagai berikut.

  1. ESP32
  2. Breadboard
  3. Kabel microUSB
  4. Sensor MPU-6050
  5. Kabel jumper
  6. Library MPU-6050

Library ini di dapat dari Sketch>Include Library>Manage Libraries. Setelah terbuka window Library Manager, lakukan pencarian adafruit mpu6050 kemudian install.

Adafruit MPU-6050

7. Adafruit Unified Sensor

Library ini adalah library yang sama saat menggunakan sensor BMP280. Dapat dilihat tata caranya pada bagian BMP280.

8. Adafruit Bus IO

Library ini di dapat dari Sketch>Include Library>Manage Libraries. Setelah terbuka window Library Manager, lakukan pencarian adafruit busio, kemudian install.

Rangkaian untuk menjalankan sensor MPU-6050 adalah sebagai berikut.

Rangkaian untuk menggunakan sensor MPU-6050 tanpa OLED

Rangkaian menggunakan 4 buah kabel jumper. Pin pada sensor harus dihubungkan dengan pin pada ESP32. Walaupun terdapat 8 pin, hanya digunakan 4 pin, yaitu VCC, GND, SCL, dan SDA. Pin VCC dihubungkan dengan pin 3V3 pada, pin GND sensor dihubungkan dengan GND pada ESP32, pin SCL dihubungkan dengan pin 22, dan pin SDA dihubungkan dengan pin 21.

Kode program bisa didapatkan melalui File > Examples > Adafruit MPU6050 > basic_readings.

// Basic demo for accelerometer readings from Adafruit MPU6050#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#include <Wire.h>
Adafruit_MPU6050 mpu;void setup(void) {
Serial.begin(115200);
while (!Serial)
delay(10); // will pause Zero, Leonardo, etc until serial console opens
Serial.println("Adafruit MPU6050 test!");// Try to initialize!
if (!mpu.begin()) {
Serial.println("Failed to find MPU6050 chip");
while (1) {
delay(10);
}
}
Serial.println("MPU6050 Found!");
mpu.setAccelerometerRange(MPU6050_RANGE_8_G);
Serial.print("Accelerometer range set to: ");
switch (mpu.getAccelerometerRange()) {
case MPU6050_RANGE_2_G:
Serial.println("+-2G");
break;
case MPU6050_RANGE_4_G:
Serial.println("+-4G");
break;
case MPU6050_RANGE_8_G:
Serial.println("+-8G");
break;
case MPU6050_RANGE_16_G:
Serial.println("+-16G");
break;
}
mpu.setGyroRange(MPU6050_RANGE_500_DEG);
Serial.print("Gyro range set to: ");
switch (mpu.getGyroRange()) {
case MPU6050_RANGE_250_DEG:
Serial.println("+- 250 deg/s");
break;
case MPU6050_RANGE_500_DEG:
Serial.println("+- 500 deg/s");
break;
case MPU6050_RANGE_1000_DEG:
Serial.println("+- 1000 deg/s");
break;
case MPU6050_RANGE_2000_DEG:
Serial.println("+- 2000 deg/s");
break;
}
mpu.setFilterBandwidth(MPU6050_BAND_21_HZ);
Serial.print("Filter bandwidth set to: ");
switch (mpu.getFilterBandwidth()) {
case MPU6050_BAND_260_HZ:
Serial.println("260 Hz");
break;
case MPU6050_BAND_184_HZ:
Serial.println("184 Hz");
break;
case MPU6050_BAND_94_HZ:
Serial.println("94 Hz");
break;
case MPU6050_BAND_44_HZ:
Serial.println("44 Hz");
break;
case MPU6050_BAND_21_HZ:
Serial.println("21 Hz");
break;
case MPU6050_BAND_10_HZ:
Serial.println("10 Hz");
break;
case MPU6050_BAND_5_HZ:
Serial.println("5 Hz");
break;
}
Serial.println("");
delay(100);
}
void loop() {/* Get new sensor events with the readings */
sensors_event_t a, g, temp;
mpu.getEvent(&a, &g, &temp);
/* Print out the values */
Serial.print("Acceleration X: ");
Serial.print(a.acceleration.x);
Serial.print(", Y: ");
Serial.print(a.acceleration.y);
Serial.print(", Z: ");
Serial.print(a.acceleration.z);
Serial.println(" m/s^2");
Serial.print("Rotation X: ");
Serial.print(g.gyro.x);
Serial.print(", Y: ");
Serial.print(g.gyro.y);
Serial.print(", Z: ");
Serial.print(g.gyro.z);
Serial.println(" rad/s");
Serial.print("Temperature: ");
Serial.print(temp.temperature);
Serial.println(" degC");
Serial.println("");
delay(500);
}

Program diawali dengan memasukkan library adafruit mpu6050 dan adafruit sensor. Setelah itu, dibuat objek bernama MPU.

Pada bagian setup, buat komunikasi serial pada baud rate 115200 dan inisialisasi sensor. Jika tidak sesuai, akan dikeluarkan pesan error. Kemudian, MPU6050 membaca fungsi yang dimiliki untuk mengukur rentang accelerometer dan gyroscope, yaitu, mpu.setAccelerometerRange(MPU6050_RANGE_8_G) dan mpu.setGyroRange(MPU6050_RANGE_500_DEG). Pada bagian loop, disimpan terlebih dahulu hasil baca sensor sementara, kemudian baca perubahan yang terjadi melalui fungsi acceleration untuk accelerometer dan fungsi gyro untuk mendapatkan kecepatan rotasi. Setiap pembacaan sensor, program menampilkan hasil. Diberikan juga delay selama beberapa detik sebelum sensor kembali mengupdate kondisinya.

Setelah kode program di upload dan di compile, buka serial monitor dan tekan tombol EN pada ESP32. Akan ditampilkan perhitungan acceleration dalam 3 sumbu (x, y, z), rotasi dalam 3 sumbu (x, y, z), dan temperatur.

Hasil percobaan MPU-6050 tanpa OLED

Untuk menggunakan MPU-6050 dengan OLED, komponen yang digunakan tetap sama. Namun dengan rangkaian dan kode program yang berbeda.

Rangkaian untuk menggunakan sensor MPU-6050 dengan OLED

Pin MPU-6050 yang digunakan adalah pin yang sama dengan percobaan tanpa OLED. Pada OLED terdapat 4 buah pin, yaitu GND, VDD, SCK, dan SDA. Hubungkan pin GND pada OLED dengan MPU-6050, pin SDA pada OLED dengan SDA pada MPU-6050, dan pin SCK pada OLED dengan pin SCL pada MPU-6050. Hubungkan VDD dan VCC pada pin 3V3 milik ESP32. Dari ketiga pin yang menghubungkan OLED dengan MPU-6050, hubungkan dari salah satu komponen, pada pin ESP32, sehingga hanya akan ada sebuah kabel yang terhubung dengan GND, pin 22 untuk SCL, dan pin 21 untuk SDA.

Kode program bisa didapatkan melalui File > Examples > Adafruit MPU6050 > MPU6050_oled.

#include <Adafruit_MPU6050.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_Sensor.h>
Adafruit_MPU6050 mpu;
Adafruit_SSD1306 display = Adafruit_SSD1306(128, 32, &Wire);
void setup() {
Serial.begin(115200);
// while (!Serial);
Serial.println("MPU6050 OLED demo");
if (!mpu.begin()) {
Serial.println("Sensor init failed");
while (1)
yield();
}
Serial.println("Found a MPU-6050 sensor");
// SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3C for 128x32
Serial.println(F("SSD1306 allocation failed"));
for (;;)
; // Don't proceed, loop forever
}
display.display();
delay(500); // Pause for 2 seconds
display.setTextSize(1);
display.setTextColor(WHITE);
display.setRotation(0);
}
void loop() {
sensors_event_t a, g, temp;
mpu.getEvent(&a, &g, &temp);
display.clearDisplay();
display.setCursor(0, 0);
Serial.print("Accelerometer ");
Serial.print("X: ");
Serial.print(a.acceleration.x, 1);
Serial.print(" m/s^2, ");
Serial.print("Y: ");
Serial.print(a.acceleration.y, 1);
Serial.print(" m/s^2, ");
Serial.print("Z: ");
Serial.print(a.acceleration.z, 1);
Serial.println(" m/s^2");
display.println("Accelerometer - m/s^2");
display.print(a.acceleration.x, 1);
display.print(", ");
display.print(a.acceleration.y, 1);
display.print(", ");
display.print(a.acceleration.z, 1);
display.println("");
Serial.print("Gyroscope ");
Serial.print("X: ");
Serial.print(g.gyro.x, 1);
Serial.print(" rps, ");
Serial.print("Y: ");
Serial.print(g.gyro.y, 1);
Serial.print(" rps, ");
Serial.print("Z: ");
Serial.print(g.gyro.z, 1);
Serial.println(" rps");
display.println("Gyroscope - rps");
display.print(g.gyro.x, 1);
display.print(", ");
display.print(g.gyro.y, 1);
display.print(", ");
display.print(g.gyro.z, 1);
display.println("");
display.display();
delay(100);
}

Program diawali dengan memasukkan library adafruit mpu6050, adafruit sensor, dan adafruit SSD1306. Setelah itu, dibuat objek Adafruit_MPU6050 bernama MPU dan Adafruit_SSD1306 bernama display untuk menangani layar OLED berukuran 128x64 pixel.

Pada bagian setup, buat komunikasi serial pada baud rate 115200 dan inisialisasi sensor dan layar OLED. Jika tidak sesuai, akan dikeluarkan pesan error. Setelah itu, program mengatur ukuran, warna, dan rotasi tulisan yang akan ditampilkan pada layar OLED.

Pada bagian loop, disimpan terlebih dahulu hasil baca sensor sementara, kemudian baca perubahan baru yang terjadi melalui fungsi mpu.getEvent(accelerometer, gyro, temperatur). Untuk setiap pembacaan, display harus diupdate, sehingga hasil display lama harus dihapus terlebih dahulu menggunakan fungsi clearDisplay dan mengeset penulisan awal pada titik 0, 0. Setelah itu, dilakukan pembacaan accelerometer dan gyro, serta ditampilkan hasilnya pada layar OLED dengan fungsi display(). Untuk setiap pembacaan, diberikan delay selama beberapa detik sebelum sensor kembali mengupdate kondisinya.

Setelah kode di upload dan di compile, tekan tombol EN pada ESP32, kemudian akan muncul informasi pada OLED mengenai acceleration dan rotation.

Hasil percobaan BMP280 dengan OLED

Jika ingin mengetahui hasil percobaan secara lengkap, boleh melihat tautan di bawah inii.

https://youtu.be/jAdp17-jafo

Silahkan disaksikan, semoga bisa membantu!!

Beberapa hasil analisis yang dapat diketahui adalah sebagai berikut.

  1. Sensor yang digunakan memiliki protokol komunikasi 12C, sehingga setiap sensor pasti terhubung dengan pin 22 dan 21, karena 2 pin itulah yang memiliki kemampuan menjalankan protokol komunikasi, yaitu SCL dan SDA.
  2. Dengan protokol komunikasi 12C, beberapa program membutuhkan alamat khusus agar sensor dapat bekerja dan memberikan hasil.
  3. Kendala yang dialami adalah terkadang sensor membaca keadaan yang salah dan tidak masuk akal, seperti suhu bernilai >100 derajat celcius atau ketinggian bernilai negatif, serta sensor tidak membaca apapun sehingga informasi yang diberikan hanya berisi NaN.
Kendala yang dihadapi

4. Walaupun keempat percobaan dilakukan pada tempat yang sama dan waktu yang berdekatan, tidak seluruh hasilnya menunjukkan nilai yang persis sama. Namun, setiap sensor yang dapat mengukur temperatur mampu mendeteksi suhu tubuh manusia, dibuktikan dengan naiknya suhu pada hasil baca.

Nah, sekian percobaanku kali ini. Semoga dapat membantu dan sampai jumpa pada projek berikutnya!!

--

--