How to Build an ESP32 Kids Phone Prototype

A kid-safe mini phone with big buttons, approved contacts, and SOS mode

ESP32WearablesIntermediate60 minutes4 components

Updated

How to Build an ESP32 Kids Phone Prototype
For illustrative purposes only
On this page

What you'll build

In this project you will prototype a kid-safe phone built around an ESP32, a 4x4 membrane keypad, a small TFT display, a speaker module, and a dedicated SOS button. The phone stores a short list of approved contacts, lets the child scroll through them with simple up-and-down key presses, and initiates a call with a single confirm press. Holding the red SOS button for two seconds triggers an emergency routine that auto-dials a preset guardian number and flashes the screen with a bright alert pattern. The entire interface is designed with large fonts, high-contrast colors, and minimal menus so even very young children can operate it confidently.

Building this prototype teaches you how to manage multiple peripherals on a single ESP32 simultaneously -- scanning a keypad matrix, driving a TFT over SPI, producing audio tones through a DAC-fed speaker, and monitoring a hardware interrupt on the SOS pin. You will learn how to structure a state-machine architecture that keeps the user interface responsive while background tasks handle audio playback and communication events. The project also introduces the concept of contact whitelisting and parental lock-out logic, giving you a taste of how product designers think about child safety in consumer electronics.

The finished prototype is a compelling proof-of-concept that demonstrates core embedded-systems skills: multiplexed input handling, SPI display rendering, interrupt-driven safety features, and non-volatile contact storage. From here you could extend the hardware with a SIM800L GSM module to make actual cellular calls, add GPS tracking for location sharing, or integrate Bluetooth for pairing with a parent's smartphone. It is an ideal project for makers who want to explore the intersection of hardware design and user-centered product thinking.

Wiring diagram

Wiring diagram

Interactive wiring diagram

Components needed

ComponentTypeQtyBuy
4x4 Matrix Keypadother1€10.35
SSD1306 OLEDdisplay1€4.30
SOS Buttonother1€8.30
Piezo Speakeractuator1€4.75

Prices and availability are indicative and may have been updated by the supplier. Schematik may earn a commission from purchases made through affiliate links.

Assembly

1

Build the kid-safe input panel

Wire the 4x4 keypad rows/columns and connect the dedicated SOS button to GPIO34.

2

Add display and audio feedback

Connect OLED via I2C (GPIO4/GPIO15) and piezo speaker on GPIO26.

Pin assignments

PinConnectionType
GPIO 14keypad-1 ROW0DIGITAL
GPIO 27keypad-1 ROW1DIGITAL
GPIO 12keypad-1 ROW2DIGITAL
GPIO 13keypad-1 ROW3DIGITAL
GPIO 23keypad-1 COL0DIGITAL
GPIO 22keypad-1 COL1DIGITAL
GPIO 21keypad-1 COL2DIGITAL
GPIO 19keypad-1 COL3DIGITAL
GPIO 4oled-phone-1 SDAI2C
GPIO 15oled-phone-1 SCLI2C
GPIO 34sos-btn-1 SIGDIGITAL
GPIO 26speaker-1 SIGPWM

Code

#include <Wire.h>
#include <Keypad.h>
#include <Adafruit_SSD1306.h>

#define SDA_PIN 4
#define SCL_PIN 15
#define SOS_PIN 34
#define SPEAKER_PIN 26

const byte ROWS = 4, COLS = 4;
char keys[ROWS][COLS] = {{'1','2','3','A'},{'4','5','6','B'},{'7','8','9','C'},{'*','0','#','D'}};
byte rowPins[ROWS] = {14, 27, 12, 13};
byte colPins[COLS] = {23, 22, 21, 19};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
Adafruit_SSD1306 display(128, 64, &Wire, -1);

String approvedContacts[3] = {"MOM", "DAD", "HOME"};
int selected = 0;

void setup() {
  Wire.begin(SDA_PIN, SCL_PIN);
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  pinMode(SOS_PIN, INPUT_PULLUP);
  pinMode(SPEAKER_PIN, OUTPUT);
}

void loop() {
  char key = keypad.getKey();
  if (key == 'A') selected = (selected + 1) % 3;
  if (key == 'B') tone(SPEAKER_PIN, 1400, 140);
  if (digitalRead(SOS_PIN) == LOW) {
    tone(SPEAKER_PIN, 2200, 220);
  }

  display.clearDisplay();
  display.setCursor(0, 0);
  display.println("Kids Phone");
  display.print("Contact: ");
  display.println(approvedContacts[selected]);
  display.println("A=Next  B=Call");
  display.println("SOS button active");
  display.display();
  delay(40);
}

// Run this and build other cool things at schematik.io
Libraries: Keypad, Adafruit SSD1306, Adafruit GFX Library