Today I want to share my experience setting up a development environment for the ESP8266 (specifically the ESP-12E module) using PlatformIO. If you’re transitioning from Arduino IDE or just getting started with microcontroller development, PlatformIO offers a more robust and flexible environment with better dependency management.
Setting Up PlatformIO
The first step was creating a proper platformio.ini configuration file. This file defines the board, framework, libraries, and other project settings:
[env:esp12e]
platform = espressif8266
board = esp12e
framework = arduino
monitor_speed = 9600
lib_deps =
adafruit/Adafruit GFX Library @ ^1.11.5
adafruit/Adafruit SSD1306 @ ^2.5.7
adafruit/Adafruit BusIO @ ^1.14.1
knolleary/PubSubClient @ ^2.8
; ESP8266WiFi is included in the espressif8266 platform
This configuration:
- Targets the ESP-12E board
- Uses the Arduino framework for familiar coding
- Sets the serial monitor speed to 9600 baud
- Includes libraries for an OLED display and MQTT communication
Creating a Test Program
Before diving into more complex code, I created a simple LED blink test to verify my setup was working correctly. In PlatformIO, the main code goes in src/main.cpp:
#include <Arduino.h>
// Built-in LED pin for ESP-12E (NodeMCU)
// Note: On most ESP-12E modules, the built-in LED is on GPIO2 (D4)
// and it's active LOW (turns on when pin is LOW)
const int LED_PIN = LED_BUILTIN; // Usually GPIO2 on ESP-12E
void setup() {
// Initialize serial communication
Serial.begin(9600);
Serial.println("ESP-12E LED Blink Test");
// Initialize LED pin as an output
pinMode(LED_PIN, OUTPUT);
}
void loop() {
// Turn the LED on (Note: LOW is on for ESP-12E built-in LED)
digitalWrite(LED_PIN, LOW);
Serial.println("LED ON");
delay(1000); // Wait for 1 second
// Turn the LED off
digitalWrite(LED_PIN, HIGH);
Serial.println("LED OFF");
delay(1000); // Wait for 1 second
}
This simple program toggles the built-in LED every second and sends status messages via serial communication.
Uploading the Code
Initially, I had trouble with the PlatformIO command-line interface. The pio command wasn’t recognized in my terminal. After some research, I found I needed to properly install the PlatformIO CLI:
pip install -U platformio
With PlatformIO properly installed, I could upload the code using:
pio run -t upload
The terminal output looked something like this:
Processing esp12e (platform: espressif8266; board: esp12e; framework: arduino) ---------------------------------------------------------------------------------- Verbose mode can be enabled via `-v, --verbose` option CONFIGURATION: https://docs.platformio.org/page/boards/espressif8266/esp12e.html PLATFORM: Espressif 8266 (4.2.1) > ESP-12E HARDWARE: ESP8266 80MHz, 80KB RAM, 4MB Flash PACKAGES: - framework-arduinoespressif8266 3.30102.0 (3.1.2) - tool-esptool 1.413.0 (4.13) - tool-esptoolpy 1.30000.201119 (3.0.0) - toolchain-xtensa 2.100300.220621 (10.3.0) LDF: Library Dependency Finder -> https://bit.ly/configure-pio-ldf LDF Modes: Finder ~ chain, Compatibility ~ soft Found 32 compatible libraries Scanning dependencies... No dependencies Building in release mode Compiling .pio/build/esp12e/src/main.cpp.o Linking .pio/build/esp12e/firmware.elf Building .pio/build/esp12e/firmware.bin Calculating size .pio/build/esp12e/firmware.elf text data bss dec hex filename 262736 2672 28512 293920 47c20 .pio/build/esp12e/firmware.elf Checking program size Advanced Memory Usage is available via "PlatformIO Home > Project Inspect" RAM: [===== ] 45.5% (used 37184 bytes from 81920 bytes) Flash: [==== ] 39.9% (used 265408 bytes from 1044464 bytes) Configuring upload protocol... AVAILABLE: espota, esptool CURRENT: upload_protocol = esptool Looking for upload port... Auto-detected: /dev/ttyUSB0 Uploading .pio/build/esp12e/firmware.bin esptool.py v3.0 - ESP8266 ROM Bootloader Utility Serial port /dev/ttyUSB0 Connecting.... Chip is ESP8266EX Features: WiFi Crystal is 26MHz MAC: 5c:cf:7f:xx:xx:xx Uploading stub... Running stub... Stub running... Configuring flash size... Auto-detected Flash size: 4MB Compressed 265408 bytes to 195473... Writing at 0x00000000... (7 %) Writing at 0x00004000... (15 %) Writing at 0x00008000... (23 %) Writing at 0x0000c000... (30 %) Writing at 0x00010000... (38 %) Writing at 0x00014000... (46 %) Writing at 0x00018000... (53 %) Writing at 0x0001c000... (61 %) Writing at 0x00020000... (69 %) Writing at 0x00024000... (76 %) Writing at 0x00028000... (84 %) Writing at 0x0002c000... (92 %) Writing at 0x00030000... (100 %) Wrote 265408 bytes (195473 compressed) at 0x00000000 in 17.3 seconds (effective 122.7 kbit/s)... Hash of data verified. Hard resetting via RTS pin... =============================================== [SUCCESS] Took 22.08 seconds
Accessing the Serial Monitor
After uploading the code, I needed to monitor the serial output to verify the program was running correctly. PlatformIO makes this easy with a simple command:
pio device monitor
The terminal output showed the LED status messages:
--- Terminal on /dev/cu.usbserial-1110 | 9600 8-N-1 --- Available filters and text transformations: colorize, debug, default, direct, esp8266_exception_decoder, hexlify, log2file, nocontrol, printable, send_on_enter, time --- More details at https://bit.ly/pio-monitor-filters --- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H LED OFF LED ON LED OFF LED ON LED OFF LED ON LED OFF LED ON LED OFF
This confirmed that my ESP-12E was properly programmed and running the test code.
Useful PlatformIO Commands
Throughout this process, I found several PlatformIO commands particularly helpful:
# List all available serial devices pio device list # Build the project without uploading pio run # Clean the project (remove compiled files) pio run -t clean # Upload the compiled firmware pio run -t upload # Monitor serial output pio device monitor # Build, upload and start monitoring in one command pio run -t upload && pio device monitor
Conclusion
Setting up PlatformIO for ESP8266 development was straightforward once I understood the basic workflow. The platformio.ini file provides a clear, version-controlled way to manage project dependencies, and the command-line interface offers powerful tools for building and uploading code.
The simple LED blink test confirmed that everything was working correctly, providing a solid foundation for more complex projects. Whether you’re building a home automation system, IoT device, or just experimenting with microcontrollers, PlatformIO offers a robust development environment that grows with your needs.