PROJECT 4: EXPERIMENT WITH SENSOR SYSTEM ESP32

Muhammad Raflie Dwi Putra
20 min readFeb 21, 2021

--

Bismillaahirrahmaanirrahiim..

Hello sobat setia medium-ers semua!! Gimana kabarnya?? Semoga sehat selalu yaa..

Menurut pepatah, tak kenal maka?? ya kenalan dongg.. Sebelumnya kita kenalan dulu ya guys. Kenalin namaku Muhammad Raflie Dwi Putra yang bisa dipanggil Raflie dengan NIM 18219035. Aku sedang berkuliah semester 4 di prodi Sistem dan Teknologi Informasi (STI) Institut Teknologi Bandung.

Disclaimer, sobat tau masih ingat kah di eksperimen project sebelumnya bahwa ESP32 memiliki Internal Sensor. Nahh selain itu, ESP32 kita ini juga dapat diaplikasikan dengan Eksternal Sensor. Jika di-flashback kembali, secara lebih detail, sensor merupakan bagian dari suatu sistem yang berfungsi untuk meraba dan memahami fenomena yang terdapat dalam lingkungan sekitarnya. Terdapat berbagai macam sensor yang dapat dihubungkan dengan sistem embedded, untuk mengukur jarak, volume, gerakan, posisi, cuaca, beban, dst.

Sensor terdapat banyak jenisnya. Khusus untuk penggunaan ESP32, perlu diperhatikan bahwa sensor tersebut bekerja pada level tegangan yang sesuai (3,3 V). Bila hendak menggunakan sensor yang bekerja pada level tegangan 5 V (sensor Arduino), maka diperlukan komponen tambahan untuk melakukan konversi tegangan, agar antara sensor dan mikrokontroler dapat berkomunikasi dengan baik.

Kejadian Pertama (Lucu)

Namun, karena aku penasaran dengan sensor ultrasonic (HC-SR04), lalu aku beli lah sensor tersebut sekalian memesan komponen yang belum aku miliki dari eksperimen kali ini. Alasan aku memesannya karena merasa tertarik dengan berbagai video yang aku tonton yang menggunakan sensor ultrasonic ini dalam mengukur jarak atau ketinggian air. Ketika aku ingin mencoba sensor ini, sebelum itu aku mencari infonya terlebih dahulu dan TERNYATA sensor ini bekerja pada level tegangan 5 V (sensor Arduino), tidaklah compatible dengan microcontroller ESP32 ini (tanpa adanya komponen tambahan konversi tegangan disebut dengan logic converter). Akhirnya, aku hanya memanfaatkan komponen sensor yang aku miliki sekarang. Yuu bisa yuu!!!

Gambar 1. Foto HC-SR04 Sensor Ultrasonic (Level Tegangan 5 V)

Kejadian Kedua (Kekecewaan yang Memuaskan)

Kini, aku benar-benar ingin memanfaatkan komponen yang aku punya sekarang. Berhubung aku memiliki komponen display (LCD) sehingga aku tertarik untuk menampilkan hasil pembacaan dari sensor ini ke LCD (Liquid Crystal Display) tersebut. (ket: Display ini memungkinkan untuk di kontrol dengan menggunakan komunikasi I2C atau Inter-Integrated Circuit). Sebelum itu, aku ingin mencoba melakukan testing dengan mengeluarkan static-text ke LCD ini terlebih dahulu. Aku mencoba mencari referensinya dalam web andalan yaitu Random Nerd Tutorials | Learn ESP32, ESP8266, Arduino, and Raspberry Pi. Pada percobaan pertama, aku belum berhasil mengeluarkan apapun ke LCD. Aku berusaha melakukan berbagai troubleshoot dari percobaan ini, seperti wiring antar pin, kode program, libraries Arduino yang dibutuhkan, kesesuaian address dari LCD, menukar GPIO yang memiliki kesamaan fungsi, dsb. Setelah aku coba dan coba oprek berkali-kali dari berbagai referensi lainnya, tetap tidaklah membuahkan hasil. LCD ini hanyalah menyala pada bagian layar LCD dan red-LED dari I2C nya, serta merespon dengan meredupkan layar sekejap setelah program aku upload dari Arduino IDE ke ESP32 kemudian kembali menyala. Aku tidaklah menyerah dan mencobanya terus-menerus hampir memakan waktu dari pagi hingga malam (selain jam kuliah), serta konsultasi dengan asisten dosen (kating) yang membantu menjawab berbagai pertanyaan ku. Konsultasi ini pun pada akhirnya membuahkan hasil dengan pertanyaan dari katingku bahwa “Kamu kalo nyoba beli lcd baru lagi masalah gak flii?” yang artinya kami berasumsi bahwa terdapat ‘kecacatan’ pada LCD tersebut (padahal aku baru membelinya). Walau aku tetap mencoba untuk solving, namun tetaplah tidak berhasil, dan ALHASIL aku memutuskan untuk membeli display jenis lainnya yaitu OLED (sekalian memesan komponen sensor lainnya, termasuk HC-SR04 wkwk).
Namun, aku tetaplah mendapat kepuasan tersendiri dengan mendapatkan banyak pengalaman dalam troubleshoot di ESP32 ini. Ingatlah guys, “Banyak-banyaklah melakukan kegagalan dalam belajar demi mencapai kesuksesan kelak yang haqiqi”.

