coba e paper — ESP32-S3 simulation

An interactive ESP32-S3 circuit simulation you can run free in your browser on Velxio, by itsmebenn.

Components

Sketch code

#include <Arduino.h>
#include <SPI.h> // Wajib ditambahkan untuk menggeser pin Hardware SPI
#include <Keypad.h>
#include <GxEPD2_BW.h>
#include <Fonts/FreeMonoBold24pt7b.h>

// --- KONFIGURASI PIN E-INK 7.5" ---
#define EPD_SDI  37 // Jalur Data (MOSI)
#define EPD_SCK  38 // Jalur Clock (SCK)
#define EPD_CS   39 // Chip Select
#define EPD_DC   40 // Data/Command
#define EPD_RST  41 // Reset
#define EPD_BUSY 42 // Busy

// Inisialisasi objek layar dengan pin CS, DC, RST, dan BUSY yang baru
GxEPD2_BW<GxEPD2_750_T7, 16> display(GxEPD2_750_T7(EPD_CS, EPD_DC, EPD_RST, EPD_BUSY));

// --- KONFIGURASI KEYPAD 4x4 ---
const byte ROWS = 4; 
const byte COLS = 4; 
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
// Menggunakan sisa pin di sisi kanan & kiri bawah ESP32-S3
byte rowPins[ROWS] = {36, 35, 21, 20}; 
byte colPins[COLS] = {19, 48, 47, 18}; 
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);

// --- FREERTOS QUEUE ---
// Jembatan komunikasi aman antara Core 1 dan Core 0
QueueHandle_t keyQueue;
String currentPIN = ""; 

// ==========================================
// TUGAS CORE 0: MENGURUS LAYAR (LAMBAT)
// ==========================================
void TaskDisplay(void *pvParameters) {
  for (;;) {
    char receivedKey;
    
    // Menunggu kiriman tombol dari Core 1
    if (xQueueReceive(keyQueue, &receivedKey, portMAX_DELAY) == pdPASS) {
      
      if (receivedKey == 'C') {
        currentPIN = ""; // Bersihkan layar jika tekan 'C'
      } else if (currentPIN.length() < 8) {
        currentPIN += receivedKey;
      }

      // Mulai proses render 800ms yang memblokir
      display.setFullWindow();
      display.firstPage();
      do {
        display.fillScreen(GxEPD_WHITE);
        display.setTextColor(GxEPD_BLACK);
        display.setFont(&FreeMonoBold24pt7b);
        display.setCursor(50, 100);
        display.print("Input PIN:");
        display.setCursor(50, 200);
        display.print(currentPIN);
      } while (display.nextPage());
    }
  }
}

// ==========================================
// TUGAS CORE 1: MENGURUS KEYPAD & SENSOR (CEPAT)
// ==========================================
void TaskKeypad(void *pvParameters) {
  for (;;) {
    char key = keypad.getKey();

    if (key) {
      Serial.print("Tombol Ditekan: ");
      Serial.println(key);

      // Lempar data tombol ke Core 0 melalui Queue
      xQueueSend(keyQueue, &key, portMAX_DELAY);
    }

    // WAJIB: Beri napas 10ms agar Watchdog Timer ESP32 tidak crash
    vTaskDelay(pdMS_TO_TICKS(10)); 
  }
}

// ==========================================
// SETUP UTAMA
// ==========================================
void setup() {
  Serial.begin(115200);
  
  // 1. MENGGESER JALUR HARDWARE SPI KE PIN BARU
  // SPI.begin(SCK, MISO, MOSI, CS); 
  // Kita beri nilai -1 pada MISO karena layar E-Paper tidak mengirim data balik ke ESP32
  SPI.begin(EPD_SCK, -1, EPD_SDI, EPD_CS);
  
  // 2. INISIALISASI LAYAR
 

More projects by itsmebenn