PlatformIO CLI on Linux (Ubuntu 18.04)

PlatformIO  CLI on Linux (Ubuntu 18.04)

Install PlatformIO CLI on Linux (Ubuntu 18.04) for use in programming IOT devices (i.e., ESP8266, ESP32, NodeMCU)

Plus Post Install setup to test the installation (ESP8266 LED blink)

tl;dr

1) Add "export PATH=$PATH:~/.platformio/penv/bin" to .profile in home directory.

2) $ python3 -c "$(curl -fsSL https://raw.githubusercontent.com/platformio/platformio/master/scripts/get-platformio.py)"

3) $ curl -fsSL https://raw.githubusercontent.com/platformio/platformio-core/master/scripts/99-platformio-udev.rules | sudo tee /etc/udev/rules.d/99-platformio-udev.rules

Prerequisites

Python3
curl

Long instructions...

Add a line to .profile in home directory for current user.

Add:
	export PATH=$PATH:~/.platformio/penv/bin

~$ nano .profile
# ~/.profile: executed by the command interpreter for login shells. # This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login # exists. # see /usr/share/doc/bash/examples/startup-files for examples. # the files are located in the bash-doc package. # the default umask is set in /etc/profile; for setting the umask # for ssh logins, install and configure the libpam-umask package. #umask 022 # if running bash if [ -n "$BASH_VERSION" ]; then # include .bashrc if it exists if [ -f "$HOME/.bashrc" ]; then . "$HOME/.bashrc" fi fi # set PATH so it includes user's private bin if it exists if [ -d "$HOME/bin" ] ; then PATH="$HOME/bin:$PATH" fi # set PATH so it includes user's private bin if it exists if [ -d "$HOME/.local/bin" ] ; then PATH="$HOME/.local/bin:$PATH" fi ▶ export PATH=$PATH:~/.platformio/penv/bin

=> SIDE STEP

At this point it is convenient for the future to make sure your user is in the 'dialout' group so you (user) have permission to access /dev/ttyUSB# devices.

$ sudo usermod -aG dialout {username}

Log out of user and log back in again.

Install PlatformIO CLI (make sure to have python3 >=3.6 installed)

$ python3 -c "$(curl -fsSL https://raw.githubusercontent.com/platformio/platformio/master/scripts/get-platformio.py)"
Installer version: 1.1.0 Platform: Linux-5.4.0-91-generic-x86_64-with-glibc2.25 Python version: 3.6.9 (default, Dec 8 2021, 21:08:43) [GCC 8.4.0] Python path: /usr/bin/python3 Creating a virtual environment at /home/scotty/.platformio/penv Updating Python package manager (PIP) in a virtual environment PIP has been successfully updated! Virtual environment has been successfully created! Installing PlatformIO Core Collecting platformio Downloading platformio-5.2.4.tar.gz (219 kB) |████████████████████████████████| 219 kB 351 kB/s Preparing metadata (setup.py) ... done Collecting bottle==0.12.* Downloading bottle-0.12.19-py3-none-any.whl (89 kB) |████████████████████████████████| 89 kB 387 kB/s . . . Collecting immutables>=0.9 Downloading immutables-0.16-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl (103 kB) |████████████████████████████████| 103 kB 397 kB/s Building wheels for collected packages: platformio, contextvars Building wheel for platformio (setup.py) ... done Created wheel for platformio: filename=platformio-5.2.4-py3-none-any.whl size=344395 sha256=7a9b3060cb5fd4b4a92076c235b575340b4f3621d1dc7da78429f420ef4dcade Stored in directory: /home/scotty/.cache/pip/wheels/e7/c4/e4/d1e3f585464f1a125112c14dca4f92da2180b1790a454abc4c Building wheel for contextvars (setup.py) ... done Created wheel for contextvars: filename=contextvars-2.4-py3-none-any.whl size=7681 sha256=3397a5dfb01255dc4b54f524d04b043e7f9874009e039f15539c00becea57652 Stored in directory: /home/scotty/.cache/pip/wheels/41/11/53/911724983aa48deb94792432e14e518447212dd6c5477d49d3 Successfully built platformio contextvars Installing collected packages: typing-extensions, immutables, zipp, contextvars, sniffio, importlib-metadata, idna, dataclasses, urllib3, ifaddr, h11, contextlib2, click, charset-normalizer, certifi, asgiref, anyio, zeroconf, wsproto, uvicorn, tabulate, starlette, semantic-version, requests, pyserial, pyelftools, marshmallow, colorama, bottle, ajsonrpc, aiofiles, platformio Successfully installed aiofiles-0.8.0 ajsonrpc-1.2.0 anyio-3.4.0 asgiref-3.4.1 bottle-0.12.19 certifi-2021.10.8 charset-normalizer-2.0.10 click-8.0.3 colorama-0.4.4 contextlib2-21.6.0 contextvars-2.4 dataclasses-0.8 h11-0.12.0 idna-3.3 ifaddr-0.1.7 immutables-0.16 importlib-metadata-4.8.3 marshmallow-3.14.1 platformio-5.2.4 pyelftools-0.27 pyserial-3.5 requests-2.27.1 semantic-version-2.8.5 sniffio-1.2.0 starlette-0.17.1 tabulate-0.8.9 typing-extensions-4.0.1 urllib3-1.26.8 uvicorn-0.16.0 wsproto-1.0.0 zeroconf-0.37.0 zipp-3.6.0 PlatformIO Core has been successfully installed into an isolated environment `/home/scotty/.platformio/penv`! The full path to `platformio.exe` is `/home/scotty/.platformio/penv/bin/platformio` If you need an access to `platformio.exe` from other applications, please install Shell Commands (add PlatformIO Core binary directory `/home/scotty/.platformio/penv/bin` to the system environment PATH variable): See https://docs.platformio.org/page/installation.html#install-shell-commands