Gambar 2. Foto LCD 1602 with I2C (Display Component)

Back to our topick…

Nahh jadi di project keempat kali ini kita akan bermain-main sambil belajar dengan:

  • Sensor BME-280 untuk mengukur tekanan, temperatur dan kelembaban
  • ESP32 Web Server Weather Station dengan Sensor BME-280
  • Sensor MPU-6050 untuk mengukur Accelerometer, Gyroscope and Temperature.
  • Tampilan Pembacaan MPU-6050 pada OLED Display

KOMPONEN DAN ALAT YANG DIBUTUHKAN

Tentunya, untuk menjalankan berbagai program Eksternal Sensor ESP32 yang telah disebutkan sebelumnya, membutuhkan beberapa komponen atau alat yang perlu disiapkan, yaitu:

  • ESP32 DEVKIT V1 DOIT Board, sebagai komponen utama untuk dimasukkan program dari Arduino IDE.
Gambar 3. Foto ESP32 DEVKIT V1 DOIT Board
  • Kabel Micro USB (type A), sebagai kabel penghubung ESP32 Board dengan PC/Laptop untuk memasukkan program.
Gambar 4. Foto Kabel Micro USB (type A)
  • Perangkat PC (Laptop / Komputer), tentunya yang sudah terinstall aplikasi Arduino IDE dan paket board ESP-32 di dalamnya.
    (Catatan: Jika belum disiapkan, bisa diikuti langkah-langkah pada link ini.)
Gambar 5. Foto Perangkat PC (Laptop / Komputer)
  • Breadboard 830 points, sebagai tempat meletakkan ESP32 Board dan menghubungkan berbagai komponen dengan bantuan kabel jumper wires, baik secara seri maupun parallel.
Gambar 6. Foto Breadboard 830 points
  • Jumper Wires Male to Female and Jumper Wires Male to Male, sebagai penghubung antar komponen melalui breadboard.
Gambar 7. Foto Jumper Wires Male to Female and Jumper Wires Male to Male
  • BME-280 sensor module, untuk mengukur tekanan, temperatur dan kelembaban (aku pakai yang 4 pin).
    Spesifikasi :
    Pasokan Tegangan: 1.8–5 V DC; Antarmuka: I2C (hingga 3.4 MHz), SPI (hingga 10 MHz)
    Rentang operasional :
    Suhu:-40 sampai + 85 °C; Kelembaban: 0–100%; Tekanan: 300–1100 hPa
    Resolusi :
    Suhu: 0.01 °C; Kelembaban: 0.008%; Tekanan: 0.18 Pa;
    Akurasi :
    Suhu: +-1 °C; Kelembaban: +-3%; Tekanan: +-1 Pa;
    I2C alamat :
    SDO RENDAH: 0x76; SDO TINGGI: 0x77
Gambar 8. Sumber: https://lastminuteengineers.com/
Gambar 9. Foto BME-280 Sensor Module
  • MPU-6050 Accelerometer Gyroscope, untuk mengukur percepatan gravitasi dan kecepatan gerak dengan kemiringan sudut; serta temperatur.
    Spesifikasi dari module MPU6050 :
    - Menggunakan chip IC MPU6050
    - Tegangan operasional di range antara 3Vdc — 5Vdc
    - Menggunakan antarmuka komunikasi I2C (SCL, SDA)
    - Range dari Gyroscope : 250 500 1000 2000 / s
    - Chip built-in 16bit AD converter, 16-bit data output
    - Difungsikan sebagai sensor accelerometer dan gyroscope
    - Ukuran modul : 2.2cm x 1.7cm
Gambar 10. Sumber: https://lastminuteengineers.com/
Gambar 11. Foto MPU-6050 Sensor Accelerometer Gyroscope
  • 0.96 inch I2C OLED Display SSD1306, sebagai komponen display hasil pembacaan dari sensor.
    Spesifikasi:
    - Interface: I2C (3.3V / 5V logic level)
    - Resolusi: 128 x 64
    - Sudut Pandang: >160 derajat
    - Warna : Kombinasi Kuning dan Biru
    - Power supply: DC3.3V~5V
    - Operating temperature: -20'C~70'C
    - Ukuran LCD+Board : 2.7 x 2.7 cm
