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 lsusbBus 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 initThe 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:
And create a main.cpp file in src directory:
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 uploadProcessing 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.