# 03 - ESP 32 internal sensor # Internal sensor ESP32 (Hall sensor & Touch sensor) Pada percobaan kali ini kita akan mencoba menggunakan sensor internal yang ada di dalam ESP-32. Board ESP 32 di dalamnya terdapat sensor-sensor bawaan yaitu sensor sentuh (touch sensor), sensor efek hall dan pad sebagian versi ESP 32 memiliki sensor suhu. Pada percobaan *section* pertama ini, kita akan membaca nilai sensor dengan menggunakan serial terminal yang ada di **Arduino IDE**. Kemudian pada section kedua, kita akan menggunakan sensor internal tersebut untuk membangunkan ESP 32 dari mode tidur (*deep sleep*).

Weekly project 03 | Sistem Penginderaan

--- #### *Section* pertama ##### Persiapan Komponen yang perlu kita siapkan adalah seperti dalam tabel berikut.
**No.****Nama Komponen**
1Board ESP32 Devkit V1
2Jumper wire
3Breadboard
Rangkai seluruh komponen seperti gambar dibawah ini.
--- ##### Kode program Buat sketch baru di Arduino IDE dengan memilih menu **File > New Sketch** dan copy-paste kode berikut. ```c // ESP 32 touch test // Just test touch pin // Proyek ke 3 void setup() { Serial.begin(115200); delay(1000); } void loop() { Serial.print("Touch sensor : "); Serial.print(touchRead(4)); Serial.println(); Serial.print("Hall sensor : "); Serial.print(hallRead()); Serial.println(); } ``` --- ##### Penjelasan program Kode sketch diatas merupakan kode yang digunakan untuk menampilkan hasil pengukuran internal sensor hall effect dan touch. Fungsi yang digunakan untuk membaca internal sensor adalah `touchRead()` untuk sensor sentuh dan `hallRead()` untuk sensor efek hal. hasil pengukuran tersebut kemudian dikirim melalui protokol serial yang dapat dilihat dengan Serial Monitor di tools Arduino IDE. --- ##### Upload program Setelah kita memahami program diatas, *let's compile*. Upload sketch tersebut kedalam ESP32 dengan menekan icon upload. Detail proses upload, dapat mengikuti panduan dalam percobaan di [link ini](https://blog.sandihex.id/books/02-input-dan-output/page/belajar-input-output-esp32). Untuk melihat nilai pengukuran sensor internal, kita dapat menggunakan serial monitor yang ada di Arduino IDE. Adapun untuk membuka serial monitor tersebut dapat mengikuti langkah-langkah berikut: **Langkah pertama,** membuka menu Tools > Serial Monitor. [![menu serial monitor.png](https://blog.sandihex.id/uploads/images/gallery/2024-03/scaled-1680-/menu-serial-monitor.png)](https://blog.sandihex.id/uploads/images/gallery/2024-03/menu-serial-monitor.png) **Langkah kedua,** pastikan ***baudrate*** yang kita gunakan sesuai dengan yang kita atur dalam kode sketch diatas `Serial.begin(115200)` disini kita menggunakan baudrate 115200. [![serial monitor box.png](https://blog.sandihex.id/uploads/images/gallery/2024-03/scaled-1680-/serial-monitor-box.png)](https://blog.sandihex.id/uploads/images/gallery/2024-03/serial-monitor-box.png) Hasil dari percobaan kita seperti yang ada dalam video berikut. --- #### *Section* kedua Pada percobaan *section* kedua ini sebenarnya konsepnya ringan saja, hanya mencoba memanfaatkan sensor *touch* untuk membangunkan ESP32 yang kita atur dalam mode **deep sleep**. Hanya saja kebetulan saya kedatangan mainan baru nih, yaitu layar Round TFT. Komponen ini terbeli karena ada kegiatan kantor yang mengharuskan saya membuat IoT *underwater* untuk memonitoring kapal. Nah pada saat belanja, kami kurang 100 ribu lagi untuk dapat free ongkos kirim, jadi ya terpaksa beli Round TFT karena harganya 90 ribu. Daripada teman baru kita ini nganggur (Round TFT), ada baiknya kita gunakan untuk percobaan kita. Sebagian besar aktifitas kita di *section* dua ini adalah melakukan konfigurasi round TFT untuk dapat memunculkan animasi gambar berwarna (*blink-eye*). Animasi ini kita gunakan sebagai indikator yang menunjukan bahwa rangkaian ESP32 sedang dalam mode *deep sleep* atau sedang *wakeup*. --- ##### Persiapan Mari kita persiapkan beberapa komponen dalam tabel berikut.
**No.****Komponen**
1.Development-board ESP32 Devkit V1
2.Round TFT GC9A01 (240 x 240) 1.28"
4.Jumper wires
5.Breadboard
Skema rangkaian dari Round TFT ke ESP32 menggunakan protokol komunikasi SPI. Hem...., apa itu SPI? (S*erial Peripheral Interface)* adalah protokol komunikasi serial yang memungkinkan ESP32 untuk mengirim dan menerima data dengan layar LED. Protokol ini menggunakan 4 kabel: pin data (MOSI), pin clock (SCK), pin pilih chip (CS), dan pin ground (GND). ESP32 bertindak sebagai master SPI, sedangkan layar LED bertindak sebagai slave.
**Round TFT** **ESP32**
Vcc3.3V
GNDGND
DIN / SDA 23
CLK / SCK / SCL 18
CS 15
DC 2
RST 4
Skema rangkaiannya adalah seperti di bawah ini. Bagi teman-teman yang ingin membuat ilustrasi rangkaian seperti dibawah ini dapat menggunakan aplikasi **Fritzing** ya. Aplikasi ini gratis, dapat diunduh di laman [https://fritzing.org/download/](https://fritzing.org/download/) .[ ![rangkaian advance_bb.png](https://blog.sandihex.id/uploads/images/gallery/2024-03/scaled-1680-/rangkaian-advance-bb.png)](https://blog.sandihex.id/uploads/images/gallery/2024-03/rangkaian-advance-bb.png) Sebelum membuat kode program, terlebih dahulu kita harus menginstall dan mengkonfigurasi driver Round TFT agar dapat kita gunakan. Pertama-tama kita pilih icon library kemudian cari **tft\_espi.** Pilih dan install TFT\_sSPI dari Bodimer, seperti gambar berikut.
Karena yang kita install adalah driver TFT untuk beberapa tipe sekaligus, maka kita perlu menyesuaikan konfigurasi driver agar support untuk **GC9A01** (tipe round TFT yang kita miliki). Caranya adalah dengan mengedit file dalam library yang telah kita install. Pertama kita buka folder **Arduino > Library > TFT\_eSPI.** [![Screenshot 2024-03-15 at 21.30.14.png](https://blog.sandihex.id/uploads/images/gallery/2024-03/scaled-1680-/screenshot-2024-03-15-at-21-30-14.png)](https://blog.sandihex.id/uploads/images/gallery/2024-03/screenshot-2024-03-15-at-21-30-14.png) Langkah kedua adalah dengan mengedit dua file paling bawah yaitu `User_setup.h` dan `User_Setup_Select.h` ubah parameter didalamnya sebagai berikut: Pada file `User_Setup.h` kita comment pada line 45 dengan menambahkan dua slash `//` didepan tulisah `#define ILI9341`, karena tipe **ILI9341** bukan tipe yang akan kita gunakan. Sedangkan yang akan kita gunakan adalah di line 65 yaitu **GC9A01.** *Uncomment* pada line 65 dengan menghapus dua slash `//` didepan `#define GC9A01` sehingga tampak seperti gambar berikut.
Pada file `User_Setup_Select.h` kita *uncomment* pada line 80, pada code `#include ` hasilnya akan terlihat seperti dibawah ini. [![sedudah.png](https://blog.sandihex.id/uploads/images/gallery/2024-03/scaled-1680-/sedudah.png)](https://blog.sandihex.id/uploads/images/gallery/2024-03/sedudah.png) Sekarang library **TFT\_eSPI** sudah dapat kita gunakan untuk menampilkan ouptut dari ESP32. --- ##### Kode program Kode program yang akan kita gunakan untuk membuat animasi mata berkedip bersumber dari repository dalam tabel berikut:
Soruce code[https://github.com/thelastoutpostworkshop/ESP32LCDRound240x240Eyes](https://github.com/thelastoutpostworkshop/ESP32LCDRound240x240Eyes)
Kita download dalam format \*.zip, kemudian kita ekstraksi file di dalamnya ke direktori percobaan kita. [![Screenshot 2024-03-15 at 22.01.16.png](https://blog.sandihex.id/uploads/images/gallery/2024-03/scaled-1680-/screenshot-2024-03-15-at-22-01-16.png)](https://blog.sandihex.id/uploads/images/gallery/2024-03/screenshot-2024-03-15-at-22-01-16.png) Kita ubah nama foldernya menjadi **weekly\_project3**, nama file di dalamnya **ESP32LCDRound240x240Eyes.ino** juga harus diubah **sama persis dengan nama foldernya (weekly\_project3)**. Karena struktur project data didalam Arduino IDE mengharuskan demikian, jika tidak maka file kita tidak akan terbuka. [![Screenshot 2024-03-15 at 22.05.23.png](https://blog.sandihex.id/uploads/images/gallery/2024-03/scaled-1680-/screenshot-2024-03-15-at-22-05-23.png)](https://blog.sandihex.id/uploads/images/gallery/2024-03/screenshot-2024-03-15-at-22-05-23.png) Setelah selesai, kemudian buka file **weekly\_project3.ino** dan kita modifikasi isinya agar dapat kita gunakan untuk percobaan menghidupkan ESP32 dari mode deep sleep. Kita modifikasi dengan kode sebagai berikut. ```c #define USE_DMA #include #include TFT_eSPI tft; // A single instance is used for 1 or 2 displays RTC_DATA_ATTR int bootCount = 0; // A pixel buffer is used during eye rendering #define BUFFER_SIZE 1024 // 128 to 1024 seems optimum #ifdef USE_DMA #define BUFFERS 2 // 2 toggle buffers with DMA #else #define BUFFERS 1 // 1 buffer for no DMA #endif uint16_t pbuffer[BUFFERS][BUFFER_SIZE]; // Pixel rendering buffer bool dmaBuf = 0; // DMA buffer selection // This struct is populated in config.h typedef struct { // Struct is defined before including config.h -- int8_t select; // pin numbers for each eye's screen select line int8_t wink; // and wink button (or -1 if none) specified there, uint8_t rotation; // also display rotation and the x offset int16_t xposition; // position of eye on the screen } eyeInfo_t; #include "config.h" // ****** CONFIGURATION IS DONE IN HERE ****** extern void user_setup(void); // Functions in the user*.cpp files extern void user_loop(void); // A simple state machine is used to control eye blinks/winks: #define NOBLINK 0 // Not currently engaged in a blink #define ENBLINK 1 // Eyelid is currently closing #define DEBLINK 2 // Eyelid is currently opening typedef struct { uint8_t state; // NOBLINK/ENBLINK/DEBLINK uint32_t duration; // Duration of blink state (micros) uint32_t startTime; // Time (micros) of last state change } eyeBlink; struct { // One-per-eye structure int16_t tft_cs; // Chip select pin for each display eyeBlink blink; // Current blink/wink state int16_t xposition; // x position of eye image } eye[NUM_EYES]; uint32_t startTime; // For FPS indicator // INITIALIZATION -- runs once at startup ---------------------------------- void setup(void) { Serial.begin(115200); Serial.println("Starting"); ++ bootCount; #if defined(DISPLAY_BACKLIGHT) && (DISPLAY_BACKLIGHT >= 0) // Enable backlight pin, initially off pinMode(DISPLAY_BACKLIGHT, OUTPUT); digitalWrite(DISPLAY_BACKLIGHT, LOW); #endif // User call for additional features user_setup(); // Initialise the eye(s), this will set all chip selects low for the tft.init() initEyes(); tft.init(); #ifdef USE_DMA tft.initDMA(); #endif // Raise chip select(s) so that displays can be individually configured digitalWrite(eye[0].tft_cs, HIGH); if (NUM_EYES > 1) digitalWrite(eye[1].tft_cs, HIGH); for (uint8_t e = 0; e < NUM_EYES; e++) { digitalWrite(eye[e].tft_cs, LOW); tft.setRotation(eyeInfo[e].rotation); tft.fillScreen(TFT_BLACK); digitalWrite(eye[e].tft_cs, HIGH); } #if defined(DISPLAY_BACKLIGHT) && (DISPLAY_BACKLIGHT >= 0) analogWrite(DISPLAY_BACKLIGHT, BACKLIGHT_MAX); #endif startTime = millis(); touchSleepWakeUpEnable(13,40); // konfirmasi ke ESP bahwa GPIO 13, 40 yang akan digunakan untuk membangunkan if (bootCount == 1) { Serial.println("Goin sleep now"); Serial.flush(); esp_deep_sleep_start(); // perintah deep sleep untuk ESP32 } } void loop() { updateEye(); if (touchRead(12) < 40){ // Membaca dan mengecek jika touchRead bernilai dibawah 40 Serial.println("Going sleep.. zzZZzz...."); Serial.flush(); // Flush serial tft.fillScreen(TFT_BLACK);; // Menghitamkan screen round bootCount == 0; // assign variabel bootCount ke nilai 0 esp_deep_sleep_start(); // membuat ESP32 deepsleep } } ``` Penjelasan dari kode diatas walaupun tampaknya sangat rumit dan kompleks, sebenarnya hanya berfokus pada beberapa baris terkait dengan konfigurasi ESP32 untuk deep sleep. Sementara sebagian besar kode yang lain adalah animasi Eye saja. ```c touchSleepWakeUpEnable(13,40); if (bootCount == 1) { Serial.println("Goin sleep now"); Serial.flush(); esp_deep_sleep_start(); } ``` Pada baris 90 sampai dengan 95, disini kita mengkonfigurasi ESP32 bahwa proses membangunkan ESP32 dari *deepsleep* dilakukan dengan metode touch pada GPIO 13 dan 40. Kemudian kita menggunakan logika if untuk mengecek variabel `bootCount` jika bernilai 1 maka ESP masuk dalam mode deep sleep dengan perintah `esp_deep_sleep_start()`. ```c void loop() { updateEye(); if (touchRead(12) < 40){ Serial.println("Going sleep.. zzZZzz...."); Serial.flush(); tft.fillScreen(TFT_BLACK);; bootCount == 0; esp_deep_sleep_start(); } } ``` Baris kode 100 sampai 109, disini kita menjalankan animasi Eye, dengan fungsi yang kita panggil `updateEye()` . Kemudian kita melakukan pengecekan apakah touchSensor pada GPIO pin 12 disentuh, jika nilai tresholdnya dibawah 40 maka kita akan menjalankan perintah `esp_deep_sleep_start()` sehingga ESP32 akan masuk mode *deep sleep*. Sebelum menjalankan perintah tersebut, terlebih dahulu melakukan eksekusi perintah `Serial.flush()` untuk memaksa program berhenti sejenak sampai semua data yang ada dalam *buffer* transmisi serial telah berhasil dikirim keluar. Ini memastikan bahwa tidak ada data yang tertinggal sebelum melanjutkan ke instruksi berikutnya. Perintah `tft.fillscreen(TFT_BLACK)` digunakan untuk mengkosongkan animasi gambar terakhir yang muncul di round TFT.
--- ##### Upload program Upload program kedalam ESP32 melalui Arduino IDE, dengan menekan tombol panah ke kanan dan tunggu sampai notifikasi Done Uploading. > Referensi: > > 1. [https://www.youtube.com/watch?v=pmCc7z\_Mi8I](https://www.youtube.com/watch?v=pmCc7z_Mi8I) > 2. [https://www.waveshare.com/1.28inch-lcd-module.htm](https://www.waveshare.com/1.28inch-lcd-module.htm)

***jangan lupa titik-koma;***