Gambar 12. Sumber: https://lastminuteengineers.com/
Gambar 13. Foto I2c OLED Display 0.96 inch SSD1306

Diagram Skema Rangkaian

Pada diagram skema rangkaian berikut, kita dapat menyusun rangkaian sesuai diagram skema ataupun dengan kreasi sendiri. Untuk menyusun rangkaian terdapat 2 pilihan jenis jumper wires yang digunakan. Jika kita menyusun rangkaian dengan tidak meletakkan ESP32 Board pada Breadboard, maka kita dapat menghubungkan Breadboard dengan ESP32 Board dengan jumper wires jenis male to female, dengan male pada Breadboard dan female pada kaki ESP32 Board. Sedangkan jika kita menyusun rangkaian dengan menanam / memasukkan semua kaki ESP32 Board pada Breadboard, maka kita dapat menghubungkan antar komponen dengan ESP32 Board dengan jumper wires jenis male to male, dengan langsung memasukkan male ke point yang sejajar kaki pin ESP32 yang sesuai pada Breadboard. Namun jika memungkinkan, menurut aku lebih baik pilihan kedua, yaitu menanamkan ESP32 board pada Breadboard, sehingga ketika ESP32 dihubungkan ke powersource (catu daya) pada Laptop/PC dapat diminimalisir tersentuhnya kaki ESP32 oleh tangan kita, karena apabila tersentuh oleh tangan dapat menyebabkan hubung singkat sehingga menurunkan performa ESP32 kita.

1. Sensor BME-280 untuk mengukur tekanan, temperatur dan kelembaban; dan

2. ESP32 Web Server Weather Station dengan Sensor BME-280

Gambar 14. Diagram Skema Sensor BME-280

Sesuai diagram skema di atas, kita dapat memastikan bahwa:

  1. ESP32 dan BME-280 benar-benar tertanam kaki-kakinya (terutama pin yang digunakan) pada Breadboard.
  2. GPIO 3V3 pada ESP32 terhubung secara seri dengan pin VIN pada BME-280 (kabel abu-abu). Selain skema di atas, dapat juga menghubungi kedua pin ini melalui kutub positif (dekat garis merah) dari Breadboard.
  3. GPIO GND pada ESP32 terhubung secara seri dengan pin GND pada BME-280 (kabel hitam). Selain skema di atas, dapat juga menghubungi kedua pin ini melalui kutub negatif (dekat garis biru) dari Breadboard.
  4. GPIO 21 atau D21 pada ESP32 terhubung secara seri dengan pin SDA pada BME-280 (kabel biru).
  5. GPIO 22 atau D22 pada ESP32 terhubung secara seri dengan pin SCL pada BME-280 (kabel orange).
  6. Pastikan bahwa: ESP32 Board sudah terhubung pada power source (catu daya) Laptop / PC dengan kabel Micro USB (type A), sehingga LED pada ESP32 Board menyala.
Gambar 15. Foto Rangkaian Berdasarkan Skema Diagram

3. Sensor MPU-6050 untuk mengukur Accelerometer, Gyroscope and Temperature

Gambar 16. Diagram Skema Sensor MPU-6050

Sesuai diagram skema di atas, kita dapat memastikan bahwa:

  1. ESP32 dan MPU-6050 benar-benar tertanam kaki-kakinya (terutama pin yang digunakan) pada Breadboard.
  2. GPIO 3V3 pada ESP32 terhubung secara seri dengan pin VCC pada MPU-6050 (kabel orange). Selain skema di atas, dapat juga menghubungi kedua pin ini melalui kutub positif (dekat garis merah) dari Breadboard.
  3. GPIO GND pada ESP32 terhubung secara seri dengan pin GND pada MPU-6050 (kabel hitam). Selain skema di atas, dapat juga menghubungi kedua pin ini melalui kutub negatif (dekat garis biru) dari Breadboard.
  4. GPIO 21 atau D21 pada ESP32 terhubung secara seri dengan pin SDA pada MPU-6050 (kabel hijau).
  5. GPIO 22 atau D22 pada ESP32 terhubung secara seri dengan pin SCL pada MPU-6050 (kabel biru).
  6. Pastikan bahwa: ESP32 Board sudah terhubung pada power source (catu daya) Laptop / PC dengan kabel Micro USB (type A), sehingga LED pada ESP32 Board dan MPU-6050 menyala.