Add 99-platformio-udev.rule file to /etc/udev/rules directory.

$ curl -fsSL https://raw.githubusercontent.com/platformio/platformio-core/master/scripts/99-platformio-udev.rules | sudo tee /etc/udev/rules.d/99-platformio-udev.rules
# Copyright (c) 2014-present PlatformIO # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. ##################################################################################### # # INSTALLATION # # Please visit > https://docs.platformio.org/en/latest/faq.html#platformio-udev-rules # ##################################################################################### # # Boards # # CP210X USB UART ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", MODE:="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1" # FT231XS USB UART ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6015", MODE:="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1" # Prolific Technology, Inc. PL2303 Serial Port ATTRS{idVendor}=="067b", ATTRS{idProduct}=="2303", MODE:="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1" # QinHeng Electronics HL-340 USB-Serial adapter ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", MODE:="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1" # Arduino boards ATTRS{idVendor}=="2341", ATTRS{idProduct}=="[08][023]*", MODE:="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1" ATTRS{idVendor}=="2a03", ATTRS{idProduct}=="[08][02]*", MODE:="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1" # Arduino SAM-BA ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="6124", MODE:="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{MTP_NO_PROBE}="1" # Digistump boards ATTRS{idVendor}=="16d0", ATTRS{idProduct}=="0753", MODE:="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1" # Maple with DFU ATTRS{idVendor}=="1eaf", ATTRS{idProduct}=="000[34]", MODE:="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1" # USBtiny ATTRS{idProduct}=="0c9f", ATTRS{idVendor}=="1781", MODE:="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1" # USBasp V2.0 ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="05dc", MODE:="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1" # Teensy boards ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="04[789B]?", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1" ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="04[789A]?", ENV{MTP_NO_PROBE}="1" SUBSYSTEMS=="usb", ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="04[789ABCD]?", MODE:="0666" KERNEL=="ttyACM*", ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="04[789B]?", MODE:="0666" #TI Stellaris Launchpad ATTRS{idVendor}=="1cbe", ATTRS{idProduct}=="00fd", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1" #TI MSP430 Launchpad ATTRS{idVendor}=="0451", ATTRS{idProduct}=="f432", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1" #GD32V DFU Bootloader ATTRS{idVendor}=="28e9", ATTRS{idProduct}=="0189", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1" # # Debuggers # # Black Magic Probe SUBSYSTEM=="tty", ATTRS{interface}=="Black Magic GDB Server", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1" SUBSYSTEM=="tty", ATTRS{interface}=="Black Magic UART Port", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1" # opendous and estick ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="204f", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1" # Original FT232/FT245 VID:PID ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1" # Original FT2232 VID:PID ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6010", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1" # Original FT4232 VID:PID ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6011", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1" # Original FT232H VID:PID ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6014", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1" # DISTORTEC JTAG-lock-pick Tiny 2 ATTRS{idVendor}=="0403", ATTRS{idProduct}=="8220", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1" # TUMPA, TUMPA Lite ATTRS{idVendor}=="0403", ATTRS{idProduct}=="8a98", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1" ATTRS{idVendor}=="0403", ATTRS{idProduct}=="8a99", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1" # XDS100v2 ATTRS{idVendor}=="0403", ATTRS{idProduct}=="a6d0", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1" # Xverve Signalyzer Tool (DT-USB-ST), Signalyzer LITE (DT-USB-SLITE) ATTRS{idVendor}=="0403", ATTRS{idProduct}=="bca0", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1" ATTRS{idVendor}=="0403", ATTRS{idProduct}=="bca1", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1" # TI/Luminary Stellaris Evaluation Board FTDI (several) ATTRS{idVendor}=="0403", ATTRS{idProduct}=="bcd9", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1" # TI/Luminary Stellaris In-Circuit Debug Interface FTDI (ICDI) Board ATTRS{idVendor}=="0403", ATTRS{idProduct}=="bcda", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1" # egnite Turtelizer 2 ATTRS{idVendor}=="0403", ATTRS{idProduct}=="bdc8", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1" # Section5 ICEbear ATTRS{idVendor}=="0403", ATTRS{idProduct}=="c140", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1" ATTRS{idVendor}=="0403", ATTRS{idProduct}=="c141", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1" # Amontec JTAGkey and JTAGkey-tiny ATTRS{idVendor}=="0403", ATTRS{idProduct}=="cff8", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1" # TI ICDI ATTRS{idVendor}=="0451", ATTRS{idProduct}=="c32a", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1" # STLink probes ATTRS{idVendor}=="0483", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1" # Hilscher NXHX Boards ATTRS{idVendor}=="0640", ATTRS{idProduct}=="0028", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1" # Hitex probes ATTRS{idVendor}=="0640", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1" # Altera USB Blaster ATTRS{idVendor}=="09fb", ATTRS{idProduct}=="6001", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1" # Amontec JTAGkey-HiSpeed ATTRS{idVendor}=="0fbb", ATTRS{idProduct}=="1000", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1" # SEGGER J-Link ATTRS{idVendor}=="1366", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1" # Raisonance RLink ATTRS{idVendor}=="138e", ATTRS{idProduct}=="9000", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1" # Debug Board for Neo1973 ATTRS{idVendor}=="1457", ATTRS{idProduct}=="5118", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1" # Olimex probes ATTRS{idVendor}=="15ba", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1" # USBprog with OpenOCD firmware ATTRS{idVendor}=="1781", ATTRS{idProduct}=="0c63", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1" # TI/Luminary Stellaris In-Circuit Debug Interface (ICDI) Board ATTRS{idVendor}=="1cbe", ATTRS{idProduct}=="00fd", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1" # Marvell Sheevaplug ATTRS{idVendor}=="9e88", ATTRS{idProduct}=="9e8f", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1" # Keil Software, Inc. ULink ATTRS{idVendor}=="c251", ATTRS{idProduct}=="2710", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1" # CMSIS-DAP compatible adapters ATTRS{product}=="*CMSIS-DAP*", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1" # Atmel AVR Dragon ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2107", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1" # Raspberry Pi Pico SUBSYSTEMS=="usb", ATTRS{idVendor}=="2e8a", ATTRS{idProduct}=="[01]*", MODE:="0666"

