Your First Program — GPIO & Built-in Sensors
Ages 9 – 14 | Beginner FriendlyThe ESP32 is a tiny but powerful microcontroller — think of it as a small brain that can control electronic things! It was made by a company called Espressif Systems.
Unlike your big computer, the ESP32 is made to do one job really well — read sensors, blink lights, control motors, and talk to the internet!
| Feature | Details |
|---|---|
| Processor | Dual-core, up to 240 MHz (super fast for its size!) |
| Wi-Fi | Built-in! Can connect to the internet |
| Bluetooth | Built-in! Can talk to your phone |
| GPIO Pins | Up to 34 pins you can program |
| Built-in Sensors | Touch sensors, Hall effect sensor, Temperature sensor |
| Memory | 520 KB RAM + 4 MB Flash |
| Power | 3.3V (can be powered by USB!) |
The ESP32 costs about $3–$8 — cheaper than a sandwich! Yet it has Wi-Fi, Bluetooth, and dozens of sensors packed inside. Thousands of smart home devices use it!
A context diagram shows how the ESP32 talks to the outside world. It's like a map of who's connected to whom!
The ESP32 sits in the center of everything. It reads data from sensors and buttons (inputs), processes the information using your code, and sends commands to LEDs and motors (outputs). It can also talk wirelessly via Wi-Fi and Bluetooth!
GPIO stands for General Purpose Input/Output. These are the metal pins on the ESP32 board that connect to the outside world — like the hands of the microcontroller!
Be careful! The ESP32 works at 3.3V, not 5V. Never connect a 5V signal directly to a GPIO pin — it can damage your board. Also, some pins (GPIO 6–11) are used internally for flash memory — don't use those!
The ESP32 has sensors already built inside the chip — you don't need to connect any extra hardware!
10 GPIO pins can detect when you touch them! Pins: GPIO 0, 2, 4, 12, 13, 14, 15, 27, 32, 33. They work by sensing the tiny electrical charge in your finger.
Detects magnetic fields near the chip! Hold a magnet close to the ESP32 and it can tell — useful for detecting if a door is open or a wheel is turning.
Measures the temperature of the chip itself (not the room). Useful for monitoring if the chip is getting too hot. Range: roughly -40°C to 125°C.
Reads analog voltage on certain pins (0–3.3V) and converts it into a number (0–4095). This is how you read external sensors like light sensors, potentiometers, and more!
Before we write code, we need to set up the Arduino IDE — the free software we use to write and upload programs to the ESP32.
https://dl.espressif.com/dl/package_esp32_index.jsonIf no port appears, you may need to install the CP2102 or CH340 USB driver — this depends on which USB chip your ESP32 board uses. Ask your instructor!
Every maker's first program is Blink — making an LED turn on and off! The ESP32 has a built-in LED on GPIO 2.
| Line | What It Does | In Simple Words |
|---|---|---|
#define LED_PIN 2 | Creates a name for pin number | "Let's call GPIO 2 'LED_PIN'" |
pinMode(LED_PIN, OUTPUT) | Sets pin as output | "Hey ESP32, this pin will SEND signals" |
Serial.begin(115200) | Starts serial communication | "Let's talk to the computer at this speed" |
digitalWrite(LED_PIN, HIGH) | Sends 3.3V to pin | "Send power! Turn ON!" |
digitalWrite(LED_PIN, LOW) | Sends 0V to pin | "Stop power! Turn OFF!" |
delay(1000) | Waits 1000 milliseconds | "Wait for 1 second" |
Click the → Upload button in Arduino IDE. Some ESP32 boards need you to hold the BOOT button while uploading. Release it when you see "Connecting..." in the console.
A sequence diagram shows the order of events — who does what and when. Let's see what happens when the Blink program runs!
Let's use the ESP32's built-in capacitive touch sensor! No extra parts needed — just touch a wire connected to a touch-capable pin.
Your body has a tiny electrical charge. When you touch the wire, the capacitance changes. The ESP32 measures this change — when untouched, values are high (~50–80). When touched, they drop (~10–20). The THRESHOLD of 40 is the "decision line"!
The Hall sensor is built into the ESP32 chip. It detects magnetic fields — bring a magnet close and watch the values change!
Hold a refrigerator magnet near the metal can on the ESP32 (that's where the chip is). Try different sides of the magnet — North makes the value go positive, South makes it go negative!
Now let's combine an external button (input) with the LED (output). Press the button → LED lights up!
The ESP32 has a built-in pull-up resistor inside. When you use INPUT_PULLUP, the pin reads HIGH (1) normally, and drops to LOW (0) when you press the button connecting it to GND. This means you don't need an extra resistor — the ESP32 has one inside!
Always add Serial.println() messages to your code! Open the Serial Monitor (Tools → Serial Monitor, set baud to 115200) to see what your ESP32 is doing. It's like giving your board a voice.
ESP32 GPIO works at 3.3V. Never connect 5V directly. If you need to use 5V sensors, use a voltage divider or level shifter.
Best pins to use: GPIO 2, 4, 5, 12, 13, 14, 15, 16, 17, 18, 19, 21, 22, 23, 25, 26, 27, 32, 33. Avoid: GPIO 6–11 (flash memory), GPIO 34–39 (input-only, no pull-up).
Always save your code with a clear name like blink_test_v1.ino. Make a new version each time you make big changes so you can go back!
If uploading fails, read the orange/red text in the Arduino console! Common fixes: check USB cable, select correct board, hold BOOT button, or try a different USB port.
delay(ms) pauses everything. For simple projects it's fine, but for advanced projects, learn about millis() which lets you time things without freezing your code!
Ready to test your skills? Try these challenges and level up!
Modify the Blink program to blink 5 times fast (100ms each), then pause for 2 seconds, then repeat. Hint: use a for loop!
Use the touch sensor to control LED brightness. Softer touch = dimmer, harder touch = brighter. Hint: use analogWrite() or ledcWrite() with PWM!
Count how many times a magnet passes by the Hall sensor and display the count on Serial Monitor. Can you make it count only once per pass?
Use the touch sensor to create a "secret knock" pattern. The LED only turns on if you tap the wire in the right pattern (e.g., tap-tap-pause-tap). Think about timing!
Read ALL sensors (touch, hall, and a button) at once, and print a formatted dashboard to the Serial Monitor that updates every second. Make it look nice with labels and separators!
| Function | What It Does | Example |
|---|---|---|
pinMode(pin, mode) | Set pin as INPUT or OUTPUT | pinMode(2, OUTPUT); |
digitalWrite(pin, val) | Set pin HIGH (on) or LOW (off) | digitalWrite(2, HIGH); |
digitalRead(pin) | Read HIGH or LOW from pin | int v = digitalRead(15); |
analogRead(pin) | Read analog value (0–4095) | int v = analogRead(34); |
touchRead(pin) | Read touch sensor value | int v = touchRead(4); |
hallRead() | Read Hall sensor value | int v = hallRead(); |
delay(ms) | Pause for milliseconds | delay(1000); = 1 sec |
Serial.begin(baud) | Start serial communication | Serial.begin(115200); |
Serial.println(text) | Print text + new line | Serial.println("Hi!"); |