Gambar 17
Gambar 18. Foto Rangkaian Berdasarkan Skema Diagram

4. Tampilan Pembacaan MPU-6050 pada OLED Display

Gambar 19. Diagram Skema MPU-6050 dengan OLED Display
Gambar 20. Diagram Skema (Skema Implementasi Rangkaian Parallel dari Skema Sebelumnya)

Sesuai diagram skema di atas, kita dapat memastikan bahwa:

  1. ESP32, MPU-6050, dan OLED Display benar-benar tertanam kaki-kakinya (terutama pin yang digunakan) pada Breadboard.
  2. GPIO 3V3 pada ESP32 terhubung secara paralel dengan pin VCC pada MPU-6050 dan pin VCC / VDD pada OLED Display melalui kutub positif (dekat garis merah) dari Breadboard (kabel merah).
  3. GPIO GND pada ESP32 terhubung secara paralel dengan pin GND pada MPU-6050 dan pin GND pada OLED Display melalui kutub negatif (dekat garis biru) dari Breadboard (kabel hitam).
  4. GPIO 21 atau D21 pada ESP32 terhubung secara paralel dengan pin SDA pada MPU-6050 dan pin SDA pada OLED Display melalui pin pada Breadboard seperti implementasi skema pada (Gambar. 20) (kabel hijau).
  5. GPIO 22 atau D22 pada ESP32 terhubung secara paralel dengan pin SCL pada MPU-6050 dan pin SCK pada OLED Display melalui pin pada Breadboard seperti implementasi skema pada (Gambar. 20) (kabel biru).
  6. Pastikan bahwa: ESP32 Board sudah terhubung pada power source (catu daya) Laptop / PC dengan kabel Micro USB (type A), sehingga LED pada ESP32 Board dan MPU-6050 menyala.
Gambar 21. Foto Rangkaian Berdasarkan Skema Diagram

LIBRARIES dan KODE PROGRAM

1. Sensor BME-280 untuk mengukur tekanan, temperatur dan kelembaban

  • Untuk melakukan pembacaan dari BME280 Sensor Module, kita butuh menggunakan Adafruit_BME280 library dan Adafruit_Sensor library. Berikut cara menginstall seluruh libraries tersebut dalam Arduino IDE:
    Buka aplikasi Arduino IDE dan buka menu Sketch > Include Library > Manage Libraries. Kemudian Library Manager akan terbuka.
    Search “adafruit bme280” pada Search box dan install library tersebut; Search “Adafruit Unified Sensor” pada Search box kemudian scroll ke paling bawah, dan install library tersebut;
  • Setelah kedua libraries tersebut terinstall, kemudian restart Arduino IDE kita.
  • Lalu setelah rangkaian sesuai dengan diagram skema di atas, maka dapat dibuat program untuk mengukur tekanan, temperatur dan kelembaban, serta melihat hasil nilai pembacaannya pada Serial Monitor. Dapat disesuaikan dengan kode program berikut:
#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;// pengaturan default
// (kita juga bisa melewati sebuah Wire library seperti &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();
}

Penjelasan Kode Program

Libraries
Kode dimulai dengan include seluruh libraries yang dibutuhkan: Library wire untuk menggunakan I2C, dan libries Adafruit_Sensor dan Adafruit_BME280 sebagai antarmuka dengan sensor BME280.

Komunikasi SPI
Karena kita ingin menggunakan komunikasi I2C, baris kode yang menentukan pin-pin SPI dijadikan komentar:

Tekanan Permukaan Laut
Sebuah variabel yang dipanggil SEALEVELPRESSURE_HPA telah dibuat. Variabel ini menyimpan tekanan pada permukaan laut dalam hectopascal (equivalent dengan milibar). Variabel ini digunakan untuk memperkirakan ketinggian untuk suatu tekanan dengan membandingkannya dengan tekanan permukaan laut. Contoh ini menggunakan nilai default, tetapi untuk hasil yang lebih akurat, ganti nilainya dengan tekanan permukaan laut saat ini di lokasi kita masing-masing.

I2C
Contoh ini menggunakan protokol komunikasi I2C secara default. Seperti yang kita lihat, kita hanya perlu membuat objek Adafruit_BME280 bernama bme.
Untuk menggunakan SPI, kita perlu mengomentari baris sebelumnya ini dan menghapus komentar salah satu baris berikut bergantung pada apakah kita menggunakan perangkat keras atau perangkat lunak SPI (SPI perangkat keras menggunakan pin HSPI default ESP32; perangkat lunak SPI menggunakan pin yang ditentukan pada kode).