At this point PlatformIO CLI should be installed and ready to use.

Post Install

For newbies to get started from here and test the installation:

If you have an IOT device to connect, now is a good time (I like to use the following steps).

$ watch lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 004: ID 8087:0a2a Intel Corp. Bus 001 Device 034: ID 258a:1007 Bus 001 Device 033: ID 1a40:0101 Terminus Technology Inc. Hub Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Plug in USB device (i.e, NodeMCU, ESP32, etc) Something like this should appear in the list. Bus 001 Device 028: ID 10c4:ea60 Cygnal Integrated Products, Inc. CP210x UART Bridge / myAVR mySmartUSB light In my board's case, it is using a CP210x UART Bridge which happens to be the first entry in our 99-platformio-udev.rules file we had added earlier.
$ pio device list
****************************************************************************************** If you like PlatformIO, please: - follow us on Twitter to stay up-to-date on the latest project news > https://twitter.com/PlatformIO_Org - star it on GitHub > https://github.com/platformio/platformio - try PlatformIO IDE for embedded development > https://platformio.org/platformio-ide ****************************************************************************************** /dev/ttyS0 ---------- Hardware ID: PNP0501 Description: ttyS0 /dev/ttyUSB0 ------------ Hardware ID: USB VID:PID=10C4:EA60 SER=0001 LOCATION=1-2 Description: CP2102 USB to UART Bridge Controller - CP2102 USB to UART Bridge Controller ****************************************************************************************** We found 2.06MB of unnecessary PlatformIO system data (temporary files, unnecessary packages, etc.). Use `pio system prune --dry-run` to list them or `pio system prune` to save disk space. So, my board was assigned the /dev/ttyUSB0 device for communication, yay.
Now to create a PlatformIO project (in my case, have the ESP8266 blink
its onboard LED)

