Skip to main content

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
1 Board ESP32 Devkit V1
2 Jumper wire
3 Breadboard

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.

// 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. 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

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

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? (Serial 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
Vcc 3.3V
GND GND
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/ .
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

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 <User_Setups/Setup46_GC9A01_ESP32.h> hasilnya akan terlihat seperti dibawah ini.

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 

Kita download dalam format *.zip, kemudian kita ekstraksi file di dalamnya  ke direktori percobaan kita.

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

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.

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

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

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
  2. https://www.waveshare.com/1.28inch-lcd-module.htm

jangan lupa titik-koma;