setup()
Di setup(), mulai komunikasi serial dan inisialisasikan sensor:
(Aku menginisialisasi sensor dengan alamat 0x76. Jika kalian tidak mendapatkan pembacaan sensor, periksa alamat I2C sensor kalian. Dengan sensor BME280 yang terhubung ke ESP32 kalian, jalankan sketsa pemindai I2C ini untuk memeriksa alamat sensor kalian. Kemudian, ubah alamatnya jika perlu.)

Mengeluarkan nilai
Pada loop(), fungsi printValues() membaca nilai dari BME280 dan mencetak hasilnya di Serial Monitor. Membaca suhu, kelembapan, tekanan, dan ketinggian perkiraan semudah menggunakan metode berikut pada objek bme:
bme.readTemperature () — membaca suhu dalam Celcius;
bme.readHumidity () — membaca kelembaban absolut;
bme.readPressure () — membaca tekanan dalam hPa (hektoPascal = millibar);
bme.readAltitude(SEALEVELPRESSURE_HPA) — memperkirakan ketinggian dalam meter berdasarkan tekanan di permukaan laut.

  • Jika program sudah siap, compile dengan meng-klik menu Verify yang simbolnya checklist di pojok kiri atas aplikasi Arduino IDE.
  • Setelah proses compile selesai, kemudian klik menu Upload yang simbolnya panah kanan di sebelah menu Verify tadi.
  • Kemudian buka Serial Monitor pada baud rate 9600. Tekan tombol RST on-board untuk menjalankan kode. Kita dapat melihat bacaan yang ditampilkan di Serial Monitor.
Hasil Pembacaan Serial Monitor BME-280

2. ESP32 Web Server Weather Station dengan Sensor BME-280

Seluruh libraries yang digunakan sama seperti bagian 1 (Sensor BME-280 untuk mengukur tekanan, temperatur dan kelembaban)!!!

  • Membuat Web Server

Setelah kita mengetahui cara mengambil bacaan dari sensor, dan cara membuat tabel untuk menampilkan hasilnya, sekarang saatnya membangun server web. Jika kita telah mengikuti tutorial ESP32 lainnya, kita harus memahami sebagian besar kodenya. Jika tidak, lihat Tutorial Server Web ESP32.

Salin kode berikut ke Arduino IDE kalian. Jangan upload dulu. Pertama, kalian perlu memasukkan SSID dan kata sandi dari jaringan internet kalian, misal Wifi.

/*********
Rui Santos
Complete project details at http://randomnerdtutorials.com
*********/

// Load Wi-Fi library
#include <WiFi.h>
#include <Wire.h>
#include <Adafruit_BME280.h>
#include <Adafruit_Sensor.h>

