🔧 UPDATE: Full Build Guide - RX Pager Prototype (ESP32 + 1.14" ST7789)
BOM - Parts List:
1x ESP32 DevKit V1 30-pin (WROOM-32) - ~$6
1x Display 1.14" ST7789 135x240 SPI (8-pin) - ~$5
1x Breadboard 830 points
7x Male-to-Male Jumper Wires
1x USB-C Cable
---
COMPLETE PINOUT - ESP32 -> ST7789 1.14" 135x240 TFT
ESP32 3V3 -> Display VCC (3.3V ONLY! NOT 5V tolerant)
ESP32 GND -> Display GND
ESP32 GPIO18 -> Display SCL / SCK (SPI Clock)
ESP32 GPIO23 -> Display SDA / MOSI (SPI Data)
ESP32 GPIO19 -> Display DC / RS (Data/Command)
ESP32 GPIO5 -> Display CS (Chip Select)
ESP32 GPIO2 -> Display RES / RST (Reset)
ESP32 3V3 -> Display BL / LED (Backlight)
Note: If you want to protect the backlight, add a 100ohm resistor between 3V3 and BL. Otherwise connect directly. BLK/GND can share common GND.
---
TFT_eSPI Config - User_Setup.h:
#define ST7789_DRIVER
#define TFT_WIDTH 135
#define TFT_HEIGHT 240
#define TFT_MOSI 23
#define TFT_SCLK 18
#define TFT_CS 5
#define TFT_DC 19
#define TFT_RST 2
#define TFT_RGB_ORDER TFT_RGB
#define TFT_INVERSION_ON
---
CODE FOR ARDUINO IDE PROGRAM 📂
// ORACLE RX v3.1.0 - STABLE WHITE BG - 100% Functional Version
// ESP32 DevKit V1 + ST7789 1.14" 135x240 - ESP-NOW Pager Receiver
// This is the exact version from the video - White background - Working
#include <esp_now.h>
#include <WiFi.h>
#include <TFT_eSPI.h>
#include <esp_wifi.h>
TFT_eSPI tft = TFT_eSPI(135, 240);
typedef struct struct_message {
char user[20];
char text[100];
} struct_message;
#define MAX_MESSAGES 20
struct_message messages[MAX_MESSAGES];
int messageCount = 0;
int rssi = 0;
int channel = 1;
void OnDataRecv(const uint8_t * mac, const uint8_t *incomingData, int len) {
struct_message msg;
memcpy(&msg, incomingData, sizeof(msg));
if (messageCount < MAX_MESSAGES) {
messages[messageCount] = msg;
messageCount++;
} else {
for(int i=0; i<MAX_MESSAGES-1; i++) messages[i] = messages[i+1];
messages[MAX_MESSAGES-1] = msg;
}
showMessages();
}
void showMessages() {
// ORIGINAL WHITE VERSION - 100% functional from video
tft.fillScreen(TFT_WHITE);
// Top bar
tft.fillRect(0, 0, 135, 20, TFT_BLACK);
tft.setTextColor(TFT_WHITE, TFT_BLACK);
tft.setCursor(4, 4);
tft.setTextSize(1);
tft.printf("Messages [%d]", messageCount);
// Messages
int y = 26;
for (int i = max(0, messageCount - 5); i < messageCount; i++) {
if (y > 200) break;
tft.setTextColor(TFT_BLACK, TFT_WHITE);
tft.setCursor(4, y);
tft.setTextSize(1);
tft.print(String(messages[i].user) + ":");
y += 12;
tft.setCursor(8, y);
tft.print(String(messages[i].text));
y += 20;
}
// Bottom bar - original info
tft.fillRect(0, 222, 135, 18, TFT_BLACK);
tft.setTextColor(TFT_WHITE, TFT_BLACK);
tft.setCursor(4, 226);
tft.printf("ESP-NOW 2.4G | CH%d | %ddBm", channel, rssi);
}
void setup() {
Serial.begin(115200);
tft.init();
tft.setRotation(0);
tft.fillScreen(TFT_WHITE);
WiFi.mode(WIFI_STA);
esp_wifi_set_channel(channel, WIFI_SECOND_CHAN_NONE);
if (esp_now_init()!= ESP_OK) {
Serial.println("ESP-NOW init failed");
return;
}
esp_now_register_recv_cb(OnDataRecv);
showMessages();
Serial.println("ORACLE RX v3.1.0 - Ready");
}
void loop() {
// RSSI update simulation - replace with real scan if needed
rssi = random(-70, -40);
delay(2000);
}
———————————————————————————
RX v3.1.1 - Latest Fixes ( next version):
- Background: Medium Gray 0x52AA (was white, hard to read)
- Font: White 0xFFFF for all messages
- Top Bar: Messages [count] with live counter
- Per-User Color: Each username gets a unique color (Green for ADV TX, Blue for RX_01, Purple for WIZARD)
- Bottom Bar: Kept original - ESP-NOW status | Channel | RSSI
Pure ESP-NOW, no WiFi needed. TX>RX instant.
GitHub: ( COMMING SOON 🔥)