$ mkdir ~/esp8266/blink $ cd ~/esp8266/blink $ pio project init
The current working directory /home/scotty/esp/testing will be used for the project. The next files/directories have been created in /home/scotty/esp/testing include - Put project header files here lib - Put here project specific (private) libraries src - Put project source files here platformio.ini - Project Configuration File Project has been successfully initialized! Useful commands: `pio run` - process/build project from the current directory `pio run --target upload` or `pio run -t upload` - upload firmware to a target `pio run --target clean` - clean project (remove compiled files) `pio run --help` - additional information

Now update the platformio.ini file:

; PlatformIO Project Configuration File
;
;   Build options: build flags, source filter
;   Upload options: custom upload port, speed and extra flags
;   Library options: dependencies, extra library storages
;   Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html

[env:latest_stable]
framework = arduino
platform = espressif8266
board = nodemcuv2

monitor_port = /dev/ttyUSB0
upload_speed = 921600 ; increased upload time from ~17 to ~3 secs.
platformio.ini

And create a main.cpp file in src directory:

#include "Arduino.h"

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);     // Initialize the LED_BUILTIN pin as an output
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);   // Turn the LED on (Note that LOW is the voltage level
                                    // but actually the LED is on; this is because 
                                    // it is acive low on the ESP-01)
  delay(1000);                      // Wait for a second
  digitalWrite(LED_BUILTIN, LOW);  // Turn the LED off by making the voltage HIGH
  delay(2000);                      // Wait for two seconds (to demonstrate the active low LED)
}
main.cpp

So in my project folder (~/esp8266/blink) I have:

.gitignore
include/
lib/
.pio/
platformio.ini
src/
  |_ main.cpp
test/

Now to compile and upload to the board and hopefully see A little LED blinking:

../blink$ pio run --target upload
Processing latest_stable (framework: arduino; platform: espressif8266; board: nodemcuv2) ------------------------------------------------------------------------------------------ Verbose mode can be enabled via `-v, --verbose` option CONFIGURATION: https://docs.platformio.org/page/boards/espressif8266/nodemcuv2.html PLATFORM: Espressif 8266 (3.2.0) > NodeMCU 1.0 (ESP-12E Module) HARDWARE: ESP8266 80MHz, 80KB RAM, 4MB Flash PACKAGES: - framework-arduinoespressif8266 3.30002.0 (3.0.2) - tool-esptool 1.413.0 (4.13) - tool-esptoolpy 1.30000.201119 (3.0.0) - tool-mklittlefs 1.203.210628 (2.3) - tool-mkspiffs 1.200.0 (2.0) - toolchain-xtensa 2.100300.210717 (10.3.0) LDF: Library Dependency Finder -> https://bit.ly/configure-pio-ldf LDF Modes: Finder ~ chain, Compatibility ~ soft Found 35 compatible libraries Scanning dependencies... No dependencies Building in release mode Compiling .pio/build/latest_stable/src/main.c.o Generating LD script .pio/build/latest_stable/ld/local.eagle.app.v6.common.ld Archiving .pio/build/latest_stable/libFrameworkArduinoVariant.a Indexing .pio/build/latest_stable/libFrameworkArduinoVariant.a Compiling .pio/build/latest_stable/FrameworkArduino/Crypto.cpp.o Compiling .pio/build/latest_stable/FrameworkArduino/Esp-frag.cpp.o Compiling .pio/build/latest_stable/FrameworkArduino/Esp-version.cpp.o LOTS OF COMPILING... Compiling .pio/build/latest_stable/FrameworkArduino/umm_malloc/umm_integrity.c.o Compiling .pio/build/latest_stable/FrameworkArduino/umm_malloc/umm_local.c.o Compiling .pio/build/latest_stable/FrameworkArduino/umm_malloc/umm_malloc.cpp.o Compiling .pio/build/latest_stable/FrameworkArduino/umm_malloc/umm_poison.c.o Archiving .pio/build/latest_stable/libFrameworkArduino.a Indexing .pio/build/latest_stable/libFrameworkArduino.a Linking .pio/build/latest_stable/firmware.elf Retrieving maximum program size .pio/build/latest_stable/firmware.elf Checking size .pio/build/latest_stable/firmware.elf Advanced Memory Usage is available via "PlatformIO Home > Project Inspect" RAM: [=== ] 34.2% (used 27980 bytes from 81920 bytes) Flash: [== ] 25.0% (used 260893 bytes from 1044464 bytes) Building .pio/build/latest_stable/firmware.bin Creating BIN file ".pio/build/latest_stable/firmware.bin" using "/home/scotty/.platformio/packages/framework-arduinoespressif8266/bootloaders/eboot/eboot.elf" and ".pio/build/latest_stable/firmware.elf" Configuring upload protocol... AVAILABLE: espota, esptool CURRENT: upload_protocol = esptool Looking for upload port... Auto-detected: /dev/ttyUSB1 Uploading .pio/build/latest_stable/firmware.bin esptool.py v3.0 Serial port /dev/ttyUSB1 Connecting.... Chip is ESP8266EX Features: WiFi Crystal is 26MHz MAC: 84:0d:8e:8d:45:0e Uploading stub... Running stub... Stub running... Changing baud rate to 921600 Changed. Configuring flash size... Compressed 265040 bytes to 195056... Writing at 0x00000000... (8 %) Writing at 0x00004000... (16 %) Writing at 0x00008000... (25 %) Writing at 0x0000c000... (33 %) Writing at 0x00010000... (41 %) Writing at 0x00014000... (50 %) Writing at 0x00018000... (58 %) Writing at 0x0001c000... (66 %) Writing at 0x00020000... (75 %) Writing at 0x00024000... (83 %) Writing at 0x00028000... (91 %) Writing at 0x0002c000... (100 %) Wrote 265040 bytes (195056 compressed) at 0x00000000 in 2.4 seconds (effective 870.7 kbit/s)... Hash of data verified. Leaving... Hard resetting via RTS pin... ============================== [SUCCESS] Took 27.16 seconds ==============================

Ah, I see a little LED on the ESP-12E component of the board blinking!  Yay.

And now, to attach a little OLED screen to the ESP8266 and display a little R2D2 image...AHHH...it's just too fun...

Seriously though I did do that here.