// hapus tanda komentar pada baris berikut jika Anda menggunakan SPI
/*#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

// Ganti dengan kredensial jaringan Anda
const char* ssid = "GANTI_DENGAN_SSID_ANDA";
const char* password = "GANTI_DENGAN_PASSWORD_ANDA";

// Atur web server port number menjadi 80
WiFiServer server(80);

// Variabel untuk menyimpan HTTP request
String header;

// Current time
unsigned long currentTime = millis();
// Previous time
unsigned long previousTime = 0;
// Define timeout time in milliseconds (example: 2000ms = 2s)
const long timeoutTime = 2000;

void setup() {
Serial.begin(115200);
bool status;

// default settings
// (you can also pass in a Wire library object like &Wire2)
//status = bme.begin();
if (!bme.begin(0x76)) {
Serial.println("Could not find a valid BME280 sensor, check wiring!");
while (1);
}

// Hubungkan ke jaringan Wi-Fi dengan SSID dan kata sandi
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
// Cetak alamat IP lokal dan mulai server web
Serial.println("");
Serial.println("WiFi connected.");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
server.begin();
}

void loop(){
WiFiClient client = server.available(); // Listen for incoming clients

if (client) { // If a new client connects,
currentTime = millis();
previousTime = currentTime;
Serial.println("New Client."); // print a message out in the serial port
String currentLine = ""; // make a String to hold incoming data from the client
while (client.connected() && currentTime - previousTime <= timeoutTime) { // loop while the client's connected
currentTime = millis();
if (client.available()) { // if there's bytes to read from the client,
char c = client.read(); // read a byte, then
Serial.write(c); // print it out the serial monitor
header += c;
if (c == '\n') { // if the byte is a newline character
// jika baris saat ini kosong, Anda mendapat dua karakter baris baru.
// itulah akhir dari permintaan HTTP klien, jadi kirimkan tanggapan:
if (currentLine.length() == 0) {
// Header HTTP selalu dimulai dengan kode respons (e.g. HTTP/1.1 200 OK)
// dan tipe konten sehingga klien tahu apa yang akan datang, lalu baris kosong:
client.println("HTTP/1.1 200 OK");
client.println("Content-type:text/html");
client.println("Connection: close");
client.println();

// Display the HTML web page
client.println("<!DOCTYPE html><html>");
client.println("<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">");
client.println("<link rel=\"icon\" href=\"data:,\">");
// CSS to style the table
client.println("<style>body { text-align: center; font-family: \"Trebuchet MS\", Arial;}");
client.println("table { border-collapse: collapse; width:35%; margin-left:auto; margin-right:auto; }");
client.println("th { padding: 12px; background-color: #ffbc50; color: yellow; }");
client.println("tr { border: 1px solid #ddd; padding: 12px; }");
client.println("tr:hover { background-color: #ffffe0; }");
client.println("td { border: none; padding: 12px; }");
client.println(".sensor { color:black; font-weight: bold; background-color: #ffffe0; padding: 1px; }");

// Web Page Heading
client.println("</style></head><body><h1>ESP32 with BME280</h1>");
client.println("<table><tr><th>MEASUREMENT</th><th>VALUE</th></tr>");
client.println("<tr><td>Temp. Celsius</td><td><span class=\"sensor\">");
client.println(bme.readTemperature());
client.println(" *C</span></td></tr>");
client.println("<tr><td>Temp. Fahrenheit</td><td><span class=\"sensor\">");
client.println(1.8 * bme.readTemperature() + 32);
client.println(" *F</span></td></tr>");
client.println("<tr><td>Pressure</td><td><span class=\"sensor\">");
client.println(bme.readPressure() / 100.0F);
client.println(" hPa</span></td></tr>");
client.println("<tr><td>Approx. Altitude</td><td><span class=\"sensor\">");
client.println(bme.readAltitude(SEALEVELPRESSURE_HPA));
client.println(" m</span></td></tr>");
client.println("<tr><td>Humidity</td><td><span class=\"sensor\">");
client.println(bme.readHumidity());
client.println(" %</span></td></tr>");
client.println("</body></html>");

// The HTTP response ends with another blank line
client.println();
// Break out of the while loop
break;
} else { // if you got a newline, then clear currentLine
currentLine = "";
}
} else if (c != '\r') { // if you got anything else but a carriage return character,
currentLine += c; // add it to the end of the currentLine
}
}
}
// Hapus variabel header
header = "";
// Tutup koneksi
client.stop();
Serial.println("Client disconnected.");
Serial.println("");
}
}

Ubah baris berikut untuk memasukkan SSID dan kata sandi kalian di antara tanda kutip ganda.

const char* ssid     = "GANTI_DENGAN_SSID_ANDA";
const char* password = "GANTI_DENGAN_PASSWORD_ANDA";

Kemudian, periksa apakah kalian memiliki board yang benar dan port COM yang dipilih, dan upload kode ke ESP32 kalian. Setelah mengunggah, buka Serial Monitor pada baud rate 115200, dan salin IP address ESP32.

Hasil Pembacaan pada Serial Monitor

Buka browser kalian, salin IP address, dan Anda akan melihat pembacaan sensor terbaru. Untuk memperbarui bacaan, Anda hanya perlu me-refresh halaman web.

Hasil Tampilan Halaman Web Server

3. Sensor MPU-6050 untuk mengukur Accelerometer, Gyroscope and Temperature

  • Di bagian ini, kita akan mempelajari cara mendapatkan pembacaan sensor dari sensor MPU-6050: percepatan (x, y, z), kecepatan sudut (x, y, z) dan suhu.
  • Untuk melakukan pembacaan dari MPU-6050 Sensor Module, kita butuh menggunakan Adafruit MPU6050 library, Adafruit Unified Sensor library, dan Adafruit Bus IO Library. Berikut cara menginstall seluruh libraries tersebut dalam Arduino IDE:
    Buka aplikasi Arduino IDE dan buka menu Sketch > Include Library > Manage Libraries. Kemudian Library Manager akan terbuka.
    Search “adafruit mpu6050” pada Search box dan install library tersebut; Search “Adafruit Unified Sensor” pada Search box kemudian scroll ke paling bawah, dan install library tersebut;
    Terakhir, Search “Adafruit Bus IO” pada Search box dan install library tersebut.
  • Setelah kedua libraries tersebut terinstall, kemudian restart Arduino IDE kita.
  • Lalu setelah rangkaian sesuai dengan diagram skema di atas, maka dapat dibuat program untuk mengukur percepatan (x, y, z), kecepatan sudut (x, y, z) dan suhu, serta melihat hasil nilai pembacaannya pada Serial Monitor. Dapat disesuaikan dengan kode program berikut:
#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#include <Wire.h>
Adafruit_MPU6050 mpu;void setup(void) {
Serial.begin(115200);
while (!Serial)
delay(10);
Serial.println("Adafruit MPU6050 test!");// Coba inisialisasi!!
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() {/* Dapatkan kejadian sensor baru dengan pembacaan */
sensors_event_t a, g, temp;
mpu.getEvent(&a, &g, &temp);
/* Print nilainya */
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);
}

