# 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*).

<p class="callout success">Weekly project 03 | Sistem Penginderaan</p>

---

#### <span style="color: rgb(35, 111, 161);">*Section* pertama</span>

##### Persiapan

Komponen yang perlu kita siapkan adalah seperti dalam tabel berikut.

<table border="1" id="bkmrk-no.-nama-komponen-1-" style="border-collapse: collapse; width: 100%; height: 119.188px;"><colgroup><col style="width: 12.8506%;"></col><col style="width: 87.1494%;"></col></colgroup><tbody><tr style="height: 29.7969px;"><td class="align-center">**No.**</td><td style="height: 29.7969px;">**Nama Komponen**</td></tr><tr style="height: 29.7969px;"><td class="align-center">1</td><td style="height: 29.7969px;">Board ESP32 Devkit V1</td></tr><tr style="height: 29.7969px;"><td class="align-center">2</td><td style="height: 29.7969px;">Jumper wire</td></tr><tr style="height: 29.7969px;"><td class="align-center">3</td><td style="height: 29.7969px;">Breadboard</td></tr></tbody></table>

Rangkai seluruh komponen seperti gambar dibawah ini.

<div drawio-diagram="87"><img src="https://blog.sandihex.id/uploads/images/drawio/2024-03/drawing-1-1710505555.png" alt=""/></div>

---

##### Kode program

Buat sketch baru di Arduino IDE dengan memilih menu **File &gt; 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 &gt; 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.

<iframe allowfullscreen="allowfullscreen" height="450" src="https://www.youtube.com/embed/jILiODrdJPQ" width="100%"></iframe>

---

#### <span style="color: rgb(35, 111, 161);">*Section* kedua</span>

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.

<table border="1" id="bkmrk-no.-komponen-1.-deve" style="border-collapse: collapse; width: 100%; height: 146.745px;"><colgroup><col style="width: 15.5672%;"></col><col style="width: 84.4328%;"></col></colgroup><tbody><tr style="height: 29.349px;"><td class="align-center" style="height: 29.349px;">**No.**</td><td style="height: 29.349px;">**Komponen**</td></tr><tr style="height: 29.349px;"><td class="align-center" style="height: 29.349px;">1.</td><td style="height: 29.349px;">Development-board ESP32 Devkit V1</td></tr><tr style="height: 29.349px;"><td class="align-center" style="height: 29.349px;">2.</td><td style="height: 29.349px;">Round TFT GC9A01 (240 x 240) 1.28"</td></tr><tr style="height: 29.349px;"><td class="align-center" style="height: 29.349px;">4.</td><td style="height: 29.349px;">Jumper wires</td></tr><tr style="height: 29.349px;"><td class="align-center" style="height: 29.349px;">5.</td><td style="height: 29.349px;">Breadboard</td></tr></tbody></table>

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.

<table border="1" id="bkmrk-round-tft-esp32-vcc-" style="border-collapse: collapse; width: 100%; height: 234.792px;"><colgroup><col style="width: 50%;"></col><col style="width: 50%;"></col></colgroup><tbody><tr style="height: 29.349px;"><td class="align-center" style="height: 29.349px;">**Round TFT**  
</td><td class="align-center" style="height: 29.349px;">**ESP32**</td></tr><tr style="height: 29.349px;"><td class="align-center" style="height: 29.349px;">Vcc</td><td class="align-center" style="height: 29.349px;">3.3V</td></tr><tr style="height: 29.349px;"><td class="align-center" style="height: 29.349px;">GND</td><td class="align-center" style="height: 29.349px;">GND</td></tr><tr style="height: 29.349px;"><td class="align-center" style="height: 29.349px;">DIN / SDA</td><td class="align-center" style="height: 29.349px;"><span style="background-color: rgb(230, 126, 35); color: rgb(236, 240, 241);"> 23 </span></td></tr><tr style="height: 29.349px;"><td class="align-center" style="height: 29.349px;">CLK / SCK / SCL</td><td class="align-center" style="height: 29.349px;"><span style="background-color: rgb(45, 194, 107); color: rgb(236, 240, 241);"> 18 </span></td></tr><tr style="height: 29.349px;"><td class="align-center" style="height: 29.349px;">CS</td><td class="align-center" style="height: 29.349px;"><span style="background-color: rgb(241, 196, 15); color: rgb(236, 240, 241);"> 15 </span></td></tr><tr style="height: 29.349px;"><td class="align-center" style="height: 29.349px;">DC</td><td class="align-center" style="height: 29.349px;"><span style="background-color: rgb(35, 111, 161); color: rgb(236, 240, 241);"> 2 </span></td></tr><tr style="height: 29.349px;"><td class="align-center" style="height: 29.349px;">RST</td><td class="align-center" style="height: 29.349px;"><span style="background-color: rgb(185, 106, 217); color: rgb(236, 240, 241);"> 4 </span></td></tr></tbody></table>

<span style="color: rgb(0, 0, 0);">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/) .</span>[  
![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.

<div drawio-diagram="93"><img src="https://blog.sandihex.id/uploads/images/drawio/2024-03/drawing-1-1710512385.png" alt=""/></div>

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 &gt; Library &gt; 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.

<div drawio-diagram="95"><img src="https://blog.sandihex.id/uploads/images/drawio/2024-03/drawing-1-1710513723.png" alt=""/></div>

Pada file `User_Setup_Select.h` kita *uncomment* pada line 80, pada code `#include <User_Setups/Setup46_GC9A01_ESP32.h>` 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:

<table border="1" id="bkmrk-soruce-code-https%3A%2F%2F" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 15.9156%;"></col><col style="width: 84.0844%;"></col></colgroup><tbody><tr><td>Soruce code</td><td>[https://github.com/thelastoutpostworkshop/ESP32LCDRound240x240Eyes](https://github.com/thelastoutpostworkshop/ESP32LCDRound240x240Eyes) </td></tr></tbody></table>

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 <span style="color: rgb(224, 62, 45);">**sama persis dengan nama foldernya (weekly\_project3)**</span>. 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 <SPI.h>
#include <TFT_eSPI.h>
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.

<div drawio-diagram="101"><img src="https://blog.sandihex.id/uploads/images/drawio/2024-03/drawing-1-1710518908.png" alt=""/></div>

---

##### Upload program

Upload program kedalam ESP32 melalui Arduino IDE, dengan menekan tombol panah ke kanan dan tunggu sampai notifikasi Done Uploading.

<iframe allowfullscreen="allowfullscreen" height="460" src="https://www.youtube.com/embed/_NCfBkvTdQw" width="100%"></iframe>

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

<p class="callout warning">***jangan lupa titik-koma;***</p>