Penjelasan Kode Program

Libraries
Mulailah dengan memasukkan libraries yang diperlukan untuk sensor MPU-6050: Adafruit_MPU6050 dan Adafruit_Sensor.

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

Buat objek Adafruit_MPU6050 bernama mpu untuk menangani sensor.

Adafruit_MPU6050 mpu;

setup()
Di setup (), inisialisasi serial monitor pada baud rate 115200.

Serial.begin(115200);

Inisialisasi sensor MPU-6050.

if (!mpu.begin()) {
Serial.println("Failed to find MPU6050 chip");
while (1) {
delay(10);
}
}

Setel rentang pengukuran akselerometer:

mpu.setAccelerometerRange(MPU6050_RANGE_8_G);

Atur rentang pengukuran giroskop:

mpu.setGyroRange(MPU6050_RANGE_500_DEG);

Setel bandwidth filter:

mpu.setFilterBandwidth(MPU6050_BAND_21_HZ);

loop()
Di loop () kita akan mendapatkan pembacaan sensor dan menampilkannya di Serial Monitor.
Pertama, kita perlu mendapatkan kejadian sensor baru dengan pembacaan saat ini.

sensors_event_t a, g, temp;
mpu.getEvent(&a, &g, &temp);

Terakhir, cetak bacaan. Untuk percepatan:
a.acceleration.x: mendapat percepatan pada sumbu x;
a.acceleration.y: mendapat percepatan pada sumbu y;
a.acceleration.z: mendapat percepatan pada sumbu z.

Percepatan diukur dalam meter per detik persegi (m / s2)

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");

Untuk mendapatkan pembacaan giroskop:
g.gyro.x: mendapatkan kecepatan sudut pada sumbu x;
g.gyro.y: mendapatkan kecepatan sudut pada sumbu y;
g.gyro.z: mendapatkan kecepatan sudut pada sumbu z.

Kecepatan sudut diukur dalam radian per detik (rad / s).

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");

Terakhir, cetak suhu — diukur dalam derajat Celcius. Untuk mengakses pembacaan suhu gunakan temp.temperature.

Serial.print("Temperature: ");
Serial.print(temp.temperature);
Serial.println(" degC");

Pembacaan sensor baru ditampilkan setiap 500 milidetik.

delay(500);
  • Jika program sudah siap, compile dengan meng-klik menu Verify yang simbolnya checklist di pojok kiri atas aplikasi Arduino IDE.
  • Setelah proses compile selesai, kemudian klik menu Upload yang simbolnya panah kanan di sebelah menu Verify tadi.
  • Buka Monitor Serial pada baud rate 115200, tekan tombol RST on-board. Pengukuran sensor akan ditampilkan.
  • Pindahkan orientasi sensor dan lihat nilainya berubah sesuai.
Hasil Tampilan pada Serial Monitor

Kalibrasi Sensor

  • Idealnya, saat sensor statis, nilai giroskop harus nol pada semua sumbu, yang tidak terjadi dalam kasus aku. Saat sensor statis, berikut adalah nilai giroskop yang kami dapatkan:
    x: 0,00 rad/s
    y: -0,01 rad/s
    z: 0,00 rad/s
    Pada aplikasi praktis, kita perlu memperhitungkan kesalahan dan mengoreksi nilai dalam kode untuk mendapatkan pembacaan yang lebih akurat.
  • Hal yang sama terjadi pada nilai percepatan. Percepatan sumbu x harus mendekati gaya gravitasi (9,8 m / s2) dan mendekati nol pada sumbu y dan z. Dalam kasus kami, ini adalah nilai perkiraan yang kami dapatkan saat sensor statis:
    x: 10,3 m/s²
    y: -0,2 m/s²
    z: 1,5 m/s²

4. Tampilan Pembacaan MPU-6050 pada OLED Display

Libraries yang dibutuhkan seperti bagian 3 (Sensor MPU-6050 untuk mengukur Accelerometer, Gyroscope and Temperature) + Adafruit SSD1306 library!!!

  • Berikut cara menginstall library tambahan Adafruit SSD1306 library dalam Arduino IDE:
    Buka aplikasi Arduino IDE dan buka menu Sketch > Include Library > Manage Libraries. Kemudian Library Manager akan terbuka.
    Search “SSD1306” pada Search box dan install library dari Adafruit tersebut.
  • Setelah seluruh libraries yang dibutuhkan terinstall, kemudian restart kembali Arduino IDE kita.
  • Lalu setelah rangkaian sesuai dengan diagram skema di atas, maka dapat dibuat program untuk mengukur percepatan (x, y, z) dan kecepatan sudut (x, y, z), serta melihat hasil nilai pembacaannya pada Serial Monitor. Dapat disesuaikan dengan kode program berikut:
#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);
}

Perbedaan Kode Program Lainnya dari Bagian 3

Inisialisasi tampilan OLED.

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

Atur ukuran font dan warna tampilan.

display.setTextSize(1);
display.setTextColor(WHITE);
display.setRotation(0);

loop()
Di loop() adalah tempat kita mendapatkan pembacaan sensor dan menampilkannya di OLED.
Mulailah dengan membuat peristiwa untuk setiap pengukuran, akselerometer, giroskop, dan suhu.

sensors_event_t a, g, temp;

Dapatkan pembacaan sensor baru.

mpu.getEvent(&a, &g, &temp);

Kosongkan tampilan di setiap loop() untuk menulis bacaan baru.

display.clearDisplay();

Atur kursor tampilan ke (0,0) — sudut kiri atas. Ini akan mulai menulis teks dari lokasi itu.

display.setCursor(0, 0);

Baris berikut menampilkan nilai akselerasi x, y dan z pada layar OLED.

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

Terakhir, cetak pembacaan giroskop di layar OLED.

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

Terakhir, panggil display.display() untuk benar-benar menampilkan bacaan di OLED.

display.display();

Bacaan baru ditampilkan setiap 100 milidetik.

delay(100);
  • Jika program sudah siap, compile dengan meng-klik menu Verify yang simbolnya checklist di pojok kiri atas aplikasi Arduino IDE.
  • Setelah proses compile selesai, kemudian klik menu Upload yang simbolnya panah kanan di sebelah menu Verify tadi.
  • Buka Serial Monitor pada baud rate 115200, tekan tombol RST on-board. Pengukuran sensor akan ditampilkan di Serial Monitor dan di layar OLED.
  • Pindahkan sensor dan lihat nilainya berubah.

HASIL PERCOBAAN

1. Sensor BME-280 untuk mengukur tekanan, temperatur dan kelembaban

Foto ESP32 dan Sensor BME-280 pada Tampilan Serial Monitor

Video Demo Sensor BME-280 dan tampilan hasilnya pada Serial Monitor:

2. ESP32 Web Server Weather Station dengan Sensor BME-280

Tampilan Web Page Browser Hasil Pembacaan Sensor BME-280

Video Demo Web Server Weather Station dengan Sensor BME-280:

3. Sensor MPU-6050 untuk mengukur Accelerometer, Gyroscope and Temperature

Foto ESP32 dan Sensor MPU-6050 pada Tampilan Serial Monitor

Video Demo Sensor MPU-6050 dan tampilan hasilnya pada Serial Monitor:

4. Tampilan Pembacaan MPU-6050 pada OLED Display

Hasil Pembacaan MPU-6050 pada OLED Display (Kondisi Static / Diam)

Video Demo Tampilan Pembacaan MPU-6050 pada OLED Display:

KESIMPULAN

Dari eksperimen yang telah dilakukan, ESP32 berhasil untuk menjalankan program Sistem Eksternal Sensor yang berupa, BME-280 (Sensor Tekanan, Temperatur dan Kelembaban) dan MPU-6050 (Sensor Accelerometer, Gyroscope and Temperature), serta menampilkan hasil pembacaan sensor BME-280 ke Web Server dan hasil pembacaan sensor MPU-6050 ke OLED Display, dengan baik sesuai dengan kode program yang dibuat pada aplikasi Arduino IDE. Harapannya, berbagai pengalaman dalam Eksternal Sensor ESP32 ini dapat dikembangkan lebih jauh lagi.

Walaupun pada beberapa eksperimen tertentu tidak langsung berhasil karena menemukan berbagai kendala. Namun, dengan adanya banyak kegagalan tersebut akan membuat kita mempunyai pengalaman lebih banyak pada project ini sehingga akan lebih lancar mengatasi problem-problem tersebut di masa yang akan datang.

Alhamdulillaah..
Sekian, terima kasih atas perhatiannya..
SELAMAT MENCOBA!!!

--

--

Muhammad Raflie Dwi Putra
Muhammad Raflie Dwi Putra

Written by Muhammad Raflie Dwi Putra

Fresh Graduate of Information System and Technology Institut Teknologi Bandung (ITB) 2023

No responses yet