Provided by: platformio_4.3.4-2_all bug

NAME

       platformio - PlatformIO Documentation

       A place where Developers and Teams have true Freedom! No more hardware or software lock-ins!

       • Open source, maximum permissive Apache 2.0 license

       • Cross-platform IDE and Unified Debugger

       • Static Code Analyzer and Remote Unit Testing

       • Multi-platform and Multi-architecture Build System

       • Firmware File Explorer and Memory Inspection.

       Social: Twitter | LinkedIn | Facebook | Bintray | Community

CONTENTS

   What is PlatformIO?
       A place where Developers and Teams have true Freedom! No more hardware or software lock-ins!

   ContentsAwardsPhilosophyTechnologiesProblematicHow does it work?

       PlatformIO  is  a  cross-platform, cross-architecture, multiple framework, professional tool for embedded
       systems engineers and for software developers who write applications for embedded products.

   Awards
       PlatformIO was nominated for the year's best Software and Tools in the 2015/16 IoT Awards.

       A native PlatformIO IDE extension for Microsoft ide_vscode editor is the  most  rated/reviewed  extension
       with over 800 five-star reviews in the whole Microsoft Marketplace. It also was installed by over 750,000
       unique developers around the world.

   Philosophy
       PlatformIO's unique philosophy in the embedded  market  provides  developers  with  a  modern  integrated
       development  environment  (ide)  that  works cross-platform, supports many different software development
       kits (SDKs) or frameworks, and includes sophisticated debugging (piodebug), unit testing  (unit_testing),
       automated  code  analysis  (piocheck),  and remote management (pioremote).  It is architected to maximize
       flexibility and choice by developers, who can use either graphical or command line editors (piocore),  or
       both.

       PlatformIO  is a must-have tool for professional embedded systems engineers who develop solutions on more
       than one specific platform. In addition, by having a decentralized architecture, PlatformIO  offers  both
       new  and  existing  developers  a  quick  integration  path for developing commercial-ready products, and
       reduces the overall time-to-market.

       And it runs on any one of your favorite modern operating systems (macOS, MS Windows, Linux, FreeBSD).

   Technologies
       PlatformIO applies the latest scalable and flexible software technology to the embedded market – an  area
       traditionally served by complex software tools that experienced hardware engineers have learned over time
       (often painfully so). Instead, with PlatformIO, users can be hobbyists or professionals. They can  import
       the  classic  Arduino  "Blink"  sketch  or  develop   a  sophisticated low-level embedded C program for a
       commercial product. Example code for any supported framework can be compiled and  uploaded  to  a  target
       platform in minutes.

       The  build  system  structure  automatically  tags software dependencies and applies them using a modular
       hierarchy that takes away the usual complexity and pain. Developers no longer have to manually  find  and
       assemble  an environment of toolchains, compilers, and library dependencies to develop applications for a
       specific target. With PlatformIO, clicking the compile button will bring in  all  necessary  dependencies
       automatically.  It's  analogous  to  if you were a furniture designer, and your CAD program had a "build"
       button that caused a robot to fetch all the necessary pieces and fasteners and correctly assemble them.

       piocore is a unique, developed-from-scratch  build  system  that  removes  the  usual  pain  of  software
       integration,  packaging,  and  library  dependencies  that developers encounter when they move beyond the
       bounds of a specific SDK or example embedded  application.  It  can  be  used  with  a  variety  of  code
       development  environments  and  allows  easy  integration  with numerous cloud platforms and web services
       feeds. The user experiences no barriers to getting started quickly: no license fees, no legal  contracts.
       The  user  maintains  full  flexibility  of  the  build environment because the tools are open source and
       permissively licensed (no permission needed to modify them, and no requirement to share changes.)

   Problematic
       • The main problem which repulses people from the embedded  world  is  a  complicated  process  to  setup
         development  software  for  a specific MCU/board: toolchains, proprietary vendor's IDE (which sometimes
         isn't free) and what is more, to get a computer with OS where that software is supported.

       • Multiple hardware platforms (MCUs, boards) require different toolchains, IDEs, etc, and,  respectively,
         spending time on learning new development environments.

       • Finding proper libraries and code samples showing how to use popular sensors, actuators, etc.

       • Sharing  embedded  projects between team members, regardless of an operating system they prefer to work
         with.

   How does it work?
       Without going too deep into PlatformIO implementation details, work cycle of the project developed  using
       PlatformIO is as follows:

       • Users choose board(s) interested in projectconf

       • Based on this list of boards, PlatformIO downloads required toolchains and installs them automatically.

       • Users  develop  code  and  PlatformIO  makes sure that it is compiled, prepared and uploaded to all the
         boards of interest.

   PlatformIO IDE
       PlatformIO IDE is the next-generation integrated development environment for IoT.

       • Cross-platform build system without external dependencies to the OS software:

            • 800+ boards

            • 35+ platforms

            • 20+ frameworks

       • piodebug

       • pioremote

       • unit_testing

       • C/C++ Intelligent Code Completion

       • C/C++ Smart Code Linter for rapid professional development

       • Library Manager for the hundreds popular libraries

       • Multi-projects workflow with multiple panes

       • Themes support with dark and light colors

       • Serial Port Monitor

       • Built-in Terminal with piocore and CLI tool (pio, platformio)

       • Built-in piohome.

                                                         ----

       We provide official packages (plugins, extensions) for the most popular IDEs and text editors.

       NOTE:
          In our experience, ide_vscode offers better system performance, and users have found it easier to  get
          started

   PlatformIO for VSCode
       Visual  Studio  Code  is  a lightweight but powerful source code editor which runs on your desktop and is
       available for Windows, macOS and Linux. It comes with built-in support  for  JavaScript,  TypeScript  and
       Node.js and has a rich ecosystem of extensions for other languages (such as C++, C#, Python, PHP, Go) and
       runtimes (such as .NET and Unity).

       Install PlatformIO for VSCode / Get started .SS PlatformIO for CLion

       The CLion is a cross-platform C/C++ IDE for Linux, OS X, and Windows. CLion includes such features  as  a
       smart  editor, code generation, code quality assurance, automated refactorings, on-the-fly code analysis,
       project manager, integrated version control systems and debugger.

       Install PlatformIO for CLion / Get started .SS PlatformIO Core (CLI)

       PlatformIO Core (CLI tool) is a heart of whole PlatformIO ecosystem and consists of

       • Multi-platform Build System

       • Development platform and package managers

       • librarymanager

       • ldf

       • Serial Port Monitor

       • Integration components (ide and ci).

       PlatformIO Core is written  in  Python  and  works  on  Windows,  macOS,  Linux,  FreeBSD  and  ARM-based
       credit-card sized computers (Raspberry Pi, BeagleBone, CubieBoard, Samsung ARTIK, etc.).

       PlatformIO  Core provides a rich and documented Command Line Interface (CLI).  The other PlatformIO-based
       software and IDEs are based on PlatformIO Core CLI, such as pioide. In other words, they wrap  PlatformIO
       Core with own GUI.

       NOTE:
          Please note that you do not need to install PlatformIO Core if you are going to use pioide. PlatformIO
          Core is built into PlatformIO IDE and you will be able to use it within PlatformIO IDE Terminal.

          If you need PlatformIO Core commands outside PlatformIO IDE, please piocore_install_shell_commands.

   Demo
   Contents"Blink Project"Used in demoPlatform ManagerUsed in demoLibrary ManagerUsed in demoOver-the-Air update for ESP8266Used in demo

   Blink Project
       [image]

   Used in demo
       1. Source code of Wiring Blink Example

       2. cmd_run command

       3. platformio run -t upload command.

   Platform Manager
       [image]

   Used in demo
       1. userguide_platform

       2. cmd_platform_list command

       3. platformio platform search avr command

       4. platformio platform show teensy command

       5. cmd_platform_update command.

   Library Manager
       [image]

   Used in demo
       1. cmd_lib

       2. platformio lib search 1-wire command

       3. platformio lib install 54 command

       4. platformio lib search -f mbed command

       5. platformio lib search -k rf command

       6. platformio lib search radiohead command

       7. platformio lib install 124 --version "1.40" command

       8. platformio lib show 124 command

       9. cmd_lib_update command.

   Over-the-Air update for ESP8266
       .SS Used in demo

       1. cmd_run command

       2. platformio run -t upload command.

   Installation
       NOTE:
          Please note that you do not need to install piocore if you are going to use pioide. piocore  is  built
          into PlatformIO IDE and you will be able to use it within PlatformIO IDE Terminal.

          If you need piocore outside PlatformIO IDE, please Install Shell Commands.

       PlatformIO  Core  is  written  in  Python  and  works  on  Windows,  macOS,  Linux, FreeBSD and ARM-based
       credit-card sized computers (Raspberry Pi, BeagleBone, CubieBoard, Samsung ARTIK, etc.).

       • System requirementsInstallation MethodsInstaller ScriptSuper-Quick (Mac / Linux)Local Download (Mac / Linux / Windows)Python Package ManagermacOS HomebrewVirtual EnvironmentPrerequisitesCreatingDevelopment VersionInstall Shell CommandsUnix and Unix-likeMethod 1Method 2WindowsUninstall PIO Core and dependent packagesIntegration with custom applications (extensions, plugins)PrerequisitePython InterpreterInstaller ScriptWorkflowStep 1. Where is PlatformIO Core installed?Step 2. Install PlatformIO CoreTroubleshooting

   System requirements
       Operating System
              Windows, macOS, Linux, FreeBSD, Linux ARMv6+

       Python Interpreter
              Python 3.5+ (Python 2.7 is not recommended, support for it will be removed in the next  releases).
              See detailed instruction on how to faq_install_python for Windows.

       Terminal Application
              All  commands below should be executed in Command-line application (Terminal). For macOS and Linux
              OS - Terminal application, for Windows OS – cmd.exe application.

       Access to Serial Ports (USB/UART)
              Windows Users: Please check that you have correctly installed USB driver from board manufacturer

              Linux Users:

              • Please install faq_udev_rules

              • Raspberry Pi users, please read this article Enable serial port on Raspberry Pi.

   Installation Methods
       Please choose ONE of the following methods:

       • Installer ScriptSuper-Quick (Mac / Linux)Local Download (Mac / Linux / Windows)Python Package ManagermacOS HomebrewVirtual EnvironmentPrerequisitesCreating

   Installer Script
       WARNING:
          PlatformIO DOES NOT require administrative/sudo permissions. Please install using default user account
          WITHOUT EXTRA PERMISSIONS.

   Super-Quick (Mac / Linux)
       To install or upgrade PlatformIO Core paste that at a Terminal prompt:

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

          # or using `curl`

          curl -fsSL https://raw.githubusercontent.com/platformio/platformio-core-installer/master/get-platformio.py -o get-platformio.py
          python3 get-platformio.py

          # or using `wget`

          wget https://raw.githubusercontent.com/platformio/platformio-core-installer/master/get-platformio.py -O get-platformio.py
          python3 get-platformio.py

   Local Download (Mac / Linux / Windows)
       To  install  or  upgrade  PlatformIO  Core, download (save as...)  get-platformio.py script. Then run the
       following:

          # change directory to folder where is located downloaded "get-platformio.py"
          cd /path/to/dir/where/is/located/get-platformio.py/script

          # run it
          python get-platformio.py

       On Windows OS it may look like:

          # change directory to folder where is located downloaded "get-platformio.py"
          cd C:\path\to\dir\where\is\located\script\get-platformio.py

          # run it
          python.exe get-platformio.py

       NOTE:
          If you need to have access to  platformio  or  platformio.exe  commands  from  other  applications  or
          terminal in your OS, please Install Shell Commands.

   Python Package Manager
       WARNING:
          We  recommend  using  this method ONLY FOR ci use cases or where your have full permissions to install
          PlatformIO Core into the global scope of your OS.

          For personal using, and avoiding maintenance and upgrade issues, we HIGHLY RECOMMEND  using  Installer
          Script  which  installs  PlatformIO Core into an isolated virtual environment and does not affect your
          OS.

       The latest stable version of PlatformIO Core may be installed or upgraded via Python Package  Manager  (‐
       pip) as follows:

          pip install -U platformio

   macOS Homebrew
       The  latest stable version of PlatformIO may be installed or upgraded via macOS Homebrew Packages Manager
       (brew) as follows:

          brew install platformio

   Virtual Environment
       PlatformIO Core may be installed into isolated Python environment. This method is very good if you  don't
       want  to  install  PlatformIO Core Python's dependencies (packages) into your global system scope. pioide
       uses this method to install PlatformIO Core.

       Default and recommended environment folder is "projectconf_pio_core_dir/penv".  You can print environment
       folder path using the next command in your system terminal:

          python -c "import os; print(os.path.join(os.getenv('PLATFORMIO_CORE_DIR', os.path.join(os.path.expanduser('~'), '.platformio')), 'penv'))"

          ######################## Examples
          # Windows
          # C:\Users\UserName\.platformio\penv

          # Linux
          # ~/.platformio/penv
          # /home/username/.platformio/penv

          # macOS
          # ~/.platformio/penv
          # /Users/username/.platformio/penv

   Prerequisites
       1. Please  remove  existing  PlatformIO  Core environment folder if exists.  See above command how to get
          path to environment folder.

       2. Please check that you have a valid Python interpreter running  a  next  command  in  system  terminal.
          Python 2.7.9+ or Python 3.5+ is recommended.

             python --version

             # or, for Unix (Linux, Mac), you can use `python2` or `python3` aliases
             python2 --version
             python3 --version

          WARNING:
             Windows Users: If you already tried to install pioide and did not get success, please open system's
             Control Panel > Installed Programs, and check if PlatformIO IDE tried to install  an  own  isolated
             Python  2.7  version. Please uninstall it. Also is good to uninstall all Python interpreters from a
             system and install manually the latest Python using faq_install_python guide.

       3. Make sure virtualenv --help command exists in a system, otherwise, please install  it  manually  using
          pip install virtualenv or pip2 install virtualenv command.

          If   pip   (Python   Package  Manager)  does  not  exists,  you  have  to  install  it  manually.  See
          https://pip.pypa.io/en/stable/installing/

   Creating
       1. Create a folder which contains all the necessary executables to use the packages that PIO  Core  would
          need using virtualenv command:

             virtualenv /path/to/.platformio/penv

             # If you want to use a custom Python interpreter
             virtualenv --python=/path/to/custom/python /path/to/.platformio/penv

             # EXAMPLES
             # Windows
             virtualenv C:\Users\UserName\.platformio\penv
             virtualenv --python=C:\Python27\python.exe  C:\Users\UserName\.platformio\penv

             # Unix (Linux, Mac)
             virtualenv ~/.platformio/penv
             virtualenv -p python3 ~/.platformio/penv

       2. Activate virtual environment

             # Windows
             C:\Users\UserName\.platformio\penv\Scripts\activate

             # Unix (Linux, Mac)
             source /path/to/.platformio/penv/bin/activate
             # or
             . /path/to/.platformio/penv/bin/activate

       3. Install PIO Core into virtual environment

             pip install -U platformio

       If you plan to use PIO Core commands outside virtual environment, please Install Shell Commands.

   Development Version
       WARNING:
          If you use pioide, please enable development version:

          • ide_atom: "Menu PlatformIO: Settings > PlatformIO IDE > Use development version of PlatformIO Core"

          • ide_vscode: Set platformio-ide.useDevelopmentPIOCore to true in ide_vscode_settings.

       Install the latest PlatformIO from the develop branch:

          # uninstall existing version
          pip uninstall platformio

          # install the latest development version of PlatformIO
          pip install -U https://github.com/platformio/platformio-core/archive/develop.zip

       If  you  want to be up-to-date with the latest develop version of PlatformIO, then you need to re-install
       PlatformIO each time you see a new commits in PlatformIO GitHub repository (branch: develop) like so:

          pip install -U https://github.com/platformio/platformio-core/archive/develop.zip

       Or:

          pio upgrade --dev

       To revert to the latest stable version:

          pip uninstall platformio
          pip install -U platformio

   Install Shell Commands
       piocore consists of 2 standalone tools in a system:

       • platformio or pio (short alias) - piocore_userguide

       • piodebuggdb - alias of cmd_debug

       If you have pioide already installed, you do not need to install  piocore  separately.  Just  link  these
       tools with your shell:

       • Unix and Unix-likeMethod 1Method 2Windows

   Unix and Unix-like
       In Unix and Unix-like systems, there are multiple ways to achieve this.

   Method 1
       You  can  export  PlatformIO  executables' directory to the PATH environmental variable. This method will
       allow you to execute platformio commands from any terminal emulator as long as you're logged  in  as  the
       user PlatformIO is installed and configured for.

       If  you use Bash as your default shell, you can do it by editing either ~/.profile or ~/.bash_profile and
       adding the following line:

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

       If you use Zsh, you can either edit ~/.zprofile and add the code above, or for supporting both, Bash  and
       Zsh,  you  can  first edit ~/.profile and add the code above, then edit ~/.zprofile and add the following
       line:

          emulate sh -c '. ~/.profile'

       After everything's done, just restart your session (log out and log back in) and you're good to go.

       If you don't know the difference between the two, check out this page.

   Method 2
       You can create system-wide symlinks. This method is not recommended if you have multiple  users  on  your
       computer  because  the  symlinks  will be broken for other users and they will get errors while executing
       PlatformIO commands. If that's not a problem, open your system terminal app and paste these commands (MAY
       require administrator access sudo):

          ln -s ~/.platformio/penv/bin/platformio /usr/local/bin/platformio
          ln -s ~/.platformio/penv/bin/pio /usr/local/bin/pio
          ln -s ~/.platformio/penv/bin/piodebuggdb /usr/local/bin/piodebuggdb

       After that, you should be able to run PlatformIO from terminal. No restart is required.

   Windows
       Please read one of these instructions How do I set or change the PATH system variable?

       You     need     to     edit     system     environment     variable     called     Path    and    append
       C:\Users\UserName\.platformio\penv\Scripts; path in the beginning of a list (please replace UserName with
       your account name).

   Uninstall PIO Core and dependent packages
       • Uninstall PIO Core tool

                # uninstall standalone PIO Core installed via `pip`
                pip uninstall platformio

                # uninstall Homebrew's PIO Core (only macOS users if you installed it via Homebrew before)
                brew uninstall platformio

       • Dependent  packages,  global libraries are installed to projectconf_pio_core_dir folder (in user's HOME
         directory). Just remove it.

   Integration with custom applications (extensions, plugins)
       We recommend using  PlatformIO  Core  Installer  Script  when  you  integrate  PlatformIO  Core  into  an
       application, such as extension or plugin for IDE. Examples that use this installer are:

       • platformio-node-helpers, is used by PlatformIO IDE for VSCode and PlatformIO IDE for Atom

   Prerequisite
   Python Interpreter
       PlatformIO Core Installer Script is written in Python and is compatible with Python 2.7+ and Python 3.5+.
       We highly recommend using Python 3.

       Python is installed by default on the most popular Unix OS (macOS,  Linux,  FreeBSD).   If  there  is  no
       Python on a user machine (you can check running python --version), we have 2 options:

       1. Ask the user to install Python 3 using our guide faq_install_python

       2. You  can automatically Download Portable Python 3 and unpack it in a cache folder of your application.
          Later, you can use unpacked_protable_python_dir/python.exe  for the installer script.

   Installer Script
       There are 2 options on how to work with PlatformIO Core Installer Script:

       1. Bundle get-platformio.py file into your application

       2. Download get-platformio.py file on demand.

       In both cases, you will need to have get-platformio.py script on the end-user machine.  You can  copy  or
       download it to a cache/temporary folder.

       A list of arguments and options for the installer script is available via

          python get-platformio.py --help

   Workflow
       We  will  describe  a  simple  workflow  on  how  to  automatically  install piocore for end-user of your
       application/extension. We assume that get-platformio.py script is already copied/downloaded and exists on
       the end-user machine. See above how to get it.

   Step 1. Where is PlatformIO Core installed?
       You  should check the PlatformIO Core installation state each time when the user starts your application.
       You need to call the Installer Script with check core arguments:

          python get-platformio.py check core

       This command returns 0 "exit code" when PlatformIO Core is  already  installed  and  is  ready  for  use,
       otherwise,  the non-zero code of subprocess will be returned and you need to install PlatformIO Core (see
       Step #2 below).

       If you need to  have  full  information  about  PlatformIO  Core  installation  state,  please  run  with
       --dump-state option and specify a folder or a full path where to save data in JSON format:

          get-platformio.py check core --dump-state tmpdir/pioinstaller-state.json

       Now,   read   JSON   file   and  use  platformio_exe  binary  to  call  PlatforIO  Core  using  CLI  (see
       piocore_userguide). You can also export penv_bin_dir into system environment PATH variable and platformio
       command will be available without a full path.

       Example of pioinstaller-state.json run on macOS:

          {
            "cache_dir": "/Users/Freedom/.platformio/.cache",
            "core_dir": "/Users/Freedom/.platformio",
            "core_version": "4.3.1",
            "installer_version": "0.2.0",
            "is_develop_core": false,
            "penv_bin_dir": "/Users/Freedom/.platformio/penv/bin",
            "penv_dir": "/Users/Freedom/.platformio/penv",
            "platformio_exe": "/Users/Freedom/.platformio/penv/bin/platformio",
            "python_exe": "/Users/Freedom/.platformio/penv/bin/python",
            "system": "darwin_x86_64"
          }

   Step 2. Install PlatformIO Core
       To  install  PlatformIO  Core  into  the  virtual environment in an automatic mode, please call installer
       script without any arguments:

          python get-platformio.py

       Available options:

       • --verbose, verbose output

       • --dev, install the latest development version of PlatformIO Core

       • --ignore-python, a path to Python to be ignored (multiple options and unix wildcards are allowed)

       More options are available at python get-platformio.py --help.

       Installer Script will return exit code 0 on success, otherwise non-zero code and error explanation.

       Next time just use again python get-platformio.py check core as described in Step #1 (see above).

   Troubleshooting
       NOTE:
          Linux OS: Don't forget to install  "udev"  rules  file  99-platformio-udev.rules  (an  instruction  is
          located in the file).

          Windows OS: Please check that you have correctly installed USB driver from board manufacturer

       For further details, frequently questions, known issues, please refer to faq.

       If    you    find    any   issues   with   PlatformIO   Core   Installer   Script,   please   report   to
       https://github.com/platformio/platformio-core-installer/issues

   Quick Start
       This tutorial introduces you to the basics of piocore Command Line Interface (CLI) workflow and shows you
       a  creation  process  of a simple cross-platform “Blink” Project. After finishing you will have a general
       understanding of how to work with the multiple development platforms and embedded boards.

   Setting Up the Project
       piocore provides special cmd_project_init command for  configuring  your  projects.   It  allows  one  to
       initialize new empty project or update existing with the new data.

       What  is  more,  cmd_project_init  can  be  used  for  ide.  It  means  that  you  will be able to import
       pre-generated PlatformIO project using favorite IDE and extend it with the professional  instruments  for
       IoT development.

       This   tutorial   is  based  on  the  next  popular  embedded  boards  and  development  platforms  using
       framework_arduino:

                     ┌───────────────────────┬───────────────────────────────┬───────────────────┐
                     │Platform               │ Board                         │ Framework         │
                     ├───────────────────────┼───────────────────────────────┼───────────────────┤
                     │platform_atmelavr      │ board_atmelavr_uno            │ framework_arduino │
                     ├───────────────────────┼───────────────────────────────┼───────────────────┤
                     │platform_espressif8266 │ board_espressif8266_nodemcuv2 │ framework_arduino │
                     ├───────────────────────┼───────────────────────────────┼───────────────────┤
                     │platform_teensy        │ board_teensy_teensy31         │ framework_arduino │
                     └───────────────────────┴───────────────────────────────┴───────────────────┘

   Board Identifier
       cmd_project_init  command  requires to specify board identifier ID. It can be found using boards catalog,
       Boards Explorer or cmd_boards command. For example, using cmd_boards let's try to find Teensy boards:

          > platformio boards teensy

          Platform: teensy
          ---------------------------------------------------------------------------
          ID                    MCU            Frequency  Flash   RAM    Name
          ---------------------------------------------------------------------------
          teensy20              atmega32u4     16MHz     31K    2.5K  Teensy 2.0
          teensy30              mk20dx128      48MHz     128K   16K   Teensy 3.0
          teensy31              mk20dx256      72MHz     256K   64K   Teensy 3.1 / 3.2
          teensylc              mkl26z64       48MHz     62K    8K    Teensy LC
          teensy20pp            at90usb1286    16MHz     127K   8K    Teensy++ 2.0

       According  to  the  table  above  the  ID  for  board_teensy_teensy31  is  teensy31.  Also,  the  ID  for
       board_atmelavr_uno is uno and for board_espressif8266_nodemcuv2 is nodemcuv2.

   Initialize Project
       PlatformIO  ecosystem  contains  big  database with pre-configured settings for the most popular embedded
       boards. It helps you to  forget  about  installing  toolchains,  writing  build  scripts  or  configuring
       uploading  process.  Just  tell  PlatformIO  the  Board ID and you will receive full working project with
       pre-installed instruments for the professional development.

       1. Create empty folder where you are going  to  initialize  new  PlatformIO  project.  Then  open  system
          Terminal and change directory to it:

             # create new directory
             > mkdir path_to_the_new_directory

             # go to it
             > cd path_to_the_new_directory

       2. Initialize project for the boards mentioned above (you can specify more than one board at time):

             > platformio project init --board uno --board nodemcuv2 --board teensy31

             The current working directory *** will be used for the new project.
             You can specify another project directory via
             `platformio project init -d %PATH_TO_THE_PROJECT_DIR%` command.

             The next files/directories will be created in ***
             platformio.ini - Project Configuration File. |-> PLEASE EDIT ME <-|
             src - Put your source files here
             lib - Put here project specific (private) libraries
             Do you want to continue? [y/N]: y
             Project has been successfully initialized!
             Useful commands:
             `platformio run` - process/build project from the current directory
             `platformio run --target upload` or `platformio run -t upload` - upload firmware to embedded board
             `platformio run --target clean` - clean project (remove compiled files)

       Congrats! You have just created the first PlatformIO based Project with the next structure:

       • projectconf

       • src directory where you should place source code (*.h, *.c, *.cpp, *.S, *.ino, etc.)

       • lib  directory  can  be used for the project specific (private) libraries.  More details are located in
         lib/README file.

       • Miscellaneous files for VCS and ci support.

       NOTE:
          If you need to add new board to the existing project please use cmd_project_init again.

       The result of just generated platformio.ini:

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

          [env:uno]
          platform = atmelavr
          framework = arduino
          board = uno

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

          [env:teensy31]
          platform = teensy
          framework = arduino
          board = teensy31

       Now, we need to create main.cpp file and place it to  src  folder  of  our  newly  created  project.  The
       contents of src/main.cpp:

          /**
           * Blink
           *
           * Turns on an LED on for one second,
           * then off for one second, repeatedly.
           */
          #include "Arduino.h"

          #ifndef LED_BUILTIN
          #define LED_BUILTIN 13
          #endif

          void setup()
          {
            // initialize LED digital pin as an output.
            pinMode(LED_BUILTIN, OUTPUT);
          }

          void loop()
          {
            // turn the LED on (HIGH is the voltage level)
            digitalWrite(LED_BUILTIN, HIGH);

            // wait for a second
            delay(1000);

            // turn the LED off by making the voltage LOW
            digitalWrite(LED_BUILTIN, LOW);

             // wait for a second
            delay(1000);
          }

       The final Project structure:

          project_dir
          ├── lib
          │   └── README
          ├── platformio.ini
          └── src
              └── main.cpp

   Process Project
       piocore  provides  special  cmd_run  command  to  process  project. If you call it without any arguments,
       PlatformIO Build System will process  all  project  environments  (which  were  created  per  each  board
       specified above). Here are a few useful commands:

       • platformio run. Process (build) all environments specified in projectconf

       • platformio  run  --target  upload.  Build  project  and upload firmware to the all devices specified in
         projectconf

       • platformio run --target clean. Clean project (delete compiled objects)

       • platformio run -e uno. Process only uno environment

       • platformio run -e uno -t upload. Build project only for uno and upload firmware.

       Please follow to platformio run --target documentation for the other targets.

       Finally, demo which demonstrates building project and uploading firmware to Arduino Uno: [image]

   Further ReadingProject examples

       • piocore_userguide for piocore commands

   CLI Guide
   ContentsCLI GuideUsageOptionsCommands

   Usage
          pio [OPTIONS] COMMAND
          platformio [OPTIONS] COMMAND

          # "pio" is the alias of "platformio" command

   Options
       --no-ansi

       Do not print ANSI control characters.

       See also PLATFORMIO_NO_ANSI and PLATFORMIO_FORCE_ANSI environment variables.

       --version

       Show the version of PlatformIO

       --help, -h

       Show help for the available options and commands

          $ platformio --help
          $ platformio COMMAND --help

   Commands
   platformio account
       CLI helper command for pioaccount.

       To print all available commands and options use:

          pio account --help
          platformio account --help
          platformio account COMMAND --help

   platformio account forgot
   Contentsplatformio account forgotUsageDescriptionOptions

   Usage
          platformio account forgot [OPTIONS]
          pio account forgot [OPTIONS]

   Description
       Allows you  to  reset  password  for  pioaccount  using  username  or  email  which  were  specified  for
       registration.

   Options
       --username, -u

       Username or email. You can omit this option and enter username or email in Forgot Wizard later.

   platformio account login
   Contentsplatformio account loginUsageDescriptionOptions

   Usage
          platformio account login [OPTIONS]
          pio account login [OPTIONS]

   Description
       Log  in  to  pioaccount.  If  you are not able to provide authentication credentials manually you can use
       PLATFORMIO_AUTH_TOKEN. This is very useful for ci systems and pioremote operations.

   Options
       --username, -u

       Username or email. You can omit this option and enter username or email in Login Wizard later.

       --password, -p

       You can omit this option and enter securely password in Login Wizard later.

   platformio account logout
   Contentsplatformio account logoutUsageDescription

   Usage
          platformio account logout
          pio account logout

   Description
       Log out of pioaccount.

   platformio account password
   Contentsplatformio account passwordUsageDescription

   Usage
          platformio account password
          pio account password

   Description
       Change password for pioaccount.

   platformio account register
   Contentsplatformio account registerUsageDescriptionOptions

   Usage
          platformio account register [OPTIONS]
          pio account register [OPTIONS]

   Description
       Create a new pioaccount.

   Options
       You can omit these options and enter them later in Register Wizard.

       --username, -u

       A username. You can use  it  later  for  cmd_account_login,  cmd_account_update,  and  cmd_account_forgot
       commands.

       The  username must contain at least 4 characters including single hyphens, and cannot begin or end with a
       hyphen.

       --email, -e

       An email. Please enter existing email, you will receive a confirmation letter.

       --password, -p

       A password.  You  will  need  it  for  cmd_account_login,  cmd_account_password,  cmd_account_token,  and
       cmd_account_update commands.

       --firstname

       A first name.

       --lastname

       A last name.

   platformio account show
   Contentsplatformio account showUsageDescriptionOptions

   Usage
          platformio account show
          pio account show

   Description
       Show detailed information about pioaccount:

       • Active subscriptions

       • Available packages and services

   Options
       --json-output

       Return the output in JSON format

   platformio account token
   Contentsplatformio account tokenUsageDescriptionOptions

   Usage
          platformio account token
          pio account token

   Description
       Get  or  regenerate Personal Authentication Token. It is very useful for ci systems, pioremote operations
       where you are not able to authorize manually.

       PlatformIO handles Personal Authentication Token from environment variable PLATFORMIO_AUTH_TOKEN.

   Options
       --regenerate
              If this option is specified a new authentication token will be generated.

       --json-output

       Return the output in JSON format

   platformio account update
   Contentsplatformio account updateUsageDescriptionOptions

   Usage
          platformio account update [OPTIONS]
          pio account update [OPTIONS]

   Description
       Update pioaccount profile.

   Options
       You can omit these options and enter them later in update Wizard.

       --username, -u

       A username that must contain at least 4 characters including single hyphens, and cannot begin or end with
       a hyphen.

       --email, -e

       An email. Please enter existing email, you will receive a confirmation letter.

       --firstname

       A first name.

       --lastname

       A last name.

       --current-password

       A current password to confirm this operation.

   platformio boards
   Contentsplatformio boardsUsageDescriptionOptionsExamples

   Usage
          platformio boards [OPTIONS] [FILTER]
          pio boards [OPTIONS] [FILTER]

   Description
       List pre-configured Embedded Boards

   Options
       --installed

       List boards only from the installed platforms

       --json-output

       Return the output in JSON format

   Examples
       1. Show all available pre-configured embedded boards

          $ platformio boards

          Platform: atmelavr
          ---------------------------------------------------------------------------
          ID                    MCU           Frequency  Flash   RAM    Name
          ---------------------------------------------------------------------------
          btatmega168           atmega168     16MHz     14K    1K    Arduino BT ATmega168
          btatmega328           atmega328p    16MHz     28K    2K    Arduino BT ATmega328
          diecimilaatmega168    atmega168     16MHz     14K    1K    Arduino Duemilanove or Diecimila ATmega168
          diecimilaatmega328    atmega328p    16MHz     30K    2K    Arduino Duemilanove or Diecimila ATmega328
          esplora               atmega32u4    16MHz     28K    2K    Arduino Esplora
          ethernet              atmega328p    16MHz     31K    2K    Arduino Ethernet
          ...

       2. Filter Arduino-based boards

          $ platformio boards arduino

          Platform: atmelavr
          ---------------------------------------------------------------------------
          ID                    MCU           Frequency  Flash   RAM    Name
          ---------------------------------------------------------------------------
          btatmega168           atmega168     16MHz     14K    1K    Arduino BT ATmega168
          btatmega328           atmega328p    16MHz     28K    2K    Arduino BT ATmega328
          diecimilaatmega168    atmega168     16MHz     14K    1K    Arduino Duemilanove or Diecimila ATmega168
          diecimilaatmega328    atmega328p    16MHz     30K    2K    Arduino Duemilanove or Diecimila ATmega328
          esplora               atmega32u4    16MHz     28K    2K    Arduino Esplora
          ethernet              atmega328p    16MHz     31K    2K    Arduino Ethernet
          ...

       3. Filter mbed-enabled boards

          $ platformio boards mbed

          Platform: freescalekinetis
          ---------------------------------------------------------------------------
          ID                    MCU            Frequency  Flash   RAM    Name
          ---------------------------------------------------------------------------
          frdm_k20d50m          mk20dx128vlh5  48MHz     128K   16K   Freescale Kinetis FRDM-K20D50M
          frdm_k22f             mk22fn512vlh12 120MHz    512K   128K  Freescale Kinetis FRDM-K22F
          ...

          Platform: nordicnrf51
          ---------------------------------------------------------------------------
          ID                    MCU            Frequency  Flash   RAM    Name
          ---------------------------------------------------------------------------
          wallBotBLE            nrf51822       16MHz     128K   16K   JKSoft Wallbot BLE
          nrf51_dk              nrf51822       32MHz     256K   32K   Nordic nRF51-DK
          ...

          Platform: nxplpc
          ---------------------------------------------------------------------------
          ID                    MCU            Frequency  Flash   RAM    Name
          ---------------------------------------------------------------------------
          blueboard_lpc11u24    lpc11u24       48MHz     32K    8K    BlueBoard-LPC11U24
          dipcortexm0           lpc11u24       50MHz     32K    8K    DipCortex M0
          lpc11u35              lpc11u35       48MHz     64K    10K   EA LPC11U35 QuickStart Board
          ...

          Platform: ststm32
          ---------------------------------------------------------------------------
          ID                    MCU            Frequency  Flash   RAM    Name
          ---------------------------------------------------------------------------
          disco_f401vc          stm32f401vct6  84MHz     256K   64K   32F401CDISCOVERY
          nucleo_f030r8         stm32f030r8t6  48MHz     64K    8K    ST Nucleo F030R8
          ...

       4. Filter boards which are based on ATmega168 MCU

          $ platformio boards atmega168

          Platform: atmelavr
          ---------------------------------------------------------------------------
          ID                    MCU           Frequency  Flash   RAM    Name
          ---------------------------------------------------------------------------
          btatmega168           atmega168     16MHz     14K    1K    Arduino BT ATmega168
          diecimilaatmega168    atmega168     16MHz     14K    1K    Arduino Duemilanove or Diecimila ATmega168
          miniatmega168         atmega168     16MHz     14K    1K    Arduino Mini ATmega168
          atmegangatmega168     atmega168     16MHz     14K    1K    Arduino NG or older ATmega168
          nanoatmega168         atmega168     16MHz     14K    1K    Arduino Nano ATmega168
          pro8MHzatmega168      atmega168     8MHz      14K    1K    Arduino Pro or Pro Mini ATmega168 (3.3V, 8 MHz)
          pro16MHzatmega168     atmega168     16MHz     14K    1K    Arduino Pro or Pro Mini ATmega168 (5V, 16 MHz)
          lilypadatmega168      atmega168     8MHz      14K    1K    LilyPad Arduino ATmega168
          168pa16m              atmega168p    16MHz     15K    1K    Microduino Core (Atmega168PA@16M,5V)
          168pa8m               atmega168p    8MHz      15K    1K    Microduino Core (Atmega168PA@8M,3.3V)

       5. Show boards by platform_timsp430

          $ platformio boards timsp430

          Platform: timsp430
          ---------------------------------------------------------------------------
          ID                    MCU           Frequency  Flash   RAM    Name
          ---------------------------------------------------------------------------
          lpmsp430fr5739        msp430fr5739  16MHz     15K    1K    FraunchPad w/ msp430fr5739
          lpmsp430f5529         msp430f5529   16MHz     128K   1K    LaunchPad w/ msp430f5529 (16MHz)
          lpmsp430f5529_25      msp430f5529   25MHz     128K   1K    LaunchPad w/ msp430f5529 (25MHz)
          lpmsp430fr5969        msp430fr5969  8MHz      64K    1K    LaunchPad w/ msp430fr5969
          lpmsp430g2231         msp430g2231   1MHz      2K     128B   LaunchPad w/ msp430g2231 (1MHz)
          lpmsp430g2452         msp430g2452   16MHz     8K     256B   LaunchPad w/ msp430g2452 (16MHz)
          lpmsp430g2553         msp430g2553   16MHz     16K    512B   LaunchPad w/ msp430g2553 (16MHz)

   platformio check
       Helper command for piocheck.

   Contentsplatformio checkUsageDescriptionOptionsExamples

   Usage
          platformio check [OPTIONS]
          pio check [OPTIONS]

   Description
       Perform  static  analysis check on PlatformIO based project. By default check_tool_cppcheck analysis tool
       is used.

       More details about PlatformIO piocheck.

   Options
       -e, --environment

       Process specified environments.

       --pattern

       You can specify which source files or folders should be included/excluded from check process. By  default
       only  projectconf_pio_src_dir and projectconf_pio_include_dir are checked. Multiple --pattern options and
       GLOB Patterns are allowed.

       Example: platformio check --pattern="tests" --pattern="src/*.cpp"

       --flags

       Specify additional flags that need to  be  passed  to  the  analysis  tool.  If  multiple  tools  set  in
       projectconf_check_tool  option,  the flags are passed to all of them.  Individual flags for each tool can
       be added using a special suffix with the tool name.

                                    ┌────────────────┬─────────────────────────────┐
                                    │Flag            │ Meaning                     │
                                    ├────────────────┼─────────────────────────────┤
                                    │--addon=<addon> │ Execute addon. i.e. cert.   │
                                    ├────────────────┼─────────────────────────────┤
                                    │-D<ID>          │ Define preprocessor symbol. │
                                    └────────────────┴─────────────────────────────┘

       Multiple --flags options are allowed.

       Example: platformio check --flags "-DDEBUG cppcheck: --std=c++11 --platform=avr8"

       --severity

       Specify the check_severity types which will be reported by the check_tools.  Possible values described in
       check_severity section. Multiple --severity options are allowed.

       Example: platformio check --severity=high

       -d, --project-dir

       Specify  the  path  to  project  directory.  By  default,  --project-dir  is equal to the current working
       directory (CWD).

       -c, --project-conf

       Process project with a custom projectconf.

       --json-output

       Return the output in JSON format.

       --fail-on-defect

       Fail (exit with non-zero code) if there is a defect found with specified severity. By default  exit  code
       is  the same as the exit code returned by a tool selected for performing check. Possible values described
       in check_severity section. Multiple --fail-on-defect options are allowed.

       Example: platformio check --fail-on-defect=low --fail-on-defect=medium

       -s, --silent

       Suppress progress reporting and show only defects with high severity.  See check_severity.

       -v, --verbose

       Show detailed information when processing environments.

       This option can also be set globally using  setting_force_verbose  setting  or  by  environment  variable
       PLATFORMIO_SETTING_FORCE_VERBOSE.

   Examples
       For the examples please follow to piocheck page.

   platformio ci
   Contentsplatformio ciUsageDescriptionOptionsExamples

   Usage
          platformio ci [OPTIONS] [SRC]
          pio ci [OPTIONS] [SRC]

   Description
       platformio  ci  command  is  conceived  of  as  "hot key" for building project with arbitrary source code
       structure. In a nutshell,  using  SRC  and  platformio  ci  --lib  contents  PlatformIO  initializes  via
       cmd_project_init  new  project in platformio ci --build-dir with the build environments (using platformio
       ci --board or platformio ci --project-conf) and processes them via cmd_run command.

       platformio ci command accepts multiple SRC arguments, platformio ci --lib  and  platformio  ci  --exclude
       options  which can be a path to directory, file or Glob Pattern.  Also, you can omit SRC argument and set
       path (multiple paths are allowed denoting with :) to PLATFORMIO_CI_SRC Environment variable

       For more details as for integration with the popular Continuous Integration Systems please follow  to  ci
       page.

       NOTE:
          platformio  ci  command  is  useful  for library developers. It allows one to build different examples
          without creating own project per them. Also, is possible to upload firmware to the target  device.  In
          this case, you need to pass additional option --project-option="targets=upload". What is more, you can
          specify custom upload port using  --project-option="upload_port=<port>"  option.   See  platformio  ci
          --project-option for details.

   Options
       -l, --lib

       Source code which will be copied to <BUILD_DIR>/lib directly.

       If  platformio  ci  --lib  is  a  path  to file (not to directory), then PlatformIO will create temporary
       directory within <BUILD_DIR>/lib and copy the rest files into it.

       --exclude

       Exclude directories and/-or files from platformio ci --build-dir. The path must be relative to PlatformIO
       project within platformio ci --build-dir.

       For example, exclude from project src directory:

       • examples folder

       • *.h files from foo folder

          platformio ci --exclude=src/examples --exclude=src/foo/*.h [SRC]

       -b, --board

       Build project with automatically pre-generated environments based on board settings.

       For more details please look into platformio project init --board.

       --build-dir

       Path  to  directory  where  PlatformIO  will  initialise new project. By default it's temporary directory
       within your operating system.

       NOTE:
          This directory will be removed at the end of build process.  If  you  want  to  keep  it,  please  use
          platformio ci --keep-build-dir.

       --keep-build-dir

       Don't remove platformio ci --build-dir after build process.

       -c, --project-conf

       Build project using pre-configured projectconf.

       -O, --project-option

       Pass additional options from projectconf to cmd_project_init command.  For example, automatically install
       dependent libraries platformio ci  --project-option="lib_deps=ArduinoJSON"  or  ignore  specific  library
       platformio ci --project-option="lib_ignore=SomeLib".

       NOTE:
          Use  multiple  --project-option  to pass multiple options to projectconf. One option per one argument.
          For     example,     platformio      ci      --project-option="build_unflags      =      -std=gnu++11"
          --project-option="build_flags = -std=c++14"

       -v, --verbose

       Shows detailed information when processing environments.

       This  option  can  also  be  set  globally using setting_force_verbose setting or by environment variable
       PLATFORMIO_SETTING_FORCE_VERBOSE.

   Examples
       For the others examples please follow to ci page.

   platformio debug
       Helper command for piodebug.

   Contentsplatformio debugUsageDescriptionOptionsExamples

   Usage
          platformio debug [OPTIONS]
          pio debug [OPTIONS]

          # A binary shortcut for "platformio debug --interface=gdb" command
          piodebuggdb [GDB OPTIONS]

   Description
       Prepare PlatformIO project for debugging or launch debug server.

   Options
       -e, --environment

       Debug specified environments.

       You  can  also  specify  which  environments  should   be   used   for   debugging   by   default   using
       projectconf_pio_default_envs option from projectconf.

       -d, --project-dir

       Specify  the  path  to  a  project  directory.  By  default,  --project-dir is equal to a current working
       directory (CWD).

       -c, --project-conf

       New in version 4.0.

       Process project with a custom projectconf.

       --interface

       PIO Debugging Interface. Valid values:

       • gdb - GDB: The GNU Project Debugger

       -v, --verbose

       Shows detailed information when processing environments.

       This option can also be set globally using  setting_force_verbose  setting  or  by  environment  variable
       PLATFORMIO_SETTING_FORCE_VERBOSE.

   Examples
       1. Prepare a project for debugging

          > platformio debug

          [Sun Apr 30 01:34:01 2017] Processing mzeropro (platform: atmelsam; debug_extra_cmds: b main.cpp:26; board: mzeropro; framework: arduino)
          -----------------------------------------------------------------------------------------------
          Verbose mode can be enabled via `-v, --verbose` option
          Collected 26 compatible libraries
          Looking for dependencies...
          Project does not have dependencies
          Compiling .pio/build/mzeropro/src/main.o
          Compiling .pio/build/mzeropro/FrameworkArduinoVariant/variant.o
          Compiling .pio/build/mzeropro/FrameworkArduino/IPAddress.o
          Compiling .pio/build/mzeropro/FrameworkArduino/Print.o
          Archiving .pio/build/mzeropro/libFrameworkArduinoVariant.a
          Indexing .pio/build/mzeropro/libFrameworkArduinoVariant.a
          ...
          Compiling .pio/build/mzeropro/FrameworkArduino/wiring_analog.o
          Compiling .pio/build/mzeropro/FrameworkArduino/wiring_digital.o
          Compiling .pio/build/mzeropro/FrameworkArduino/wiring_private.o
          Compiling .pio/build/mzeropro/FrameworkArduino/wiring_shift.o
          Archiving .pio/build/mzeropro/libFrameworkArduino.a
          Indexing .pio/build/mzeropro/libFrameworkArduino.a
          Linking .pio/build/mzeropro/firmware.elf
          Calculating size .pio/build/mzeropro/firmware.elf
          Building .pio/build/mzeropro/firmware.bin
          text       data     bss     dec     hex filename
          11512       256    1788   13556    34f4 .pio/build/mzeropro/firmware.elf
          =========================== [SUCCESS] Took 7.82 seconds ===========================

       2. Launch GDB instance and load initial configuration per a project

          > platformio debug --interface=gdb -x .pioinit

          ...
          Loading section .text, size 0x2c98 lma 0x4000
          Loading section .ramfunc, size 0x60 lma 0x6c98
          Loading section .data, size 0x100 lma 0x6cf8
          Start address 0x47b0, load size 11768
          Transfer rate: 4 KB/sec, 3922 bytes/write.
          target halted due to debug-request, current mode: Thread
          xPSR: 0x81000000 pc: 0x000028f4 msp: 0x20002c00
          target halted due to debug-request, current mode: Thread
          xPSR: 0x81000000 pc: 0x000028f4 msp: 0x20002c00
          Breakpoint 2 at 0x413a: file src/main.cpp, line 26.

   Device Manager CLI
       To print all available commands and options use:

          pio device --help
          platformio device --help
          platformio device COMMAND --help

   platformio device list
   Contentsplatformio device listUsageDescriptionOptionsExamples

   Usage
          platformio device list [OPTIONS]
          pio device list [OPTIONS]

   Description
       List available devices.  Default is set to --serial and all available Serial Ports will be shown.

   Options
       --serial

       List available Serial Ports, default.

       --logical

       List available logical devices.

       --mdns

       List multicast DNS services.

       --json-output

       Return the output in JSON format.

   Examples
       1. Unix OS

          $ platformio device list
          /dev/cu.SLAB_USBtoUART
          ----------
          Hardware ID: USB VID:PID=10c4:ea60 SNR=0001
          Description: CP2102 USB to UART Bridge Controller

          /dev/cu.uart-1CFF4676258F4543
          ----------
          Hardware ID: USB VID:PID=451:f432 SNR=1CFF4676258F4543
          Description: Texas Instruments MSP-FET430UIF

       2. Windows OS

          $ platformio device list
          COM4
          ----------
          Hardware ID: USB VID:PID=0451:F432
          Description: MSP430 Application UART (COM4)

          COM3
          ----------
          Hardware ID: USB VID:PID=10C4:EA60 SNR=0001
          Description: Silicon Labs CP210x USB to UART Bridge (COM3)

       3. List multicast DNS services and logical devices

          $ platformio device list --mdns --logical
          Multicast DNS Services
          ======================

          PlatformIO._bttremote._tcp.local.
          ------------------------------
          Type: _bttremote._tcp.local.
          IP: ...
          Port: 62941
          Properties: ...

          Time for PlatformIO._adisk._tcp.local.
          ---------------------------------
          Type: _adisk._tcp.local.
          IP: 192.168.0.1
          Port: 9
          Properties: ...

          PlatformIO._ssh._tcp.local.
          ------------------------
          Type: _ssh._tcp.local.
          IP: ...
          Port: 22

          PlatformIO._sftp-ssh._tcp.local.
          -----------------------------
          Type: _sftp-ssh._tcp.local.
          IP: ...
          Port: 22

          Logical Devices
          ===============
          /
          -
          Name:

          /Volumes/PIO
          -------------
          Name: PIO

          /Volumes/PLUS
          --------------
          Name: PLUS

   platformio device monitor
   Contentsplatformio device monitorUsageDescriptionOptionsFiltersCapture output to a fileDevice Monitor Filter APIExamples

   Usage
          platformio device monitor [OPTIONS]

   Description
       This  is  a  console  application that provides a small terminal application. It is based on Miniterm and
       itself does not implement any terminal features such as VT102 compatibility. However  it  inherits  these
       features  from the terminal it is run. For example on GNU/Linux running from an xterm it will support the
       escape sequences of the xterm. On Windows the typical console window is dumb and  does  not  support  any
       escapes. When ANSI.sys is loaded it supports some escapes.

       Miniterm   supports   RFC  2217  remote  serial  ports  and  raw  sockets  using  URL  Handlers  such  as
       rfc2217://<host>:<port> respectively socket://<host>:<port> as port argument when invoking.

       To control monitor please use these "hot keys":

       • Ctrl+C Quit

       • Ctrl+T Menu

       • Ctrl+T followed by Ctrl+H Help

   Options
       -p, --port

       Port, a number or a device name, or valid URL Handlers.

       Can be customized in projectconf using projectconf_monitor_port option.

       URL Handlersrfc2217://<host>:<port>[?<option>[&<option>...]]socket://<host>:<port>[?logging={debug|info|warning|error}]loop://[?logging={debug|info|warning|error}]hwgrep://<regexp>[&skip_busy][&n=N]spy://port[?option[=value][&option[=value]]]alt://port?class=<classname>

       -b, --baud

       Set baud rate, default 9600.

       Can be customized in projectconf using projectconf_monitor_speed option.

       --parity

       Set parity (None, Even, Odd, Space, Mark), one of [N, E, O, S, M], default N

       --rtscts

       Enable RTS/CTS flow control, default Off

       --xonxoff

       Enable software flow control, default Off

       --rts

       Set initial RTS line state (0 or 1).

       Can be customized in projectconf using projectconf_monitor_rts option.

       --dtr

       Set initial DTR line state (0 or 1).

       Can be customized in projectconf using projectconf_monitor_dtr option.

       --echo

       Enable local echo, default Off

       --encoding

       Set the encoding for the serial port (e.g. hexlify, Latin1, UTF-8), default UTF-8.

       -f, --filter

       Add text transformation. See available filters at Filters.

       --eol

       End of line mode (CR, LF or CRLF), default CRLF

       NEW: Available in Miniterm/PySerial 3.0

       --raw

       Do not apply any encodings/transformations

       --exit-char

       ASCII code of special character that is used to exit the application, default 3 (DEC, Ctrl+C).

       For example, to use Ctrl+] run platformio device monitor --exit-char 29.

       --menu-char

       ASCII code of special character that is used to control miniterm (menu), default 20 (DEC)

       ---quiet

       Diagnostics: suppress non-error messages, default Off

       -d, --project-dir

       Specify the path to project directory. By default, --project-dir is equal to  current  working  directory
       (CWD).

       -e, --environment

       Process specified environments.

       You can also specify which environments should be processed by default using projectconf_pio_default_envs
       option from projectconf.

   Filters
       New in version 4.3.

       A list of filters that can be applied for monitor output using  platformio  device  monitor  --filter  or
       projectconf and projectconf_monitor_filters options.  option.

                         ┌──────────────────────────┬────────────────────────────────────────┐
                         │Name                      │ Description                            │
                         └──────────────────────────┴────────────────────────────────────────┘

                         │default                   │ Remove typical terminal control codes  │
                         │                          │ from input                             │
                         ├──────────────────────────┼────────────────────────────────────────┤
                         │colorize                  │ Apply different colors  for  received  │
                         │                          │ and echo                               │
                         ├──────────────────────────┼────────────────────────────────────────┤
                         │debug                     │ Print what is sent and received        │
                         ├──────────────────────────┼────────────────────────────────────────┤
                         │direct                    │ Do-nothing:    forward    all    data  │
                         │                          │ unchanged                              │
                         ├──────────────────────────┼────────────────────────────────────────┤
                         │hexlify                   │ Show a hexadecimal representation  of  │
                         │                          │ the   data   (code   point   of  each  │
                         │                          │ character)                             │
                         ├──────────────────────────┼────────────────────────────────────────┤
                         │log2file                  │ Log     data      to      a      file  │
                         │                          │ "platformio-device-monitor-%date%.log" │
                         │                          │ located  in   the   current   working  │
                         │                          │ directory                              │
                         ├──────────────────────────┼────────────────────────────────────────┤
                         │nocontrol                 │ Remove all control codes, incl. CR+LF  │
                         ├──────────────────────────┼────────────────────────────────────────┤
                         │printable                 │ Show  decimal  code  for all non-ASCII │
                         │                          │ characters and  replace  most  control │
                         │                          │ codes                                  │
                         ├──────────────────────────┼────────────────────────────────────────┤
                         │time                      │ Add  timestamp  with  milliseconds for │
                         │                          │ each new line                          │
                         ├──────────────────────────┼────────────────────────────────────────┤
                         │send_on_enter             │ Send a text to device on ENTER         │
                         ├──────────────────────────┼────────────────────────────────────────┤
                         │esp32_exception_decoder   │ Custom filter for platform_espressif32 │
                         │                          │ which decodes crash exception          │
                         ├──────────────────────────┼────────────────────────────────────────┤
                         │esp8266_exception_decoder │ Custom            filter           for │
                         │                          │ platform_espressif8266  which  decodes │
                         │                          │ crash exception                        │
                         └──────────────────────────┴────────────────────────────────────────┘

   Capture output to a file
       New in version 4.3.

       You need to use a log2file filter from Filters:

          $ platformio device monitor -f log2file -f default

       or using projectconf and projectconf_monitor_filters

          [env:log_output_to_file]
          ...
          platform = ...
          monitor_filters = log2file, default

   Device Monitor Filter API
       piocore  provides  an  API  to extend device monitor with a custom filter declared in "monitor" folder of
       platforms. See examples:

       • https://github.com/platformio/platform-espressif32/tree/develop/monitorhttps://github.com/platformio/platform-espressif8266/tree/develop/monitor

   Examples
       1. Show available options for monitor

          $ platformio device monitor --help
          Usage: platformio device monitor [OPTIONS]

          Options:
            -p, --port TEXT       Port, a number or a device name
            -b, --baud INTEGER    Set baud rate, default=9600
            --parity [N|E|O|S|M]  Set parity, default=N
            --rtscts              Enable RTS/CTS flow control, default=Off
            --xonxoff             Enable software flow control, default=Off
            --rts [0|1]           Set initial RTS line state, default=0
            --dtr [0|1]           Set initial DTR line state, default=0
            --echo                Enable local echo, default=Off
            --encoding TEXT       Set the encoding for the serial port (e.g. hexlify,
                                  Latin1, UTF-8), default: UTF-8
            -f, --filter TEXT     Add filters / text transformation
            --eol [CR|LF|CRLF]    End of line mode, default=CRLF
            --raw                 Do not apply any encodings/transformations
            --exit-char INTEGER   ASCII code of special character that is used to exit
                                  the application, default=29 (DEC)
            --menu-char INTEGER   ASCII code of special character that is used to
                                  control miniterm (menu), default=20 (DEC)
            --quiet               Diagnostics: suppress non-error messages, default=Off
            -h, --help            Show this message and exit.

       2. Communicate with serial device and print help inside terminal

          $ platformio device monitor

          --- Available ports:
          --- /dev/cu.Bluetooth-Incoming-Port n/a
          --- /dev/cu.Bluetooth-Modem n/a
          --- /dev/cu.SLAB_USBtoUART CP2102 USB to UART Bridge Controller
          --- /dev/cu.obd2ecu-SPPDev n/a
          Enter port name:/dev/cu.SLAB_USBtoUART
          --- Miniterm on /dev/cu.SLAB_USBtoUART: 9600,8,N,1 ---
          --- Quit: Ctrl+C  |  Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
          Hello PlatformIO!
          ---
          --- Ctrl+]   Exit program
          --- Ctrl+T   Menu escape key, followed by:
          --- Menu keys:
          ---    Ctrl+T  Send the menu character itself to remote
          ---    Ctrl+]  Send the exit character itself to remote
          ---    Ctrl+I  Show info
          ---    Ctrl+U  Upload file (prompt will be shown)
          --- Toggles:
          ---    Ctrl+R  RTS          Ctrl+E  local echo
          ---    Ctrl+D  DTR          Ctrl+B  BREAK
          ---    Ctrl+L  line feed    Ctrl+A  Cycle repr mode
          ---
          --- Port settings (Ctrl+T followed by the following):
          ---    p          change port
          ---    7 8        set data bits
          ---    n e o s m  change parity (None, Even, Odd, Space, Mark)
          ---    1 2 3      set stop bits (1, 2, 1.5)
          ---    b          change baud rate
          ---    x X        disable/enable software flow control
          ---    r R        disable/enable hardware flow control
          --- exit ---

   platformio home
       Helper command for piohome.

   Contentsplatformio homeUsageDescriptionOptionsExamples

   Usage
          platformio home
          pio home

   Description
       Launch piohome Web-server.

   Options
       --port

       Web-server HTTP port, default is 8008.

       --host

       Web-server HTTP host, default is 127.0.0.1.  You can open PIO Home for  inbound  connections  using  host
       0.0.0.0.

       --no-open

       Do not automatically open PIO Home in a system Web-browser.

       --shutdown-timeout

       Automatically  shutdown server on timeout (in seconds) when no clients are connected.  Default is 0 which
       means never auto shutdown.

   Examples
          > platformio home

            ___I_
           /\-_--\   PlatformIO Home
          /  \_-__\
          |[]| [] |  http://127.0.0.1:8008
          |__|____|_______________________

          Open PIO Home in your browser by this URL => http://127.0.0.1:8008
          PIO Home has been started. Press Ctrl+C to shutdown.

   Library Manager CLI
   Usage
          platformio lib [OPTIONS] COMMAND

          # To print all available commands and options use
          platformio lib --help
          platformio lib COMMAND --help

   Options
       -d, --storage-dir

       Manage custom library storage. It can be  used  later  for  the  projectconf_lib_extra_dirs  option  from
       projectconf.  Multiple options are allowed.

       -g, --global

       Manage  global  PlatformIO's  library  storage  ( "projectconf_pio_core_dir/lib") where ldf will look for
       dependencies by default.

       -e, --environment

       Manage libraries for  the  specific  project  build  environments  declared  in  projectconf.  Works  for
       --storage-dir which is valid PlatformIO project.

   Demo
       [image]

   Commands
   platformio lib builtin
   Contentsplatformio lib builtinUsageDescriptionOptionsExamples

   Usage
          platformio lib builtin [OPTIONS]
          pio lib builtin [OPTIONS]

   Description
       List built-in libraries based on installed platforms and their frameworks, SDKs, etc.

   Options
       --storage

       List libraries from specified storages. For example, framework-arduinoavr.

       --json-output

       Return the output in JSON format

   Examples
          > platformio lib builtin

          framework-arduinoavr
          ********************

          Bridge
          ======
          Enables the communication between the Linux processor and the microcontroller. For Arduino/Genuino Yún, Yún Shield and TRE only.

          Version: 1.6.1
          Homepage: http://www.arduino.cc/en/Reference/YunBridgeLibrary
          Keywords: communication
          Compatible frameworks: arduino
          Compatible platforms: *
          Authors: Arduino

          EEPROM
          ======
          Enables reading and writing to the permanent board storage.

          Version: 2.0
          Homepage: http://www.arduino.cc/en/Reference/EEPROM
          Keywords: data, storage
          Compatible frameworks: arduino
          Compatible platforms: atmelavr
          Authors: Arduino, Christopher Andrews

          ...

          framework-arduinosam
          ********************

          Audio
          =====
          Allows playing audio files from an SD card. For Arduino DUE only.

          Version: 1.0
          Homepage: http://arduino.cc/en/Reference/Audio
          Keywords: signal, input, output
          Compatible frameworks: arduino
          Compatible platforms: atmelsam
          Authors: Arduino

          ...

          framework-arduinoespressif32
          ****************************

          SPI
          ===
          Enables the communication with devices that use the Serial Peripheral Interface (SPI) Bus. For all Arduino boards, BUT Arduino DUE.

          Version: 1.0
          Homepage: http://arduino.cc/en/Reference/SPI
          Keywords: signal, input, output
          Compatible frameworks: arduino
          Compatible platforms:
          Authors: Hristo Gochkov

          ...

          framework-arduinoespressif8266
          ******************************

          ArduinoOTA
          ==========
          Enables Over The Air upgrades, via wifi and espota.py UDP request/TCP download.

          Version: 1.0
          Keywords: communication
          Compatible frameworks: arduino
          Compatible platforms: espressif8266
          Authors: Ivan Grokhotkov and Miguel Angel Ajo

          DNSServer
          =========
          A simple DNS server for ESP8266.

          Version: 1.1.0
          Keywords: communication
          Compatible frameworks: arduino
          Compatible platforms: espressif8266
          Authors: Kristijan Novoselić

          ...

          framework-arduinointel
          **********************

          Adafruit NeoPixel
          =================
          Arduino library for controlling single-wire-based LED pixels and strip.

          Version: 1.0.3
          Homepage: https://github.com/adafruit/Adafruit_NeoPixel
          Keywords: display
          Compatible frameworks: arduino
          Compatible platforms: *
          Authors: Adafruit

          CurieBLE
          ========
          Library to manage the Bluetooth Low Energy module with Curie Core boards.

          Version: 1.0
          Keywords: communication
          Compatible frameworks: arduino
          Compatible platforms: intel_arc32
          Authors: Emutex

          CurieEEPROM
          ===========
          Enables reading and writing to OTP flash area of Curie

          Version: 1.0
          Homepage: http://www.arduino.cc/en/Reference/EEPROM
          Keywords: data, storage
          Compatible frameworks: arduino
          Compatible platforms: intel_arc32
          Authors: Intel

          ...

          framework-arduinomicrochippic32
          *******************************

          Firmata
          =======
          Enables the communication with computer apps using a standard serial protocol. For all Arduino boards.

          Version: 2.4.4
          Homepage: https://github.com/firmata/arduino
          Keywords: device, control
          Compatible frameworks: arduino
          Compatible platforms: *
          Authors: Firmata Developers

          framework-arduinoteensy
          ***********************

          Adafruit CC3000 Library
          =======================
          Library code for Adafruit's CC3000 WiFi breakouts.

          Version: 1.0.1
          Homepage: https://github.com/adafruit/Adafruit_CC3000_Library
          Keywords: communication
          Compatible frameworks: arduino
          Compatible platforms: *
          Authors: Adafruit

          ...

          framework-energiamsp430
          ***********************

          AIR430BoostEuropeETSI
          =====================
          Library for the CC110L Sub-1GHz radio BoosterPack for use in Europe

          Version: 1.0.0
          Homepage: http://energia.nu/reference/libraries/
          Keywords: communication
          Compatible frameworks: arduino
          Compatible platforms:
          Authors: Energia

          ...

          framework-energiativa
          *********************

          aJson
          =====
          An Arduino library to enable JSON processing with Arduino

          Keywords: json, rest, http, web
          Compatible frameworks: arduino
          Compatible platforms: atmelavr

   platformio lib install
   Contentsplatformio lib installUsageDescriptionStorage OptionsOptionsVersion controlGitMercurialSubversionExamples

   Usage
          platformio lib [STORAGE_OPTIONS] install [OPTIONS] [LIBRARY...]
          pio lib [STORAGE_OPTIONS] install [OPTIONS] [LIBRARY...]

          # install all project dependencies declared via "lib_deps"
          # (run it from a project root where is located "platformio.ini")
          platformio lib install [OPTIONS]

          # install project dependent library
          # (run it from a project root where is located "platformio.ini")
          platformio lib install [OPTIONS] [LIBRARY...]

          # install dependencies for the specific project build environment
          # (run it from a project root where is located "platformio.ini")
          platformio lib -e myenv install [OPTIONS] [LIBRARY...]
          platformio lib -d /path/to/platformio/project -e myenv install [OPTIONS] [LIBRARY...]

          # install to global storage
          platformio lib --global install [OPTIONS] [LIBRARY...]
          platformio lib -g install [OPTIONS] [LIBRARY...]

          # install to custom storage
          platformio lib --storage-dir /path/to/dir install [OPTIONS] [LIBRARY...]
          platformio lib -d /path/to/dir1 -d /path/to/dir2 install [OPTIONS] [LIBRARY...]

          # [LIBRARY...] forms
          platformio lib [STORAGE_OPTIONS] install (with no args, project dependencies)
          platformio lib [STORAGE_OPTIONS] install <id>
          platformio lib [STORAGE_OPTIONS] install id=<id>
          platformio lib [STORAGE_OPTIONS] install <id>@<version>
          platformio lib [STORAGE_OPTIONS] install <id>@<version range>
          platformio lib [STORAGE_OPTIONS] install <name>
          platformio lib [STORAGE_OPTIONS] install <name>@<version>
          platformio lib [STORAGE_OPTIONS] install <name>@<version range>
          platformio lib [STORAGE_OPTIONS] install <zip or tarball url>
          platformio lib [STORAGE_OPTIONS] install file://<zip or tarball file>
          platformio lib [STORAGE_OPTIONS] install file://<folder>
          platformio lib [STORAGE_OPTIONS] install <repository>
          platformio lib [STORAGE_OPTIONS] install <name>=<repository> (name it should have locally)
          platformio lib [STORAGE_OPTIONS] install <repository#tag> ("tag" can be commit, branch or tag)

       WARNING:
          If  some  libraries  are  not  visible  in  pioide  and  Code Completion or Code Linting does not work
          properly, please perform

          • Atom: "Menu: PlatformIO > Rebuild C/C++ Project Index (Autocomplete, Linter)"

          • VSCode: "Menu: View > Command Palette... > PlatformIO: Rebuild C/C++ Project Index"

   Description
       Install a library, and any libraries that it depends on using:

       1. Library id or name from PlatformIO Library Registry

       2. Custom folder, repository or archive.

       The version supports Semantic Versioning ( <major>.<minor>.<patch>) and can take  any  of  the  following
       forms:

       • 1.2.3 - an exact version number. Use only this exact version

       • ^1.2.3 - any compatible version (exact version for 1.x.x versions)

       • ~1.2.3 - any version with the same major and minor versions, and an equal or greater patch version

       • >1.2.3 - any version greater than 1.2.3. >=, <, and <= are also possible

       • >0.1.0,!=0.2.0,<0.3.0 - any version greater than 0.1.0, not equal to 0.2.0 and less than 0.3.0

       PlatformIO  supports  installing from local directory or archive. Need to use file:// prefix before local
       path. Also, directory or archive should contain .library.json manifest (see library_config).

       • file:///local/path/to/the/platform/dirfile:///local/path/to/the/platform.zipfile:///local/path/to/the/platform.tar.gz

   Storage Options
       See base options for cmd_lib.

   Options
       --save

       Save installed libraries into the projectconf dependency list (projectconf_lib_deps).

       You can save libraries  for  the  specific  project  environment  using  -e,  --environment  option  from
       platformio lib command. For example, platformio lib -e myenv install [LIBRARY...].

       -s, --silent

       Suppress progress reporting

       --interactive

       Allow one to make a choice for all prompts

       -f, --force

       Reinstall/redownload library if it exists

   Version control
       PlatformIO  supports installing from Git, Mercurial and Subversion, and detects the type of VCS using url
       prefixes: "git+", "hg+", or "svn+".

       NOTE:
          PlatformIO requires a working VCS command on your path: git, hg or svn.

   Git
       The supported schemes are: git, git+https and git+ssh. Here are the supported forms:

       • user/library (short version for GitHub repository)

       • https://github.com/user/library.git

       • git+git://git.server.org/my-library

       • git+https://git.server.org/my-library

       • git+ssh://git.server.org/my-library

       • git+ssh://user@git.server.org/my-library

       • [user@]host.xz:path/to/repo.git

       Passing branch names, a commit hash or a tag name is possible like so:

       • https://github.com/user/library.git#master

       • git+git://git.server.org/my-library#master

       • git+https://git.server.org/my-library#v1.0

       • git+ssh://git.server.org/my-library#7846d8ad52f983f2f2887bdc0f073fe9755a806d

   Mercurial
       The supported schemes are: hg+http, hg+https and hg+ssh. Here are the supported forms:

       • https://developer.mbed.org/users/user/code/library/ (install ARM mbed library)

       • hg+hg://hg.server.org/my-library

       • hg+https://hg.server.org/my-library

       • hg+ssh://hg.server.org/my-library

       Passing branch names, a commit hash or a tag name is possible like so:

       • hg+hg://hg.server.org/my-library#master

       • hg+https://hg.server.org/my-library#v1.0

       • hg+ssh://hg.server.org/my-library#4cfe2fa00668

   Subversion
       The supported schemes are: svn, svn+svn, svn+http, svn+https and svn+ssh. Here are the supported forms:

       • svn+svn://svn.server.org/my-library

       • svn+https://svn.server.org/my-library

       • svn+ssh://svn.server.org/my-library

       You can also give specific revisions to an SVN URL, like so:

       • svn+svn://svn.server.org/my-library#13

   Examples
       1. Install the latest version of library to a global storage using ID or NAME

          > platformio lib -g install 4

          Library Storage: /storage/dir/...
          LibraryManager: Installing id=4
          Downloading  [####################################]  100%
          Unpacking  [####################################]  100%
          IRremote @ 2.2.1 has been successfully installed!

          # repeat command with name
          > platformio lib -g install IRRemote

          Library Storage: /storage/dir/...
          Looking for IRRemote library in registry
          Found: https://platformio.org/lib/show/4/IRremote
          LibraryManager: Installing id=4
          IRremote @ 2.2.1 is already installed

       2. Install specified version of a library to a global storage

          > platformio lib -g install ArduinoJson@5.6.7

          Library Storage: /storage/dir/...
          Looking for ArduinoJson library in registry
          Found: https://platformio.org/lib/show/64/ArduinoJson
          LibraryManager: Installing id=64 @ 5.6.7
          Downloading  [####################################]  100%
          Unpacking  [####################################]  100%
          ArduinoJson @ 5.6.7 has been successfully installed!

       3. Install library with dependencies to custom storage

          > platformio lib --storage-dir /my/storage/dir install DallasTemperature

          Library Storage: /my/storage/dir
          Looking for DallasTemperature library in registry
          Found: https://platformio.org/lib/show/54/DallasTemperature
          LibraryManager: Installing id=54
          Downloading  [####################################]  100%
          Unpacking  [####################################]  100%
          DallasTemperature @ 3.7.7 has been successfully installed!
          Installing dependencies
          Looking for OneWire library in registry
          Found: https://platformio.org/lib/show/1/OneWire
          LibraryManager: Installing id=1
          Downloading  [####################################]  100%
          Unpacking  [####################################]  100%
          OneWire @ 8fd2ebfec7 has been successfully installed!

       4. Install ARM mbed library to the global storage

          > platformio lib -g install https://developer.mbed.org/users/simon/code/TextLCD/

          Library Storage: /storage/dir/...
          LibraryManager: Installing TextLCD
          Mercurial Distributed SCM (version 3.8.4)
          (see https://mercurial-scm.org for more information)

          Copyright (C) 2005-2016 Matt Mackall and others
          This is free software; see the source for copying conditions. There is NO
          warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
          requesting all changes
          adding changesets
          adding manifests
          adding file changes
          added 9 changesets with 18 changes to 6 files
          updating to branch default
          2 files updated, 0 files merged, 0 files removed, 0 files unresolved
          TextLCD @ 308d188a2d3a has been successfully installed!

       5. Install from archive using URL

          > platformio lib -g install  https://github.com/adafruit/DHT-sensor-library/archive/master.zip

          Library Storage: /storage/dir/...
          LibraryManager: Installing master
          Downloading  [####################################]  100%
          Unpacking  [####################################]  100%
          DHT sensor library @ 1.2.3 has been successfully installed!

   platformio lib list
   Contentsplatformio lib listUsageDescriptionStorage OptionsOptionsExamples

   Usage
          platformio lib [STORAGE_OPTIONS] list [OPTIONS]
          pio lib [STORAGE_OPTIONS] list [OPTIONS]

          # list project dependent libraries
          # (run it from a project root where is located "platformio.ini")
          platformio lib list [OPTIONS]

          # list libraries from global storage
          platformio lib --global list [OPTIONS]
          platformio lib -g list [OPTIONS]

          # list libraries from custom storage
          platformio lib --storage-dir /path/to/dir list [OPTIONS]
          platformio lib -d /path/to/dir list [OPTIONS]

   Description
       List installed libraries

   Storage Options
       See base options for cmd_lib.

   Options
       --json-output

       Return the output in JSON format

   Examples
          > platformio lib -g list

          Library Storage: /storage/dir/...

          Adafruit Unified Sensor
          =======================
          #ID: 31
          Required for all Adafruit Unified Sensor based libraries.

          Version: 1.0.2
          Keywords: sensors
          Compatible frameworks: arduino
          Compatible platforms: atmelavr, atmelsam, espressif8266, intel_arc32, microchippic32, nordicnrf51, teensy, timsp430
          Authors: Adafruit

          ArduinoJson
          ===========
          #ID: 64
          An elegant and efficient JSON library for embedded systems

          Version: 5.8.0
          Keywords: web, json, http, rest
          Compatible frameworks: arduino
          Compatible platforms: atmelavr, atmelsam, espressif8266, intel_arc32, microchippic32, nordicnrf51, teensy, timsp430
          Authors: Benoit Blanchon

          ArduinoJson
          ===========
          #ID: 64
          An elegant and efficient JSON library for embedded systems

          Version: 5.6.7
          Keywords: web, json, http, rest
          Compatible frameworks: arduino
          Compatible platforms: atmelavr, atmelsam, espressif8266, intel_arc32, microchippic32, nordicnrf51, teensy, timsp430
          Authors: Benoit Blanchon

          ArduinoJson
          ===========
          #ID: 64
          An elegant and efficient JSON library for embedded systems

          Version: 5.7.2
          Keywords: web, json, http, rest
          Compatible frameworks: arduino
          Compatible platforms: atmelavr, atmelsam, espressif8266, intel_arc32, microchippic32, nordicnrf51, teensy, timsp430
          Authors: Benoit Blanchon

          Blynk
          =====
          #ID: 415
          Build a smartphone app for your project in minutes. Blynk allows creating IoT solutions easily. It supports  WiFi, BLE, Bluetooth, Ethernet, GSM, USB, Serial. Works with many boards like ESP8266, ESP32, Arduino UNO, Nano, Due, Mega, Zero, MKR100, Yun, Raspberry Pi, Particle, Energia, ARM mbed, Intel Edison/Galileo/Joule, BBC micro:bit, DFRobot, RedBearLab, Microduino, LinkIt ONE ...

          Version: 0.4.3
          Homepage: http://blynk.cc
          Keywords: control, gprs, protocol, communication, app, bluetooth, serial, cloud, web, usb, m2m, ble, 3g, smartphone, http, iot, device, sensors, data, esp8266, mobile, wifi, ethernet, gsm
          Compatible frameworks: energia, wiringpi, arduino
          Compatible platforms: atmelavr, atmelsam, espressif8266, intel_arc32, linux_arm, microchippic32, nordicnrf51, teensy, timsp430, titiva
          Authors: Volodymyr Shymanskyy

          Bounce2
          =======
          #ID: 1106
          Debouncing library for Arduino or Wiring

          Version: 2.1
          Keywords: input, signal, output, bounce
          Compatible frameworks: arduino
          Compatible platforms: atmelavr, atmelsam, espressif8266, intel_arc32, microchippic32, nordicnrf51, teensy, timsp430
          Authors: Thomas O Fredericks

          Homie
          =====
          #ID: 555
          ESP8266 framework for Homie, a lightweight MQTT convention for the IoT

          Version: 1.5.0
          Keywords: home, mqtt, iot, esp8266, automation
          Compatible frameworks: arduino
          Compatible platforms: espressif8266
          Authors: Marvin Roger

          JustWifi
          ========
          #ID: 1282
          Wifi Manager for ESP8266 that supports multiple wifi networks and scan for strongest signal

          Version: 1.1.1
          License: GPL-3.0
          Keywords: manager, wifi, scan
          Compatible frameworks: arduino
          Compatible platforms: espressif8266
          Authors: Xose Perez

          LiquidCrystal
          =============
          #ID: 136
          LiquidCrystal Library is faster and extensable, compatible with the original LiquidCrystal library

          Version: 1.3.4
          Keywords: lcd, hd44780
          Compatible frameworks: arduino
          Compatible platforms: atmelavr
          Authors: F Malpartida

          TextLCD
          =======
          hg+https://developer.mbed.org/users/simon/code/TextLCD/

          Version: 308d188a2d3a
          Keywords: uncategorized

          Time
          ====
          #ID: 44
          Time keeping library

          Version: 1.5
          Homepage: http://playground.arduino.cc/Code/Time
          Keywords: week, rtc, hour, year, month, second, time, date, day, minute
          Compatible frameworks: arduino
          Compatible platforms:
          Authors: Michael Margolis, Paul Stoffregen

          Timezone
          ========
          #ID: 76
          Arduino library to facilitate time zone conversions and automatic daylight saving (summer) time adjustments

          Version: 510ae2f6b6
          Keywords: zone, time
          Compatible frameworks: arduino
          Compatible platforms: atmelavr
          Authors: Jack Christensen

          U8g2
          ====
          #ID: 942
          Monochrome LCD, OLED and eInk Library. Display controller: SSD1305, SSD1306, SSD1322, SSD1325, SSD1327, SSD1606, SH1106, T6963, RA8835, LC7981, PCD8544, PCF8812, UC1604, UC1608, UC1610, UC1611, UC1701, ST7565, ST7567, NT7534, ST7920, LD7032, KS0108. Interfaces: I2C, SPI, Parallel.

          Version: 2.11.4
          Homepage: https://github.com/olikraus/u8g2
          Keywords: display
          Compatible frameworks: arduino
          Compatible platforms: atmelavr, atmelsam, espressif8266, intel_arc32, microchippic32, nordicnrf51, teensy, timsp430
          Authors: oliver

          USB-Host-Shield-20
          ==================
          #ID: 59
          Revision 2.0 of MAX3421E-based USB Host Shield Library

          Version: 1.2.1
          License: GPL-2.0
          Keywords: usb, spp, mass storage, pl2303, acm, ftdi, xbox, host, hid, wii, buzz, ps3, bluetooth, adk, ps4
          Compatible frameworks: spl, arduino
          Compatible platforms: atmelavr, atmelsam, teensy, nordicnrf51, ststm32
          Authors: Oleg Mazurov, Alexei Glushchenko, Kristian Lauszus, Andrew Kroll

   platformio lib register
   Contentsplatformio lib registerUsageDescriptionExamples

   Usage
          platformio lib register [MANIFEST_URL]
          pio lib register [MANIFEST_URL]

   Description
       Register new library in PlatformIO Library Registry.

       PlatformIO Library Registry supports the next library manifests:

       • PlatformIO library_config

       • Arduino library.properties

       • ARM mbed yotta module.json.

   Examples
          platformio lib register https://raw.githubusercontent.com/bblanchon/ArduinoJson/master/library.json
          platformio lib register https://raw.githubusercontent.com/adafruit/DHT-sensor-library/master/library.properties
          platformio lib register https://raw.githubusercontent.com/ARMmbed/ble/master/module.json

   platformio lib search
   Contentsplatformio lib searchUsageDescriptionOptionsExamples

   Usage
          platformio lib search [OPTIONS] [QUERY]
          pio lib search [OPTIONS] [QUERY]

   Description
       Search for library in PlatformIO Library Registry by library_config fields in the boolean mode.

       The boolean search capability supports the following operators:

                                ┌──────────────┬───────────────────────────────────────┐
                                │Operator      │ Description                           │
                                ├──────────────┼───────────────────────────────────────┤
                                │+             │ A  leading  or  trailing  plus   sign │
                                │              │ indicates  that  this  word  must  be │
                                │              │ present in library fields (see above) │
                                │              │ that is returned.                     │
                                └──────────────┴───────────────────────────────────────┘

                                │-             │ A  leading  or  trailing  minus  sign │
                                │              │ indicates that this word must not  be │
                                │              │ present  in any of the libraries that │
                                │              │ are returned.                         │
                                ├──────────────┼───────────────────────────────────────┤
                                │(no operator) │ By default (when neither + nor  -  is │
                                │              │ specified), the word is optional, but │
                                │              │ the libraries  that  contain  it  are │
                                │              │ rated higher.                         │
                                ├──────────────┼───────────────────────────────────────┤
                                │> <           │ These   two  operators  are  used  to │
                                │              │ change a word's contribution  to  the │
                                │              │ relevance value that is assigned to a │
                                │              │ library. The > operator increases the │
                                │              │ contribution   and   the  <  operator │
                                │              │ decreases it.                         │
                                ├──────────────┼───────────────────────────────────────┤
                                │( )           │ Parentheses    group    words    into │
                                │              │ subexpressions.  Parenthesized groups │
                                │              │ can be nested.                        │
                                ├──────────────┼───────────────────────────────────────┤
                                │~             │ A leading tilde acts  as  a  negation │
                                │              │ operator,    causing    the    word's │
                                │              │ contribution   to    the    library's │
                                │              │ relevance  to  be  negative.  This is │
                                │              │ useful for marking "noise"  words.  A │
                                │              │ library  containing  such  a  word is │
                                │              │ rated lower than others, but  is  not │
                                │              │ excluded  altogether,  as it would be │
                                │              │ with the - operator.                  │
                                ├──────────────┼───────────────────────────────────────┤
                                │*             │ The asterisk serves as the truncation │
                                │              │ (or  wildcard)  operator.  Unlike the │
                                │              │ other operators, it  is  appended  to │
                                │              │ the  word to be affected. Words match │
                                │              │ if they begin with the word preceding │
                                │              │ the * operator.                       │
                                ├──────────────┼───────────────────────────────────────┤
                                │"             │ A  phrase  that  is  enclosed  within │
                                │              │ double quote (")  characters  matches │
                                │              │ only   libraries   that  contain  the │
                                │              │ phrase literally, as it was typed.    │
                                └──────────────┴───────────────────────────────────────┘

       For more detail information please go to MySQL Boolean Full-Text Searches.

   Options
       --id

       Filter libraries by registry ID

       -n, --name

       Filter libraries by specified name (strict search)

       -a, --author

       Filter libraries by specified author

       -k, --keyword

       Filter libraries by specified keyword

       -f, --framework

       Filter libraries by specified framework

       -p, --platform

       Filter libraries by specified keyword

       -i, --header

       Filter libraries by header file (include)

       For example, platformio lib search --header "OneWire.h"

       --json-output

       Return the output in JSON format

       --page

       Manually paginate through search results. This option is useful in pair with --json-output.

   Examples
       1. List all libraries

          > platformio lib search

          Found N libraries:

          ArduinoJson
          ===========
          #ID: 64
          An elegant and efficient JSON library for embedded systems

          Keywords: web, json, http, rest
          Compatible frameworks: Arduino
          Compatible platforms: Atmel AVR, Atmel SAM, Espressif 8266, Intel ARC32, Microchip PIC32, Nordic nRF51, Teensy, TI MSP430
          Authors: Benoit Blanchon

          DHT sensor library
          ==================
          #ID: 19
          Arduino library for DHT11, DHT22, etc Temp & Humidity Sensors

          Keywords: unified, dht, sensor, temperature, humidity
          Compatible frameworks: Arduino
          Compatible platforms: Atmel AVR
          Authors: Adafruit Industries

          PubSubClient
          ============
          #ID: 89
          A client library for MQTT messaging. MQTT is a lightweight messaging protocol ideal for small devices. This library allows you to send and receive MQTT messages. It supports the latest MQTT 3.1.1 protocol and can be configured to use the older MQTT 3.1...

          Keywords: ethernet, mqtt, iot, m2m
          Compatible frameworks: Arduino
          Compatible platforms: Atmel AVR, Atmel SAM, Espressif 8266, Intel ARC32, Microchip PIC32, Nordic nRF51, Teensy, TI MSP430
          Authors: Nick O'Leary

          ...

          ESPAsyncWebServer
          =================
          #ID: 306
          Asynchronous HTTP and WebSocket Server Library for ESP8266 and ESP32

          Keywords: async, websocket, http, webserver
          Compatible frameworks: Arduino
          Compatible platforms: Espressif 8266
          Authors: Hristo Gochkov

          Show next libraries? [y/N]:
          ...

       2. Search for 1-Wire libraries

          > platformio lib search "1-wire"

          Found N libraries:

          DS1820
          ======
          #ID: 196
          Dallas / Maxim DS1820 1-Wire library. For communication with multiple DS1820 on a single 1-Wire bus. Also supports DS18S20 and DS18B20.

          Keywords: ds18s20, 1-wire, ds1820, ds18b20
          Compatible frameworks: mbed
          Compatible platforms: Freescale Kinetis, Nordic nRF51, NXP LPC, ST STM32, Teensy
          Authors: Michael Hagberg

          OneWire
          =======
          #ID: 1
          Control 1-Wire protocol (DS18S20, DS18B20, DS2408 and etc)

          Keywords: onewire, temperature, bus, 1-wire, ibutton, sensor
          Compatible frameworks: Arduino
          Compatible platforms:
          Authors: Paul Stoffregen, Jim Studt, Tom Pollard, Derek Yerger, Josh Larios, Robin James, Glenn Trewitt, Jason Dangel, Guillermo Lovato, Ken Butcher, Mark Tillotson, Bertrik Sikken, Scott Roberts

          Show next libraries? [y/N]:
          ...

       3. Search for Arduino-based "I2C" libraries

          > platformio lib search "i2c" --framework="arduino"

          Found N libraries:

          I2Cdevlib-AK8975
          ================
          #ID: 10
          AK8975 is 3-axis electronic compass IC with high sensitive Hall sensor technology

          Keywords: i2c, i2cdevlib, sensor, compass
          Compatible frameworks: Arduino
          Compatible platforms: Atmel AVR
          Authors: Jeff Rowberg

          I2Cdevlib-Core
          ==============
          #ID: 11
          The I2C Device Library (I2Cdevlib) is a collection of uniform and well-documented classes to provide simple and intuitive interfaces to I2C devices.

          Keywords: i2cdevlib, i2c
          Compatible frameworks: Arduino
          Compatible platforms: Atmel AVR
          Authors: Jeff Rowberg

          Adafruit 9DOF Library
          =====================
          #ID: 14
          Unified sensor driver for the Adafruit 9DOF Breakout (L3GD20 / LSM303)

          Keywords: magnetometer, unified, accelerometer, spi, compass, i2c, sensor, gyroscope
          Compatible frameworks: Arduino
          Compatible platforms: Atmel AVR
          Authors: Adafruit Industries

          Show next libraries? [y/N]:
          ...

       4. Search for libraries by "web" and "http" keywords.

          > platformio lib search --keyword="web" --keyword="http"

          Found N libraries:

          ArduinoJson
          ===========
          #ID: 64
          An elegant and efficient JSON library for embedded systems

          Keywords: web, json, http, rest
          Compatible frameworks: Arduino
          Compatible platforms: Atmel AVR, Atmel SAM, Espressif 8266, Intel ARC32, Microchip PIC32, Nordic nRF51, Teensy, TI MSP430
          Authors: Benoit Blanchon

          ESPAsyncWebServer
          =================
          #ID: 306
          Asynchronous HTTP and WebSocket Server Library for ESP8266 and ESP32

          Keywords: async, websocket, http, webserver
          Compatible frameworks: Arduino
          Compatible platforms: Espressif 8266
          Authors: Hristo Gochkov

          ESP8266wifi
          ===========
          #ID: 1101
          ESP8266 Arduino library with built in reconnect functionality

          Keywords: web, http, wifi, server, client, wi-fi
          Compatible frameworks: Arduino
          Compatible platforms: Atmel AVR
          Authors: Jonas Ekstrand

          Blynk
          =====
          #ID: 415
          Build a smartphone app for your project in minutes. Blynk allows creating IoT solutions easily. It supports  WiFi, BLE, Bluetooth, Ethernet, GSM, USB, Serial. Works with many boards like ESP8266, ESP32, Arduino UNO, Nano, Due, Mega, Zero, MKR100, Yun,...

          Keywords: control, gprs, protocol, communication, app, bluetooth, serial, cloud, web, usb, m2m, ble, 3g, smartphone, http, iot, device, sensors, data, esp8266, mobile, wifi, ethernet, gsm
          Compatible frameworks: Arduino, Energia, WiringPi
          Compatible platforms: Atmel AVR, Atmel SAM, Espressif 8266, Intel ARC32, Linux ARM, Microchip PIC32, Nordic nRF51, Teensy, TI MSP430, TI Tiva
          Authors: Volodymyr Shymanskyy

          Show next libraries? [y/N]:
          ...

       5. Search for libraries by "Adafruit Industries" author

          > platformio lib search --author="Adafruit Industries"

          Found N libraries:

          DHT sensor library
          ==================
          #ID: 19
          Arduino library for DHT11, DHT22, etc Temp & Humidity Sensors

          Keywords: unified, dht, sensor, temperature, humidity
          Compatible frameworks: Arduino
          Compatible platforms: Atmel AVR
          Authors: Adafruit Industries

          Adafruit DHT Unified
          ====================
          #ID: 18
          Unified sensor library for DHT (DHT11, DHT22 and etc) temperature and humidity sensors

          Keywords: unified, dht, sensor, temperature, humidity
          Compatible frameworks: Arduino
          Compatible platforms: Atmel AVR
          Authors: Adafruit Industries

          Show next libraries? [y/N]:
          ...

       6. Search for libraries which are compatible with Dallas temperature sensors like  DS18B20,  DS18S20  and
          etc.

          > platformio lib search "DS*"

          Found N libraries:

          DS1820
          ======
          #ID: 196
          Dallas / Maxim DS1820 1-Wire library. For communication with multiple DS1820 on a single 1-Wire bus. Also supports DS18S20 and DS18B20.

          Keywords: ds18s20, 1-wire, ds1820, ds18b20
          Compatible frameworks: mbed
          Compatible platforms: Freescale Kinetis, Nordic nRF51, NXP LPC, ST STM32, Teensy
          Authors: Michael Hagberg

          I2Cdevlib-DS1307
          ================
          #ID: 99
          The DS1307 serial real-time clock (RTC) is a low-power, full binary-coded decimal (BCD) clock/calendar plus 56 bytes of NV SRAM

          Keywords: i2cdevlib, clock, i2c, rtc, time
          Compatible frameworks: Arduino
          Compatible platforms: Atmel AVR
          Authors: Jeff Rowberg

          Show next libraries? [y/N]:
          ...

       7. Search  for Energia-based *nRF24* or *HttpClient* libraries.  The search query that is described below
          can be interpreted like energia nRF24 OR energia HttpClient

          > platformio lib search "+(nRF24 HttpClient)" --framework="arduino"

          Found N libraries:

          RadioHead
          =========
          #ID: 124
          The RadioHead Packet Radio library which provides a complete object-oriented library for sending and receiving packetized messages via RF22/24/26/27/69, Si4460/4461/4463/4464, nRF24/nRF905, SX1276/77/78, RFM95/96/97/98 and etc.

          Keywords: rf, radio, wireless
          Compatible frameworks: Arduino, Energia
          Compatible platforms: Atmel AVR, Atmel SAM, Espressif 32, Espressif 8266, Infineon XMC, Intel ARC32, Kendryte K210, Microchip PIC32, Nordic nRF51, Nordic nRF52, ST STM32, ST STM8, Teensy, TI MSP430, TI Tiva
          Authors: Mike McCauley

          ArduinoHttpClient
          =================
          #ID: 798
          [EXPERIMENTAL] Easily interact with web servers from Arduino, using HTTP and WebSocket's.

          Keywords: communication
          Compatible frameworks: Arduino
          Compatible platforms: Atmel AVR, Atmel SAM, Espressif 32, Espressif 8266, Intel ARC32, Microchip PIC32, Nordic nRF51, Nordic nRF52, ST STM32, ST STM8, Teensy, TI MSP430
          Authors: Arduino

          HttpClient
          ==========
          #ID: 66
          Library to easily make HTTP GET, POST and PUT requests to a web server.

          Keywords: communication
          Compatible frameworks: Arduino
          Compatible platforms: Atmel AVR, Atmel SAM, Espressif 32, Espressif 8266, Intel ARC32, Microchip PIC32, Nordic nRF51, Nordic nRF52, ST STM32, Teensy, TI MSP430
          Authors: Adrian McEwen

          Show next libraries? [y/N]:
          ...

       8. Search for the all sensor libraries excluding temperature.

          > platformio lib search "sensor -temperature"

          Found N libraries:

          SparkFun VL6180 Sensor
          ======================
          #ID: 407
          The VL6180 combines an IR emitter, a range sensor, and an ambient light sensor together for you to easily use and communicate with via an I2C interface.

          Keywords: sensors
          Compatible frameworks: Arduino
          Compatible platforms: Atmel AVR, Atmel SAM, Espressif 8266, Intel ARC32, Microchip PIC32, Nordic nRF51, Teensy, TI MSP430
          Authors: Casey Kuhns@SparkFun, SparkFun Electronics

          I2Cdevlib-AK8975
          ================
          #ID: 10
          AK8975 is 3-axis electronic compass IC with high sensitive Hall sensor technology

          Keywords: i2c, i2cdevlib, sensor, compass
          Compatible frameworks: Arduino
          Compatible platforms: Atmel AVR
          Authors: Jeff Rowberg

          Adafruit 9DOF Library
          =====================
          #ID: 14
          Unified sensor driver for the Adafruit 9DOF Breakout (L3GD20 / LSM303)

          Keywords: magnetometer, unified, accelerometer, spi, compass, i2c, sensor, gyroscope
          Compatible frameworks: Arduino
          Compatible platforms: Atmel AVR
          Authors: Adafruit Industries

          Show next libraries? [y/N]:
          ...

   platformio lib show
   Contentsplatformio lib showUsageDescriptionOptionsExamples

   Usage
          platformio lib show [LIBRARY]
          pio lib show [LIBRARY]

   Description
       Show detailed info about a library using PlatformIO Library Registry.

       The possible values for [LIBRARY]:

       • Library ID from Registry (preferred)

       • Library Name

   Options
       --json-output

       Return the output in JSON format

   Examples
          > platformio lib show OneWire

          PubSubClient
          ============
          #ID: 89
          A client library for MQTT messaging. MQTT is a lightweight messaging protocol ideal for small devices. This library allows you to send and receive MQTT messages. It supports the latest MQTT 3.1.1 protocol and can be configured to use the older MQTT 3.1...

          Version: 2.6, released 10 months ago
          Manifest: https://raw.githubusercontent.com/ivankravets/pubsubclient/patch-2/library.json
          Homepage: http://pubsubclient.knolleary.net
          Repository: https://github.com/knolleary/pubsubclient.git

          Authors
          -------
          Nick O'Leary https://github.com/knolleary

          Keywords
          --------
          ethernet
          mqtt
          iot
          m2m

          Compatible frameworks
          ---------------------
          Arduino

          Compatible platforms
          --------------------
          Atmel AVR
          Atmel SAM
          Espressif 8266
          Intel ARC32
          Microchip PIC32
          Nordic nRF51
          Teensy
          TI MSP430

          Headers
          -------
          PubSubClient.h

          Examples
          --------
          http://dl.platformio.org/libraries/examples/0/89/mqtt_auth.ino
          http://dl.platformio.org/libraries/examples/0/89/mqtt_basic.ino
          http://dl.platformio.org/libraries/examples/0/89/mqtt_esp8266.ino
          http://dl.platformio.org/libraries/examples/0/89/mqtt_publish_in_callback.ino
          http://dl.platformio.org/libraries/examples/0/89/mqtt_reconnect_nonblocking.ino
          http://dl.platformio.org/libraries/examples/0/89/mqtt_stream.ino

          Versions
          --------
          2.6, released 10 months ago

          Downloads
          ---------
          Today: 25
          Week: 120
          Month: 462

   platformio lib stats
   Contentsplatformio lib statsUsageDescriptionOptionsExamples

   Usage
          platformio lib stats
          pio lib stats

   Description
       Show PlatformIO Library Registry statistics:

       • Recently updated

       • Recently added

       • Recent keywords

       • Popular keywords

       • Featured: Today

       • Featured: Week

       • Featured: Month

       This information is the same that is shown on this page:

       • https://platformio.org/lib

   Options
       --json-output

       Return the output in JSON format

   Examples
          RECENTLY UPDATED
          ****************
          Name                     Date                    Url
          --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
          GroveEncoder             12 hours ago            https://platformio.org/lib/show/1382/GroveEncoder
          RF24G                    12 hours ago            https://platformio.org/lib/show/1381/RF24G
          Sim800L Library Revised  12 hours ago            https://platformio.org/lib/show/1380/Sim800L%20Library%20Revised
          ArduinoSTL               12 hours ago            https://platformio.org/lib/show/750/ArduinoSTL
          hd44780                  13 hours ago            https://platformio.org/lib/show/738/hd44780

          RECENTLY ADDED
          **************
          Name                     Date                    Url
          --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
          GroveEncoder             12 hours ago            https://platformio.org/lib/show/1382/GroveEncoder
          RF24G                    12 hours ago            https://platformio.org/lib/show/1381/RF24G
          Sim800L Library Revised  12 hours ago            https://platformio.org/lib/show/1380/Sim800L%20Library%20Revised
          DS3231                   a day ago               https://platformio.org/lib/show/1379/DS3231
          ArduboyPlaytune          4 days ago              https://platformio.org/lib/show/1378/ArduboyPlaytune

          RECENT KEYWORDS
          ***************
          Name                     Url
          --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
          cobs                     https://platformio.org/lib/search?query=keyword%3Acobs
          packet                   https://platformio.org/lib/search?query=keyword%3Apacket
          framing                  https://platformio.org/lib/search?query=keyword%3Aframing
          3g                       https://platformio.org/lib/search?query=keyword%3A3g
          tdd                      https://platformio.org/lib/search?query=keyword%3Atdd

          POPULAR KEYWORDS
          ****************
          Name                     Url
          --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
          display                  https://platformio.org/lib/search?query=keyword%3Adisplay
          lcd                      https://platformio.org/lib/search?query=keyword%3Alcd
          sensors                  https://platformio.org/lib/search?query=keyword%3Asensors
          graphics                 https://platformio.org/lib/search?query=keyword%3Agraphics
          communication            https://platformio.org/lib/search?query=keyword%3Acommunication
          oled                     https://platformio.org/lib/search?query=keyword%3Aoled
          tft                      https://platformio.org/lib/search?query=keyword%3Atft
          control                  https://platformio.org/lib/search?query=keyword%3Acontrol
          device                   https://platformio.org/lib/search?query=keyword%3Adevice
          glcd                     https://platformio.org/lib/search?query=keyword%3Aglcd
          displaycore              https://platformio.org/lib/search?query=keyword%3Adisplaycore
          font                     https://platformio.org/lib/search?query=keyword%3Afont
          other                    https://platformio.org/lib/search?query=keyword%3Aother
          i2c                      https://platformio.org/lib/search?query=keyword%3Ai2c
          input                    https://platformio.org/lib/search?query=keyword%3Ainput
          signal                   https://platformio.org/lib/search?query=keyword%3Asignal
          sensor                   https://platformio.org/lib/search?query=keyword%3Asensor
          output                   https://platformio.org/lib/search?query=keyword%3Aoutput
          spi                      https://platformio.org/lib/search?query=keyword%3Aspi
          data                     https://platformio.org/lib/search?query=keyword%3Adata
          timing                   https://platformio.org/lib/search?query=keyword%3Atiming
          serial                   https://platformio.org/lib/search?query=keyword%3Aserial
          temperature              https://platformio.org/lib/search?query=keyword%3Atemperature
          http                     https://platformio.org/lib/search?query=keyword%3Ahttp
          wifi                     https://platformio.org/lib/search?query=keyword%3Awifi
          rf                       https://platformio.org/lib/search?query=keyword%3Arf
          i2cdevlib                https://platformio.org/lib/search?query=keyword%3Ai2cdevlib
          processing               https://platformio.org/lib/search?query=keyword%3Aprocessing
          storage                  https://platformio.org/lib/search?query=keyword%3Astorage
          radio                    https://platformio.org/lib/search?query=keyword%3Aradio
          web                      https://platformio.org/lib/search?query=keyword%3Aweb
          accelerometer            https://platformio.org/lib/search?query=keyword%3Aaccelerometer
          wireless                 https://platformio.org/lib/search?query=keyword%3Awireless
          protocol                 https://platformio.org/lib/search?query=keyword%3Aprotocol
          server                   https://platformio.org/lib/search?query=keyword%3Aserver
          wi-fi                    https://platformio.org/lib/search?query=keyword%3Awi-fi
          ethernet                 https://platformio.org/lib/search?query=keyword%3Aethernet
          mbed                     https://platformio.org/lib/search?query=keyword%3Ambed
          openag                   https://platformio.org/lib/search?query=keyword%3Aopenag
          led                      https://platformio.org/lib/search?query=keyword%3Aled
          esp8266                  https://platformio.org/lib/search?query=keyword%3Aesp8266
          humidity                 https://platformio.org/lib/search?query=keyword%3Ahumidity
          time                     https://platformio.org/lib/search?query=keyword%3Atime
          iot                      https://platformio.org/lib/search?query=keyword%3Aiot
          json                     https://platformio.org/lib/search?query=keyword%3Ajson
          timer                    https://platformio.org/lib/search?query=keyword%3Atimer
          client                   https://platformio.org/lib/search?query=keyword%3Aclient
          driver                   https://platformio.org/lib/search?query=keyword%3Adriver
          button                   https://platformio.org/lib/search?query=keyword%3Abutton
          mbed-official            https://platformio.org/lib/search?query=keyword%3Ambed-official

          FEATURED: TODAY
          ***************
          Name                     Url
          --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
          PubSubClient             https://platformio.org/lib/show/89/PubSubClient
          Adafruit Unified Sensor  https://platformio.org/lib/show/31/Adafruit%20Unified%20Sensor
          DHT sensor library       https://platformio.org/lib/show/19/DHT%20sensor%20library
          ESPAsyncUDP              https://platformio.org/lib/show/359/ESPAsyncUDP
          NtpClientLib             https://platformio.org/lib/show/727/NtpClientLib
          Embedis                  https://platformio.org/lib/show/408/Embedis
          Blynk                    https://platformio.org/lib/show/415/Blynk
          SimpleTimer              https://platformio.org/lib/show/419/SimpleTimer
          Adafruit DHT Unified     https://platformio.org/lib/show/18/Adafruit%20DHT%20Unified
          RTClib                   https://platformio.org/lib/show/83/RTClib

          FEATURED: WEEK
          **************
          Name                     Url
          --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
          DHT sensor library       https://platformio.org/lib/show/19/DHT%20sensor%20library
          Adafruit Unified Sensor  https://platformio.org/lib/show/31/Adafruit%20Unified%20Sensor
          Blynk                    https://platformio.org/lib/show/415/Blynk
          ESPAsyncWebServer        https://platformio.org/lib/show/306/ESPAsyncWebServer
          Adafruit GFX Library     https://platformio.org/lib/show/13/Adafruit%20GFX%20Library
          I2Cdevlib-Core           https://platformio.org/lib/show/11/I2Cdevlib-Core
          TimeAlarms               https://platformio.org/lib/show/68/TimeAlarms
          PubSubClient             https://platformio.org/lib/show/89/PubSubClient
          Timer                    https://platformio.org/lib/show/75/Timer
          esp8266_mdns             https://platformio.org/lib/show/1091/esp8266_mdns

          FEATURED: MONTH
          ***************
          Name                     Url
          --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
          ArduinoJson              https://platformio.org/lib/show/64/ArduinoJson
          DHT sensor library       https://platformio.org/lib/show/19/DHT%20sensor%20library
          Adafruit Unified Sensor  https://platformio.org/lib/show/31/Adafruit%20Unified%20Sensor
          PubSubClient             https://platformio.org/lib/show/89/PubSubClient
          OneWire                  https://platformio.org/lib/show/1/OneWire
          ESPAsyncTCP              https://platformio.org/lib/show/305/ESPAsyncTCP
          Time                     https://platformio.org/lib/show/44/Time
          DallasTemperature        https://platformio.org/lib/show/54/DallasTemperature
          ESPAsyncWebServer        https://platformio.org/lib/show/306/ESPAsyncWebServer
          WifiManager              https://platformio.org/lib/show/567/WifiManager

   platformio lib uninstall
   Contentsplatformio lib uninstallUsageDescriptionStorage OptionsExamples

   Usage
          platformio lib [STORAGE_OPTIONS] uninstall [LIBRARY...]
          pio lib [STORAGE_OPTIONS] uninstall [LIBRARY...]

          # uninstall project dependent library
          # (run it from a project root where is located "platformio.ini")
          platformio lib uninstall [LIBRARY...]

          # uninstall library from global storage
          platformio lib --global uninstall [LIBRARY...]
          platformio lib -g uninstall [LIBRARY...]

          # uninstall library from custom storage
          platformio lib --storage-dir /path/to/dir uninstall [LIBRARY...]
          platformio lib -d /path/to/dir uninstall [LIBRARY...]

          # [LIBRARY...] forms
          platformio lib [STORAGE_OPTIONS] uninstall <id>
          platformio lib [STORAGE_OPTIONS] uninstall <id>@<version>
          platformio lib [STORAGE_OPTIONS] uninstall <id>@<version range>
          platformio lib [STORAGE_OPTIONS] uninstall <name>
          platformio lib [STORAGE_OPTIONS] uninstall <name>@<version>
          platformio lib [STORAGE_OPTIONS] uninstall <name>@<version range>

   Description
       Uninstall specified library

       The version supports Semantic Versioning ( <major>.<minor>.<patch>) and can take  any  of  the  following
       forms:

       • 1.2.3 - an exact version number. Use only this exact version

       • ^1.2.3 - any compatible version (exact version for 1.x.x versions)

       • ~1.2.3 - any version with the same major and minor versions, and an equal or greater patch version

       • >1.2.3 - any version greater than 1.2.3. >=, <, and <= are also possible

       • >0.1.0,!=0.2.0,<0.3.0 - any version greater than 0.1.0, not equal to 0.2.0 and less than 0.3.0

   Storage Options
       See base options for cmd_lib.

   Examples
          > platformio lib -g uninstall AsyncMqttClient

          Library Storage: /storage/dir/...
          Uninstalling AsyncMqttClient @ 0.2.0:   [OK]

   platformio lib update
   Contentsplatformio lib updateUsageDescriptionStorage OptionsOptionsExamples

   Usage
          platformio lib [STORAGE_OPTIONS] update [OPTIONS]
          pio lib [STORAGE_OPTIONS] update [OPTIONS]

          # update all project libraries
          # (run it from a project root where is located "platformio.ini")
          platformio lib update [OPTIONS]

          # update project dependent library
          platformio lib [STORAGE_OPTIONS] update [OPTIONS] [LIBRARY...]

          # update library in global storage
          platformio lib --global update [OPTIONS] [LIBRARY...]
          platformio lib -g update [OPTIONS] [LIBRARY...]

          # update library in custom storage
          platformio lib --storage-dir /path/to/dir update [OPTIONS] [LIBRARY...]
          platformio lib -d /path/to/dir update [OPTIONS] [LIBRARY...]

          # [LIBRARY...] forms
          platformio lib [STORAGE_OPTIONS] update <id>
          platformio lib [STORAGE_OPTIONS] update <id>@<version>
          platformio lib [STORAGE_OPTIONS] update <id>@<version range>
          platformio lib [STORAGE_OPTIONS] update <name>
          platformio lib [STORAGE_OPTIONS] update <name>@<version>
          platformio lib [STORAGE_OPTIONS] update <name>@<version range>

   Description
       Check or update installed libraries.

       The  version  supports  Semantic  Versioning ( <major>.<minor>.<patch>) and can take any of the following
       forms:

       • 1.2.3 - an exact version number. Use only this exact version

       • ^1.2.3 - any compatible version (exact version for 1.x.x versions)

       • ~1.2.3 - any version with the same major and minor versions, and an equal or greater patch version

       • >1.2.3 - any version greater than 1.2.3. >=, <, and <= are also possible

       • >0.1.0,!=0.2.0,<0.3.0 - any version greater than 0.1.0, not equal to 0.2.0 and less than 0.3.0

   Storage Options
       See base options for cmd_lib.

   Options
       -c, --only-check

       DEPRECATED. Please use --dry-run instead.

       --dry-run

       Do not update, only check for the new versions

       --json-output

       Return the output in JSON format

   Examples
       1. Update all installed libraries in global storage

          > platformio lib -g update

          Library Storage: /storage/dir/...
          Updating ESP8266_SSD1306 @ 3.2.3:   [Up-to-date]
          Updating EngduinoMagnetometer @ 3.1.0:  [Up-to-date]
          Updating IRremote @ 2.2.1:  [Up-to-date]
          Updating Json @ 5.4.0:  [Out-of-date]
          LibraryManager: Installing id=64 @ 5.6.4
          Downloading  [####################################]  100%
          Unpacking  [####################################]  100%
          Json @ 5.6.4 has been successfully installed!
          Updating PJON @ 1fb26fd:    [Checking]
          git version 2.7.4 (Apple Git-66)
          Already up-to-date.
          Updating TextLCD @ 308d188a2d3a:    [Checking]
          Mercurial Distributed SCM (version 3.8.4)
          (see https://mercurial-scm.org for more information)

          Copyright (C) 2005-2016 Matt Mackall and others
          This is free software; see the source for copying conditions. There is NO
          warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
          pulling from https://developer.mbed.org/users/simon/code/TextLCD/
          searching for changes
          no changes found

       2. Update specified libraries in global storage

          > platformio lib -g update Json 4

          Library Storage: /storage/dir/...
          Updating Json @ 5.6.4:  [Up-to-date]
          Updating IRremote @ 2.2.1:  [Up-to-date]

   Project Manager CLI
       To print all available commands and options use:

          platformio project --help
          platformio project COMMAND --help

   platformio project config
   Contentsplatformio project configUsageDescriptionOptionsExamples

   Usage
          platformio project config [OPTIONS]
          pio project config [OPTIONS]

   Description
       Show project computed configuration based on projectconf.  The  extra  configuration  files  and  dynamic
       variables will be expanded.

       This command is useful for developers to check how PlatformIO computes configuration from projectconf.

   Options
       -d, --project-dir

       Specify  the  path  to project directory. By default, --project-dir is equal to current working directory
       (CWD).

       --json-output

       Return the output in JSON format.

   Examples
          > pio platformio config
          Computed project configuration for Tasmota Project

          platformio
          ----------
          src_dir          =  tasmota
          build_dir        =  .pioenvs
          build_cache_dir  =  .cache
          extra_configs    =  platformio_tasmota_env.ini
                              platformio_override.ini
          default_envs     =  tasmota

          common
          ------
          framework               =  arduino
          board                   =  esp01_1m
          board_build.flash_mode  =  dout
          platform                =  espressif8266
          build_flags             =  -D NDEBUG
                                     -mtarget-align
                                     -Wl,-Map,firmware.map
                                     -Wl,-Teagle.flash.1m.ld
                                     -DBEARSSL_SSL_BASIC
                                     -DPIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK22x_190703
                                     -DPIO_FRAMEWORK_ARDUINO_LWIP2_HIGHER_BANDWIDTH_LOW_FLASH
                                     -DVTABLES_IN_FLASH
                                     -fno-exceptions
                                     -lstdc++
          build_unflags           =  -Wall
          board_build.f_cpu       =  80000000L
          monitor_speed           =  115200
          upload_speed            =  115200
          upload_resetmethod      =  nodemcu
          upload_port             =  COM5
          extra_scripts           =  pio/strip-floats.py
                                     pio/name-firmware.py

          scripts_defaults
          ----------------
          extra_scripts  =  pio/strip-floats.py
                            pio/name-firmware.py

          ...

   platformio project init
   Contentsplatformio project initUsageDescriptionOptionsExamples

   Usage
          platformio project init [OPTIONS]
          pio project init [OPTIONS]

   Description
       Initialize a new PlatformIO based project or update existing with new data.

       This command will create:

       • projectconf

       • projectconf_pio_include_dir, put project header files here

       • projectconf_pio_src_dir, put project source files here (*.h, *.c, *.cpp, *.S, *.ino, etc.)

       • projectconf_pio_lib_dir, put project specific (private) libraries here.  See also ldf

       • projectconf_pio_test_dir, put project tests here. More details unit_testing

       • Miscellaneous files for VCS and ci support.

   Options
       -d, --project-dir

       A path to a directory where PlatformIO will initialize new project.

       -b, --board

       If you specify board ID (you can pass multiple  --board  options),  then  PlatformIO  will  automatically
       generate environment for projectconf and pre-fill these data:

       • projectconf_env_platform

       • projectconf_env_framework

       • projectconf_env_board

       The full list with pre-configured boards is available here platforms.

       --ide

       Initialize  PlatformIO  project  for  the  specified IDE which can be imported later via "Import Project"
       functionality.

       A list with supported IDE is available within platformio project init --help command.  Also, please  take
       a look at ide page.

       -O, --project-option

       Initialize  project  with  additional  options  from  projectconf.  For  example, platformio project init
       --project-option="lib_deps=ArduinoJSON".  Multiple options are allowed.

       --env-prefix

       An environment prefix which will be used with pair in projectconf_env_board ID.  For example, the default
       environment name for board_teensy_teensy31 board will be [env:teensy31].

       -s, --silent

       Suppress progress reporting

   Examples
       1. Initialize new project in a current working directory

          > platformio project init

          The current working directory *** will be used for the new project.
          You can specify another project directory via
          `platformio project init -d %PATH_TO_THE_PROJECT_DIR%` command.

          The next files/directories will be created in ***
          platformio.ini - Project Configuration File. |-> PLEASE EDIT ME <-|
          src - Put your source files here
          lib - Put here project specific (private) libraries
          Project has been successfully initialized!
          Useful commands:
          `platformio run` - process/build project from the current directory
          `platformio run --target upload` or `platformio run -t upload` - upload firmware to embedded board
          `platformio run --target clean` - clean project (remove compiled files)

       2. Initialize new project in a specified directory

          > platformio project init -d %PATH_TO_DIR%

          The next files/directories will be created in ***
           platformio.ini - Project Configuration File. |-> PLEASE EDIT ME <-|
          ...

       3. Initialize project for Arduino Uno

          > platformio project init --board uno

          The current working directory *** will be used for the new project.
          You can specify another project directory via
          `platformio project init -d %PATH_TO_THE_PROJECT_DIR%` command.
          ...

       4. Initialize project for Teensy 3.1 board with custom framework_mbed

          > platformio project init --board teensy31 --project-option "framework=mbed"

          The current working directory *** will be used for the new project.
          You can specify another project directory via
          `platformio project init -d %PATH_TO_THE_PROJECT_DIR%` command.

          ...

   Platform Manager CLI
       To print all available commands and options use:

          platformio platform --help
          platformio platform COMMAND --help
       [image]

   platformio platform frameworks
   Contentsplatformio platform frameworksUsageDescriptionOptionsExamples

   Usage
          platformio platform frameworks QUERY [OPTIONS]
          pio platform frameworks QUERY [OPTIONS]

   Description
       List supported frameworks (SDKs, etc).

   Options
       --json-output

       Return the output in JSON format

   Examples
       Print all supported frameworks, SDKs, etc.

          > platformio platform frameworks

          arduino ~ Arduino
          =================
          Arduino Wiring-based Framework allows writing cross-platform software to control devices attached to a wide range of Arduino boards to create all kinds of creative coding, interactive objects, spaces or physical experiences.

          Home: https://platformio.org/frameworks/arduino

          artik-sdk ~ ARTIK SDK
          =====================
          ARTIK SDK is a C/C++ SDK targeting Samsung ARTIK platforms. It exposes a set of APIs to ease up development of applications. These APIs cover hardware buses such as GPIO, SPI, I2C, UART, connectivity links like Wi-Fi, Bluetooth, Zigbee, and network protocols such as HTTP, Websockets, MQTT, and others.

          Home: https://platformio.org/frameworks/artik-sdk

          cmsis ~ CMSIS
          =============
          The ARM Cortex Microcontroller Software Interface Standard (CMSIS) is a vendor-independent hardware abstraction layer for the Cortex-M processor series and specifies debugger interfaces. The CMSIS enables consistent and simple software interfaces to the processor for interface peripherals, real-time operating systems, and middleware. It simplifies software re-use, reducing the learning curve for new microcontroller developers and cutting the time-to-market for devices.

          Home: https://platformio.org/frameworks/cmsis

          espidf ~ ESP-IDF
          ================
          Espressif IoT Development Framework. Official development framework for ESP32.

          Home: https://platformio.org/frameworks/espidf

          libopencm3 ~ libOpenCM3
          =======================
          The libOpenCM3 framework aims to create a free/libre/open-source firmware library for various ARM Cortex-M0(+)/M3/M4 microcontrollers, including ST STM32, Ti Tiva and Stellaris, NXP LPC 11xx, 13xx, 15xx, 17xx parts, Atmel SAM3, Energy Micro EFM32 and others.

          Home: https://platformio.org/frameworks/libopencm3

          mbed ~ mbed
          ===========
          The mbed framework The mbed SDK has been designed to provide enough hardware abstraction to be intuitive and concise, yet powerful enough to build complex projects. It is built on the low-level ARM CMSIS APIs, allowing you to code down to the metal if needed. In addition to RTOS, USB and Networking libraries, a cookbook of hundreds of reusable peripheral and module libraries have been built on top of the SDK by the mbed Developer Community.

          Home: https://platformio.org/frameworks/mbed

          pumbaa ~ Pumbaa
          ===============
          Pumbaa is Python on top of Simba. The implementation is a port of MicroPython, designed for embedded devices with limited amount of RAM and code memory.

          Home: https://platformio.org/frameworks/pumbaa

          simba ~ Simba
          =============
          Simba is an RTOS and build framework. It aims to make embedded programming easy and portable.

          Home: https://platformio.org/frameworks/simba

          spl ~ SPL
          =========
          The ST Standard Peripheral Library provides a set of functions for handling the peripherals on the STM32 Cortex-M3 family. The idea is to save the user (the new user, in particular) having to deal directly with the registers.

          Home: https://platformio.org/frameworks/spl

          wiringpi ~ WiringPi
          ===================
          WiringPi is a GPIO access library written in C for the BCM2835 used in the Raspberry Pi. It's designed to be familiar to people who have used the Arduino "wiring" system.

          Home: https://platformio.org/frameworks/wiringpi

   platformio platform install
   Contentsplatformio platform installUsageOptionsDescriptionVersion controlGitMercurialSubversionExamples

   Usage
          platformio platform install [OPTIONS] [PLATFORM...]
          pio platform install [OPTIONS] [PLATFORM...]

          # [PLATFORM...] forms
          platformio platform install <name>
          platformio platform install <name>@<version>
          platformio platform install <name>@<version range>
          platformio platform install <zip or tarball url>
          platformio platform install file://<zip or tarball file>
          platformio platform install file://<folder>
          platformio platform install <repository>
          platformio platform install <name=repository> (name it should have locally)
          platformio platform install <repository#tag> ("tag" can be commit, branch or tag)

   Options
       --with-package

       Install specified package (or alias)

       --without-package

       Do not install specified package (or alias)

       --skip-default

       Skip default packages

       --with-all-packages

       Install all declared packages in platform.json

       -f, --force

       Reinstall/redownload development platform and its packages if they exist

   Description
       Install platforms and dependent packages.

       The  version  supports  Semantic  Versioning ( <major>.<minor>.<patch>) and can take any of the following
       forms:

       • 1.2.3 - an exact version number. Use only this exact version

       • ^1.2.3 - any compatible version (exact version for 1.x.x versions)

       • ~1.2.3 - any version with the same major and minor versions, and an equal or greater patch version

       • >1.2.3 - any version greater than 1.2.3. >=, <, and <= are also possible

       • >0.1.0,!=0.2.0,<0.3.0 - any version greater than 0.1.0, not equal to 0.2.0 and less than 0.3.0

       Also, PlatformIO supports installing from local directory or archive. Need to use file://  prefix  before
       local path. Also, directory or archive should contain platform.json manifest.

       • file:///local/path/to/the/platform/dirfile:///local/path/to/the/platform.zipfile:///local/path/to/the/platform.tar.gz

   Version control
       PlatformIO  supports installing from Git, Mercurial and Subversion, and detects the type of VCS using url
       prefixes: "git+", "hg+", or "svn+".

       NOTE:
          PlatformIO requires a working VCS command on your path: git, hg or svn.

   Git
       The supported schemes are: git, git+https and git+ssh. Here are the supported forms:

       • platformio/platform-NAME (short version for GitHub repository)

       • https://github.com/platformio/platform-NAME.git

       • git+git://git.server.org/my-platform

       • git+https://git.server.org/my-platform

       • git+ssh://git.server.org/my-platform

       • git+ssh://user@git.server.org/my-platform

       • [user@]host.xz:path/to/repo.git

       Passing branch names, a commit hash or a tag name is possible like so:

       • https://github.com/platformio/platform-name.git#master

       • git+git://git.server.org/my-platform#master

       • git+https://git.server.org/my-platform#v1.0

       • git+ssh://git.server.org/my-platform#7846d8ad52f983f2f2887bdc0f073fe9755a806d

   Mercurial
       The supported schemes are: hg+http, hg+https and hg+ssh. Here are the supported forms:

       • hg+hg://hg.server.org/my-platform

       • hg+https://hg.server.org/my-platform

       • hg+ssh://hg.server.org/my-platform

       Passing branch names, a commit hash or a tag name is possible like so:

       • hg+hg://hg.server.org/my-platform#master

       • hg+https://hg.server.org/my-platform#v1.0

       • hg+ssh://hg.server.org/my-platform#4cfe2fa00668

   Subversion
       The supported schemes are: svn, svn+svn, svn+http, svn+https and svn+ssh. Here are the supported forms:

       • svn+svn://svn.server.org/my-platform

       • svn+https://svn.server.org/my-platform

       • svn+ssh://svn.server.org/my-platform

       You can also give specific revisions to an SVN URL, like so:

       • svn+svn://svn.server.org/my-platform#13

   Examples
       1. Install platform_atmelavr with default packages

          > platformio platform install atmelavr

          PlatformManager: Installing atmelavr
          Downloading...
          Unpacking  [####################################]  100%
          atmelavr @ 0.0.0 has been successfully installed!
          PackageManager: Installing tool-scons @ >=2.3.0,<2.6.0
          Downloading  [####################################]  100%
          Unpacking  [####################################]  100%
          tool-scons @ 2.4.1 has been successfully installed!
          PackageManager: Installing toolchain-atmelavr @ ~1.40801.0
          Downloading  [####################################]  100%
          Unpacking  [####################################]  100%
          toolchain-atmelavr @ 1.40801.0 has been successfully installed!
          The platform 'atmelavr' has been successfully installed!
          The rest of packages will be installed automatically depending on your build environment.

       2. Install platform_atmelavr with uploader utility only and skip default packages

          > platformio platform install atmelavr --skip-default-package --with-package=uploader

          PlatformManager: Installing atmelavr
          Downloading  [####################################]  100%
          Unpacking  [####################################]  100%
          atmelavr @ 0.0.0 has been successfully installed!
          PackageManager: Installing tool-micronucleus @ ~1.200.0
          Downloading  [####################################]  100%
          Unpacking  [####################################]  100%
          tool-micronucleus @ 1.200.0 has been successfully installed!
          PackageManager: Installing tool-avrdude @ ~1.60001.0
          Downloading  [####################################]  100%
          Unpacking  [####################################]  100%
          tool-avrdude @ 1.60001.1 has been successfully installed!
          The platform 'atmelavr' has been successfully installed!
          The rest of packages will be installed automatically depending on your build environment.

       3. Install the latest development platform_atmelavr from Git repository

          > platformio platform install https://github.com/platformio/platform-atmelavr.git

          PlatformManager: Installing platform-atmelavr
          git version 2.7.4 (Apple Git-66)
          Cloning into '/Volumes/MEDIA/tmp/pio3_test_projects/arduino-digihead-master/home_dir/platforms/installing-U3ucN0-package'...
          remote: Counting objects: 176, done.
          remote: Compressing objects: 100% (55/55), done.
          remote: Total 176 (delta 114), reused 164 (delta 109), pack-reused 0
          Receiving objects: 100% (176/176), 38.86 KiB | 0 bytes/s, done.
          Resolving deltas: 100% (114/114), done.
          Checking connectivity... done.
          Submodule 'examples/arduino-external-libs/lib/OneWire' (https://github.com/PaulStoffregen/OneWire.git) registered for path 'examples/arduino-external-libs/lib/OneWire'
          Cloning into 'examples/arduino-external-libs/lib/OneWire'...
          remote: Counting objects: 91, done.
          remote: Total 91 (delta 0), reused 0 (delta 0), pack-reused 91
          Unpacking objects: 100% (91/91), done.
          Checking connectivity... done.
          Submodule path 'examples/arduino-external-libs/lib/OneWire': checked out '57c18c6de80c13429275f70875c7c341f1719201'
          atmelavr @ 0.0.0 has been successfully installed!
          PackageManager: Installing tool-scons @ >=2.3.0,<2.6.0
          Downloading  [####################################]  100%
          Unpacking  [####################################]  100%
          tool-scons @ 2.4.1 has been successfully installed!
          PackageManager: Installing toolchain-atmelavr @ ~1.40801.0
          Downloading  [####################################]  100%
          Unpacking  [####################################]  100%
          toolchain-atmelavr @ 1.40801.0 has been successfully installed!
          The platform 'https://github.com/platformio/platform-atmelavr.git' has been successfully installed!
          The rest of packages will be installed automatically depending on your build environment.

   platformio platform list
   Contentsplatformio platform listUsageDescriptionOptionsExamples

   Usage
          platformio platform list [OPTIONS]
          pio platform list [OPTIONS]

   Description
       List installed platforms

   Options
       --json-output

       Return the output in JSON format.

   Examples
          > platformio platform list

          atmelavr ~ Atmel AVR
          ====================
          Atmel AVR 8- and 32-bit MCUs deliver a unique combination of performance, power efficiency and design flexibility. Optimized to speed time to market-and easily adapt to new ones-they are based on the industrys most code-efficient architecture for C and assembly programming.

          Home: https://platformio.org/platforms/atmelavr
          Packages: toolchain-atmelavr, framework-simba
          Version: 0.0.0

          atmelsam ~ Atmel SAM
          ====================
          Atmel | SMART offers Flash- based ARM products based on the ARM Cortex-M0+, Cortex-M3 and Cortex-M4 architectures, ranging from 8KB to 2MB of Flash including a rich peripheral and feature mix.

          Home: https://platformio.org/platforms/atmelsam
          Packages: framework-arduinosam, framework-mbed, framework-simba, toolchain-gccarmnoneeabi, tool-bossac
          Version: 0.0.0

          espressif8266 ~ Espressif 8266
          ==============================
          Espressif Systems is a privately held fabless semiconductor company. They provide wireless communications and Wi-Fi chips which are widely used in mobile devices and the Internet of Things applications.

          Home: https://platformio.org/platforms/espressif8266
          Packages: framework-simba, tool-esptool, framework-arduinoespressif8266, sdk-esp8266, toolchain-xtensa
          Version: 0.0.0
          ...

   platformio platform search
   Contentsplatformio platform searchUsageDescriptionOptionsExamples

   Usage
          platformio platform search QUERY [OPTIONS]
          pio platform search QUERY [OPTIONS]

   Description
       Search for development platforms

   Options
       --json-output

       Return the output in JSON format

   Examples
       1. Print all available development platforms

          > platformio platform search

          atmelavr ~ Atmel AVR
          ====================
          Atmel AVR 8- and 32-bit MCUs deliver a unique combination of performance, power efficiency and design flexibility. Optimized to speed time to market-and easily adapt to new ones-they are based on the industrys most code-efficient architecture for C and assembly programming.

          Home: https://platformio.org/platforms/atmelavr
          Packages: toolchain-atmelavr, framework-arduinoavr, framework-simba, tool-avrdude, tool-micronucleus

          atmelsam ~ Atmel SAM
          ====================
          Atmel | SMART offers Flash- based ARM products based on the ARM Cortex-M0+, Cortex-M3 and Cortex-M4 architectures, ranging from 8KB to 2MB of Flash including a rich peripheral and feature mix.

          Home: https://platformio.org/platforms/atmelsam
          Packages: toolchain-gccarmnoneeabi, framework-arduinosam, framework-simba, tool-openocd, framework-mbed, tool-avrdude, tool-bossac

          espressif32 ~ Espressif 32
          ==========================
          Espressif Systems is a privately held fabless semiconductor company. They provide wireless communications and Wi-Fi chips which are widely used in mobile devices and the Internet of Things applications.

          Home: https://platformio.org/platforms/espressif32
          Packages: toolchain-xtensa32, framework-simba, framework-arduinoespressif32, framework-pumbaa, framework-espidf, tool-esptoolpy

          espressif8266 ~ Espressif 8266
          ==============================
          Espressif Systems is a privately held fabless semiconductor company. They provide wireless communications and Wi-Fi chips which are widely used in mobile devices and the Internet of Things applications.

          Home: https://platformio.org/platforms/espressif8266
          Packages: toolchain-xtensa, framework-simba, tool-esptool, tool-mkspiffs, tool-espotapy, framework-arduinoespressif8266, sdk-esp8266

          freescalekinetis ~ Freescale Kinetis
          ====================================
          Freescale Kinetis Microcontrollers is family of multiple hardware- and software-compatible ARM Cortex-M0+, Cortex-M4 and Cortex-M7-based MCU series. Kinetis MCUs offer exceptional low-power performance, scalability and feature integration.
          ...

       2. Search for TI development platforms

          > platformio platform search texas

          timsp430 ~ TI MSP430
          ====================
          MSP430 microcontrollers (MCUs) from Texas Instruments (TI) are 16-bit, RISC-based, mixed-signal processors designed for ultra-low power. These MCUs offer the lowest power consumption and the perfect mix of integrated peripherals for thousands of applications.

          Home: https://platformio.org/platforms/timsp430
          Packages: toolchain-timsp430, tool-mspdebug, framework-energiamsp430, framework-arduinomsp430

          titiva ~ TI TIVA
          ================
          Texas Instruments TM4C12x MCUs offer the industrys most popular ARM Cortex-M4 core with scalable memory and package options, unparalleled connectivity peripherals, advanced application functions, industry-leading analog integration, and extensive software solutions.

          Home: https://platformio.org/platforms/titiva
          Packages: ldscripts, framework-libopencm3, toolchain-gccarmnoneeabi, tool-lm4flash, framework-energiativa

          > platformio platform search framework-mbed

          atmelsam ~ Atmel SAM
          ====================
          Atmel | SMART offers Flash- based ARM products based on the ARM Cortex-M0+, Cortex-M3 and Cortex-M4 architectures, ranging from 8KB to 2MB of Flash including a rich peripheral and feature mix.

          Home: https://platformio.org/platforms/atmelsam
          Packages: toolchain-gccarmnoneeabi, framework-arduinosam, framework-simba, tool-openocd, framework-mbed, ldscripts, tool-bossac

          freescalekinetis ~ Freescale Kinetis
          ====================================
          Freescale Kinetis Microcontrollers is family of multiple hardware- and software-compatible ARM Cortex-M0+, Cortex-M4 and Cortex-M7-based MCU series. Kinetis MCUs offer exceptional low-power performance, scalability and feature integration.

          Home: https://platformio.org/platforms/freescalekinetis
          Packages: framework-mbed, toolchain-gccarmnoneeabi

          nordicnrf51 ~ Nordic nRF51
          ==========================
          The Nordic nRF51 Series is a family of highly flexible, multi-protocol, system-on-chip (SoC) devices for ultra-low power wireless applications. nRF51 Series devices support a range of protocol stacks including Bluetooth Smart (previously called Bluetooth low energy), ANT and proprietary 2.4GHz protocols such as Gazell.

          Home: https://platformio.org/platforms/nordicnrf51
          Packages: framework-mbed, tool-rfdloader, toolchain-gccarmnoneeabi, framework-arduinonordicnrf51

          nxplpc ~ NXP LPC
          ================
          The NXP LPC is a family of 32-bit microcontroller integrated circuits by NXP Semiconductors. The LPC chips are grouped into related series that are based around the same 32-bit ARM processor core, such as the Cortex-M4F, Cortex-M3, Cortex-M0+, or Cortex-M0. Internally, each microcontroller consists of the processor core, static RAM memory, flash memory, debugging interface, and various peripherals.

          Home: https://platformio.org/platforms/nxplpc
          Packages: framework-mbed, toolchain-gccarmnoneeabi

          siliconlabsefm32 ~ Silicon Labs EFM32
          =====================================
          Silicon Labs EFM32 Gecko 32-bit microcontroller (MCU) family includes devices that offer flash memory configurations up to 256 kB, 32 kB of RAM and CPU speeds up to 48 MHz. Based on the powerful ARM Cortex-M core, the Gecko family features innovative low energy techniques, short wake-up time from energy saving modes and a wide selection of peripherals, making it ideal for battery operated applications and other systems requiring high performance and low-energy consumption.

          Home: https://platformio.org/platforms/siliconlabsefm32
          Packages: framework-mbed, toolchain-gccarmnoneeabi

          ststm32 ~ ST STM32
          ==================
          The STM32 family of 32-bit Flash MCUs based on the ARM Cortex-M processor is designed to offer new degrees of freedom to MCU users. It offers a 32-bit product range that combines very high performance, real-time capabilities, digital signal processing, and low-power, low-voltage operation, while maintaining full integration and ease of development.

          Home: https://platformio.org/platforms/ststm32
          Packages: framework-libopencm3, toolchain-gccarmnoneeabi, tool-stlink, framework-spl, framework-cmsis, framework-mbed, ldscripts

          teensy ~ Teensy
          ===============
          Teensy is a complete USB-based microcontroller development system, in a very small footprint, capable of implementing many types of projects. All programming is done via the USB port. No special programmer is needed, only a standard USB cable and a PC or Macintosh with a USB port.

          Home: https://platformio.org/platforms/teensy
          Packages: framework-arduinoteensy, tool-teensy, toolchain-gccarmnoneeabi, framework-mbed, toolchain-atmelavr, ldscripts
          ...

   platformio platform show
   Contentsplatformio platform showUsageDescriptionExamples

   Usage
          platformio platform show PLATFORM
          pio platform show PLATFORM

   Description
       Show details about platforms

   Examples
          > platformio platform show atmelavr

          atmelavr ~ Atmel AVR
          ====================
          Atmel AVR 8- and 32-bit MCUs deliver a unique combination of performance, power efficiency and design flexibility. Optimized to speed time to market-and easily adapt to new ones-they are based on the industrys most code-efficient architecture for C and assembly programming.

          Version: 1.2.1
          Home: https://platformio.org/platforms/atmelavr
          License: Apache-2.0
          Frameworks: simba, arduino

          Package toolchain-atmelavr
          --------------------------
          Type: toolchain
          Requirements: ~1.40902.0
          Installed: Yes
          Description: avr-gcc
          Url: http://www.atmel.com/products/microcontrollers/avr/32-bitavruc3.aspx?tab=tools
          Version: 1.40902.0 (4.9.2)

          Package framework-arduinoavr
          ----------------------------
          Type: framework
          Requirements: ~1.10612.1
          Installed: Yes
          Url: https://www.arduino.cc/en/Main/Software
          Version: 1.10612.1 (1.6.12)
          Description: Arduino Wiring-based Framework (AVR Core, 1.6)

          Package framework-simba
          -----------------------
          Type: framework
          Requirements: >=7.0.0
          Installed: Yes
          Url: https://github.com/eerimoq/simba
          Version: 11.0.0
          Description: Simba Embedded Programming Platform

          Package tool-avrdude
          --------------------
          Type: uploader
          Requirements: ~1.60300.0
          Installed: Yes
          Description: AVRDUDE
          Url: http://www.nongnu.org/avrdude/
          Version: 1.60300.0 (6.3.0)

          Package tool-micronucleus
          -------------------------
          Type: uploader
          Requirements: ~1.200.0
          Installed: No (optional)

   platformio platform uninstall
   Contentsplatformio platform uninstallUsageDescriptionExamples

   Usage
          platformio platform uninstall [PLATFORM...]
          pio platform uninstall [PLATFORM...]

          # uninstall specific platform version using Semantic Versioning
          platformio platform uninstall PLATFORM@X.Y.Z

   Description
       Uninstall specified platforms

   Examples
          > platformio platform uninstall atmelavr
          Uninstalling platform atmelavr @ 0.0.0:    [OK]
          Uninstalling package tool-scons @ 2.4.1:    [OK]
          Uninstalling package toolchain-atmelavr @ 1.40801.0:    [OK]
          The platform 'atmelavr' has been successfully uninstalled!

   platformio platform update
   Contentsplatformio platform updateUsageDescriptionOptionsExamples

   Usage
          platformio platform update [OPTIONS] [PLATFORM...]
          pio platform update [OPTIONS] [PLATFORM...]

          # update specific platform version using Semantic Versioning
          platformio platform update PLATFORM@X.Y.Z

   Description
       Check or update installed platforms

   Options
       -p, --only-packages

       Update only the platform related packages. Do  not  update  development  platform  build  scripts,  board
       configs and etc.

       -c, --only-check

       DEPRECATED. Please use --dry-run instead.

       --dry-run

       Do not update, only check for the new versions

       --json-output

       Return the output in JSON format

   Examples
          > platformio platform update

          Platform atmelavr
          --------
          Updating atmelavr @ 0.0.0:  [Up-to-date]
          Updating framework-arduinoavr @ 1.10608.1:  [Up-to-date]
          Updating tool-avrdude @ 1.60001.1:  [Up-to-date]
          Updating toolchain-atmelavr @ 1.40801.0:    [Up-to-date]
          Updating tool-scons @ 2.4.1:    [Up-to-date]

          Platform espressif8266
          --------
          Updating espressif @ 0.0.0:     [Up-to-date]
          Updating tool-scons @ 2.4.1:    [Up-to-date]
          Updating toolchain-xtensa @ 1.40802.0:  [Up-to-date]
          Updating tool-esptool @ 1.409.0:    [Up-to-date]
          Updating tool-mkspiffs @ 1.102.0:   [Up-to-date]
          Updating framework-arduinoespressif8266 @ 1.20300.0:    [Up-to-date]
          Updating sdk-esp8266 @ 1.10502.0:   [Up-to-date]

          Platform teensy
          --------
          Updating teensy @ 0.0.0:    [Up-to-date]
          Updating framework-arduinoteensy @ 1.128.0:     [Up-to-date]
          Updating tool-teensy @ 1.1.0:   [Up-to-date]
          Updating framework-mbed @ 1.121.0:  [Up-to-date]
          Updating tool-scons @ 2.4.1:    [Up-to-date]
          Updating toolchain-atmelavr @ 1.40801.0:    [Up-to-date]
          Updating toolchain-gccarmnoneeabi @ 1.40804.0:  [Up-to-date]

          ...

   PlatformIO Remote CLI
       Helper command for pioremote.

       To print all available commands and options use:

          pio remote --help
          platformio remote --help
          platformio remote COMMAND --help

          # run command on the specified PIO Remote Agents
          platformio remote --agent NAME_1 --agent NAME_N COMMAND

   PIO Remote Agent
       Start  PIO  Remote  Agent  on  a host machine and work remotely with your devices WITHOUT extra software,
       services, SSH, VPN, tunneling or opening incoming network ports.

       pioremote supports wired and wireless devices. Wired devices  should  be  connected  physically  to  host
       machine  where PIO Remote Agent is started, where wireless devices should be visible for PIO Remote Agent
       to provide network operations Over-The-Air (OTA).

   ContentsPIO Remote Agentplatformio remote agent listUsageDescriptionExampleplatformio remote agent startUsageDescriptionOptions

   platformio remote agent list
   Usage
          platformio remote agent list
          pio remote agent list

   Description
       List active PIO Remote Agent s started using own pioaccount  or  shared  with  you  by  other  PlatformIO
       developers.

   Example
          > platformio remote agent list

          innomac.local
          -------------
          ID: 98853d930......788d77375e7
          Started: 2016-10-26 16:32:56

                                                         ----

   platformio remote agent start
   Usage
          platformio remote agent start [OPTIONS]
          pio remote agent start [OPTIONS]

   Description
       Start  PIO  Remote Agent and work remotely with your devices from anywhere in the world. This command can
       be run as daemon or added to autostart list of your OS.

   Options
       -n, --name

       Agent name/alias. By default, machine's hostname  will  be  used.   You  can  use  this  name  later  for
       cmd_remote_device and cmd_remote_run commands. Good names are home, office, lab or etc.

       -s, --share

       Share your agent/devices with other PlatformIO developers who have pioaccount: friends, co-workers, team,
       etc.

       The valid value for --share option is email address that was used for cmd_account_register command.

       -d, --working-dir

       A working directory where PIO Remote Agent stores  projects  data  for  incremental  synchronization  and
       embedded programs for PIO Process Supervisor.

   platformio remote device
       Remote Device: monitor remote device or list existing.

   Contentsplatformio remote deviceplatformio remote device listUsageDescriptionOptionsExampleplatformio remote device monitorUsageDescriptionOptionsExamples

   platformio remote device list
   Usage
          platformio remote device list [OPTIONS]
          pio remote device list [OPTIONS]

          # List devices from the specified agents. Multiple agents are allowed.
          platformio remote --agent NAME device list [OPTIONS]

   Description
       List Serial Ports on remote machines where cmd_remote_agent is started.

       You  can  list  devices  from  the specified remote machines using --agent NAME option between "remote" &
       "device" sub-commands. For example, you have run platformio remote agent start --name command with "home"
       and "office" options:

       • platformio remote agent start --name homeplatformio remote agent start --name office

       Now, to list devices from office machine please use platformio remote --agent office device list.

       Multiple agents are allowed ( platformio remote --agent lab1 --agent lab3 device ...).

   Options
       --json-output

       Return the output in JSON format

   Example
          > platformio remote device list

          Agent innomac.local
          ===================
          /dev/cu.Bluetooth-Incoming-Port
          -------------------------------
          Hardware ID: n/a
          Description: n/a
          /dev/cu.obd2ecu-SPPDev
          ----------------------
          Hardware ID: n/a
          Description: n/a
          /dev/cu.usbmodemFA1431
          ----------------------
          Hardware ID: USB VID:PID=2A03:0043 SER=75435353038351015271 LOCATION=250-1.4.3
          Description: Arduino Uno
          /dev/cu.usbserial-A6004003
          --------------------------
          Hardware ID: USB VID:PID=0403:6001 SER=A6004003 LOCATION=253-1.3.1
          Description: FT232R USB UART - FT232R USB UART
          /dev/cu.SLAB_USBtoUART
          ----------------------
          Hardware ID: USB VID:PID=10C4:EA60 SER=0001 LOCATION=253-1.3.2
          Description: CP2102 USB to UART Bridge Controller - CP2102 USB to UART Bridge Controller
          /dev/cu.usbmodem589561
          ----------------------
          Hardware ID: USB VID:PID=16C0:0483 SER=589560 LOCATION=250-1.4.1
          Description: USB Serial

   platformio remote device monitor
       Remote Serial Port Monitor

   Usage
          platformio remote device monitor [OPTIONS]
          pio remote device monitor [OPTIONS]

          # Connect to a specified agent
          platformio remote --agent NAME device monitor [OPTIONS]
          platformio remote -a NAME device monitor [OPTIONS]

   Description
       Connect  to  Serial Port of remote device and receive or send data in real time.  cmd_remote_agent should
       be started before on a remote machine.

       To control monitor please use these "hot keys":

       • Ctrl+C Quit

       • Ctrl+T Menu

       • Ctrl+T followed by Ctrl+H Help

   Options
       -p, --port

       Port, a number or a device name

       -b, --baud

       Set baud rate, default 9600

       --parity

       Set parity (None, Even, Odd, Space, Mark), one of [N, E, O, S, M], default N

       --rtscts

       Enable RTS/CTS flow control, default Off

       --xonxoff

       Enable software flow control, default Off

       --rts

       Set initial RTS line state, default 0

       --dtr

       Set initial DTR line state, default 0

       --echo

       Enable local echo, default Off

       --encoding

       Set the encoding for the serial port (e.g. hexlify, Latin1, UTF-8), default UTF-8.

       -f, --filter

       Add text transformation. Available filters:

       • colorize Apply different colors for received and echo

       • debug Print what is sent and received

       • default Remove typical terminal control codes from input

       • direct Do-nothing: forward all data unchanged

       • nocontrol Remove all control codes, incl. CR+LF

       • printable Show decimal code for all non-ASCII characters and replace most control codes

       --eol

       End of line mode (CR, LF or CRLF), default CRLF

       --raw

       Do not apply any encodings/transformations

       --exit-char

       ASCII code of special character that is used to exit the application, default 3 (DEC, Ctrl+C).

       For example, to use Ctrl+] run platformio remote device monitor --exit-char 29.

       --menu-char

       ASCII code of special character that is used to control miniterm (menu), default 20 (DEC)

       ---quiet

       Diagnostics: suppress non-error messages, default Off

       -d, --project-dir

       Specify the path to project directory. By default, --project-dir is equal to  current  working  directory
       (CWD).

       -e, --environment

       Process specified environments.

       You can also specify which environments should be processed by default using projectconf_pio_default_envs
       option from projectconf.

   Examples
       1. Show available options for monitor

          > platformio remote device monitor --help

          Usage: platformio remote device monitor [OPTIONS]

          Options:
            -p, --port TEXT       Port, a number or a device name
            -b, --baud INTEGER    Set baud rate, default=9600
            --parity [N|E|O|S|M]  Set parity, default=N
            --rtscts              Enable RTS/CTS flow control, default=Off
            --xonxoff             Enable software flow control, default=Off
            --rts [0|1]           Set initial RTS line state, default=0
            --dtr [0|1]           Set initial DTR line state, default=0
            --echo                Enable local echo, default=Off
            --encoding TEXT       Set the encoding for the serial port (e.g. hexlify,
                                  Latin1, UTF-8), default: UTF-8
            -f, --filter TEXT     Add text transformation
            --eol [CR|LF|CRLF]    End of line mode, default=CRLF
            --raw                 Do not apply any encodings/transformations
            --exit-char INTEGER   ASCII code of special character that is used to exit
                                  the application, default=29 (DEC)
            --menu-char INTEGER   ASCII code of special character that is used to
                                  control miniterm (menu), default=20 (DEC)
            --quiet               Diagnostics: suppress non-error messages, default=Off
            -h, --help            Show this message and exit.

       2. Communicate with serial device and print help inside terminal

          > platformio remote device monitor

          --- Available ports:
          --- /dev/cu.Bluetooth-Incoming-Port n/a
          --- /dev/cu.Bluetooth-Modem n/a
          --- /dev/cu.SLAB_USBtoUART CP2102 USB to UART Bridge Controller
          --- /dev/cu.obd2ecu-SPPDev n/a
          Enter port name:/dev/cu.SLAB_USBtoUART
          --- Miniterm on /dev/cu.SLAB_USBtoUART: 9600,8,N,1 ---
          --- Quit: Ctrl+C  |  Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
          Hello PlatformIO!
          ---
          --- Ctrl+]   Exit program
          --- Ctrl+T   Menu escape key, followed by:
          --- Menu keys:
          ---    Ctrl+T  Send the menu character itself to remote
          ---    Ctrl+]  Send the exit character itself to remote
          ---    Ctrl+I  Show info
          ---    Ctrl+U  Upload file (prompt will be shown)
          --- Toggles:
          ---    Ctrl+R  RTS          Ctrl+E  local echo
          ---    Ctrl+D  DTR          Ctrl+B  BREAK
          ---    Ctrl+L  line feed    Ctrl+A  Cycle repr mode
          ---
          --- Port settings (Ctrl+T followed by the following):
          ---    p          change port
          ---    7 8        set data bits
          ---    n e o s m  change parity (None, Even, Odd, Space, Mark)
          ---    1 2 3      set stop bits (1, 2, 1.5)
          ---    b          change baud rate
          ---    x X        disable/enable software flow control
          ---    r R        disable/enable hardware flow control
          --- exit ---

   platformio remote run
       Remote Firmware Updates

   Contentsplatformio remote runUsageDescriptionOptionsExample

   Usage
          platformio remote run [OPTIONS]
          pio remote run [OPTIONS]

          # process environments using specified PIO Remote Agent
          platformio remote --agent NAME run [OPTIONS]

   Description
       Process remotely environments which are defined  in  projectconf  file.   By  default,  pioremote  builds
       project on a host machine and deploy final firmware (program) to a remote device (embedded board).

       If  you  need  to  process  project  on a remote machine, please use platformio remote run --force-remote
       option. In this case, pioremote will automatically synchronize your project with remote machine,  install
       required toolchains, frameworks, SDKs, etc., and process project.

   Options
       -e, --environment

       Process specified environments.

       You can also specify which environments should be processed by default using projectconf_pio_default_envs
       option from projectconf.

       -t, --target

       Process specified targets.

       Built-in targets:

       • clean delete compiled object files, libraries and firmware/program binaries

       • upload firmware "auto-uploading" for embedded platforms

       • program firmware "auto-uploading" for embedded platforms using external programmer (available only  for
         platform_atmelavr)

       • buildfs platform_espressif_uploadfs

       • uploadfs platform_espressif_uploadfs

       • envdump dump current build environment

       • size print the size of the sections in a firmware/program

       --upload-port

       Custom upload port of embedded board. To print all available ports use cmd_remote_device command.

       If upload port is not specified, PlatformIO will try to detect it automatically.

       -d, --project-dir

       Specify  the  path  to project directory. By default, --project-dir is equal to current working directory
       (CWD).

       -v, --verbose

       Shows detailed information when processing environments.

       This option can also be set globally using  setting_force_verbose  setting  or  by  environment  variable
       PLATFORMIO_SETTING_FORCE_VERBOSE.

       --disable-auto-clean

       Disable  auto-clean  of  projectconf_pio_build_dir  when  projectconf or projectconf_pio_src_dir (project
       structure) have been modified.

       -r, --force-remote

       By default, pioremote builds project on a host machine and deploy  final  firmware  (program)  to  remote
       device (embedded board).

       If you need to process project on remote machine, please use platformio remote run --force-remote option.
       In this case, pioremote will automatically synchronize your project with remote machine, install required
       toolchains, frameworks, SDKs, etc., and process project.

   Example
          > platformio remote run --environment uno --target upload

          Building project locally
          [Wed Oct 26 16:35:09 2016] Processing uno (platform: atmelavr, board: uno, framework: arduino)
          --------------------------------------------------------------------------------
          Verbose mode can be enabled via `-v, --verbose` option
          Collected 25 compatible libraries
          Looking for dependencies...
          Project does not have dependencies
          Compiling .pio/build/uno/src/main.o
          Archiving .pio/build/uno/libFrameworkArduinoVariant.a
          Indexing .pio/build/uno/libFrameworkArduinoVariant.a
          Compiling .pio/build/uno/FrameworkArduino/CDC.o
          Compiling .pio/build/uno/FrameworkArduino/HardwareSerial.o
          Compiling .pio/build/uno/FrameworkArduino/HardwareSerial0.o
          Compiling .pio/build/uno/FrameworkArduino/HardwareSerial1.o
          Compiling .pio/build/uno/FrameworkArduino/HardwareSerial2.o
          Compiling .pio/build/uno/FrameworkArduino/HardwareSerial3.o
          Compiling .pio/build/uno/FrameworkArduino/IPAddress.o
          Compiling .pio/build/uno/FrameworkArduino/PluggableUSB.o
          Compiling .pio/build/uno/FrameworkArduino/Print.o
          Compiling .pio/build/uno/FrameworkArduino/Stream.o
          Compiling .pio/build/uno/FrameworkArduino/Tone.o
          Compiling .pio/build/uno/FrameworkArduino/USBCore.o
          Compiling .pio/build/uno/FrameworkArduino/WInterrupts.o
          Compiling .pio/build/uno/FrameworkArduino/WMath.o
          Compiling .pio/build/uno/FrameworkArduino/WString.o
          Compiling .pio/build/uno/FrameworkArduino/_wiring_pulse.o
          Compiling .pio/build/uno/FrameworkArduino/abi.o
          Compiling .pio/build/uno/FrameworkArduino/hooks.o
          Compiling .pio/build/uno/FrameworkArduino/main.o
          Compiling .pio/build/uno/FrameworkArduino/new.o
          Compiling .pio/build/uno/FrameworkArduino/wiring.o
          Compiling .pio/build/uno/FrameworkArduino/wiring_analog.o
          Compiling .pio/build/uno/FrameworkArduino/wiring_digital.o
          Compiling .pio/build/uno/FrameworkArduino/wiring_pulse.o
          Compiling .pio/build/uno/FrameworkArduino/wiring_shift.o
          Archiving .pio/build/uno/libFrameworkArduino.a
          Indexing .pio/build/uno/libFrameworkArduino.a
          Linking .pio/build/uno/firmware.elf
          Checking program size
          Building .pio/build/uno/firmware.hex
          text       data     bss     dec     hex filename
          2574         48     168    2790     ae6 .pio/build/uno/firmware.elf
          ========================= [SUCCESS] Took 10.01 seconds =======================
          ================================== [SUMMARY] =================================
          Environment nodemcuv2   [SKIP]
          Environment uno_pic32   [SKIP]
          Environment teensy31    [SKIP]
          Environment uno         [SUCCESS]
          ========================= [SUCCESS] Took 10.01 seconds ========================
          Uploading firmware remotely
          [Wed Oct 26 19:35:20 2016] Processing uno (platform: atmelavr, board: uno, framework: arduino)
          ----------------------------------------------------------------------------------------------
          Verbose mode can be enabled via `-v, --verbose` option
          Looking for upload port...
          Auto-detected: /dev/cu.usbmodemFA1431
          Uploading .pio/build/uno/firmware.hex
          avrdude: AVR device initialized and ready to accept instructions
          Reading | ################################################## | 100% 0.00s
          avrdude: Device signature = 0x1e950f
          avrdude: reading input file ".pio/build/uno/firmware.hex"
          avrdude: writing flash (2622 bytes):
          Writing | ################################################## | 100% 0.43s
          avrdude: 2622 bytes of flash written
          avrdude: verifying flash memory against .pio/build/uno/firmware.hex:
          avrdude: load data flash data from input file .pio/build/uno/firmware.hex:
          avrdude: input file .pio/build/uno/firmware.hex contains 2622 bytes
          avrdude: reading on-chip flash data:
          Reading | ################################################## | 100% 0.34s
          avrdude: verifying ...
          avrdude: 2622 bytes of flash verified
          avrdude done.  Thank you.
          ========================= [SUCCESS] Took 3.04 seconds =======================
          ========================= [SUMMARY] =========================================
          Environment nodemcuv2   [SKIP]
          Environment uno_pic32   [SKIP]
          Environment teensy31    [SKIP]
          Environment uno         [SUCCESS]
          ========================= [SUCCESS] Took 3.04 seconds ========================

   platformio remote test
       Helper command for remote unit_testing.

   Contentsplatformio remote testUsageDescriptionOptionsExamples

   Usage
          platformio remote test [OPTIONS]
          pio remote test [OPTIONS]

          # run tests on specified PIO Remote Agent
          platformio remote --agent NAME test [OPTIONS]

   Description
       Run remotely tests from PlatformIO based project. More details about PlatformIO unit_testing.

       This command allows you to apply the tests for the environments specified in projectconf.

   Options
       -e, --environment

       Process specified environments. More details platformio run --environment

       -i, --ignore

       Ignore  tests where the name matches specified patterns. More than one pattern is allowed. If you need to
       ignore some tests for the specific environment, please take a look at projectconf_test_ignore option from
       projectconf.

                                     ┌────────┬──────────────────────────────────┐
                                     │Pattern │ Meaning                          │
                                     ├────────┼──────────────────────────────────┤
                                     │*       │ matches everything               │
                                     ├────────┼──────────────────────────────────┤
                                     │?       │ matches any single character     │
                                     ├────────┼──────────────────────────────────┤
                                     │[seq]   │ matches any character in seq     │
                                     ├────────┼──────────────────────────────────┤
                                     │[!seq]  │ matches any character not in seq │
                                     └────────┴──────────────────────────────────┘

       For example, platformio remote test --ignore "mytest*" -i "test[13]"

       --upload-port

       A  port  that  is  intended  for  firmware  uploading. To list available ports please use cmd_device_list
       command.

       If upload port is not specified, PlatformIO will try to detect it automatically.

       --test-port

       A Serial/UART port that PlatformIO uses as communication interface between PlatformIO  Unit  Test  Engine
       and target device. To list available ports please use cmd_device_list command.

       If test port is not specified, PlatformIO will try to detect it automatically.

       -d, --project-dir

       Specify  the  path  to project directory. By default, --project-dir is equal to current working directory
       (CWD).

       -r, --force-remote

       By default, pioremote processes project on a host machine and deploy final testing firmware (program)  to
       remote device (embedded board).

       If  you  need  to  process  project  on  remote machine, please use platformio remote test --force-remote
       option. In this case, pioremote will automatically synchronize your project with remote machine,  install
       required toolchains, frameworks, SDKs, etc., and process project.

       --without-building

       Skip building stage.

       --without-uploading

       Skip uploading stage

       -v, --verbose

       Shows detailed information when processing environments.

       This  option  can  also  be  set  globally using setting_force_verbose setting or by environment variable
       PLATFORMIO_SETTING_FORCE_VERBOSE.

   Examples
       For the examples please follow to unit_testing page.

   platformio remote update
   Contentsplatformio remote updateUsageDescriptionOptionsExamples

   Usage
          platformio remote update [OPTIONS]
          pio remote update [OPTIONS]

          # start update process on the specified agents/machines
          platformio remote --agent NAME update [OPTIONS]

   Description
       Check or update installed platforms and global Libraries on the remote machine.

   Options
       -c, --only-check

       DEPRECATED. Please use --dry-run instead.

       --dry-run

       Do not update, only check for the new versions

   Examples
          > platformio remote update

          Platform Manager
          ================
          Platform timsp430
          --------
          Updating timsp430 @ 0.0.0:  [Up-to-date]
          Updating toolchain-timsp430 @ 1.40603.0:    [Up-to-date]
          Updating framework-energiamsp430 @ 1.17.0:  [Up-to-date]
          Updating framework-arduinomsp430 @ 1.10601.0:   [Up-to-date]
          Updating tool-scons @ 2.4.1:    [Up-to-date]

          Platform freescalekinetis
          --------
          Updating freescalekinetis @ 0.0.0:  [Up-to-date]
          Updating framework-mbed @ 1.121.1:  [Up-to-date]
          Updating toolchain-gccarmnoneeabi @ 1.40804.0:  [Up-to-date]
          Updating tool-scons @ 2.4.1:    [Up-to-date]

          Platform ststm32
          --------
          Updating ststm32 @ 0.0.0:   [Up-to-date]
          Updating framework-libopencm3 @ 1.1.0:  [Up-to-date]
          Updating toolchain-gccarmnoneeabi @ 1.40804.0:  [Up-to-date]
          Updating tool-stlink @ 1.10200.0:   [Up-to-date]
          Updating framework-spl @ 1.10201.0:     [Up-to-date]
          Updating framework-cmsis @ 1.40300.0:   [Up-to-date]
          Updating framework-mbed @ 1.121.1:  [Up-to-date]
          Updating tool-scons @ 2.4.1:    [Up-to-date]

          Platform lattice_ice40
          --------
          Updating lattice_ice40 @ 0.0.0:     [Up-to-date]
          Updating toolchain-icestorm @ 1.7.0:    [Up-to-date]
          Updating tool-scons @ 2.4.1:    [Up-to-date]

          Platform atmelavr
          --------
          Updating atmelavr @ 0.0.0:  [Up-to-date]
          Updating framework-arduinoavr @ 1.10608.1:  [Up-to-date]
          Updating tool-avrdude @ 1.60001.1:  [Up-to-date]
          Updating toolchain-atmelavr @ 1.40801.0:    [Up-to-date]
          Updating tool-scons @ 2.4.1:    [Up-to-date]

          Platform espressif8266
          --------
          Updating espressif8266 @ 0.0.0:     [Up-to-date]
          Updating tool-scons @ 2.4.1:    [Up-to-date]
          Updating toolchain-xtensa @ 1.40802.0:  [Up-to-date]
          Updating tool-esptool @ 1.409.0:    [Up-to-date]
          Updating tool-mkspiffs @ 1.102.0:   [Up-to-date]
          Updating framework-arduinoespressif8266 @ 1.20300.0:    [Up-to-date]
          Updating sdk-esp8266 @ 1.10502.0:   [Up-to-date]

          Platform linux_x86_64
          --------
          Updating linux_x86_64 @ 0.0.0:  [Up-to-date]
          Updating toolchain-gcclinux64 @ 1.40801.0:  [Up-to-date]
          Updating tool-scons @ 2.4.1:    [Up-to-date]

          Platform windows_x86
          --------
          Updating windows_x86 @ 0.0.0:   [Up-to-date]
          Updating toolchain-gccmingw32 @ 1.40800.0:  [Up-to-date]
          Updating tool-scons @ 2.4.1:    [Up-to-date]

          Platform teensy
          --------
          Updating teensy @ 0.0.0:    [Up-to-date]
          Updating framework-arduinoteensy @ 1.128.0:     [Up-to-date]
          Updating tool-teensy @ 1.1.0:   [Up-to-date]
          Updating framework-mbed @ 1.121.1:  [Up-to-date]
          Updating tool-scons @ 2.4.1:    [Up-to-date]
          Updating toolchain-atmelavr @ 1.40801.0:    [Up-to-date]
          Updating toolchain-gccarmnoneeabi @ 1.40804.0:  [Up-to-date]

          Platform nordicnrf51
          --------
          Updating nordicnrf51 @ 0.0.0:   [Up-to-date]
          Updating toolchain-gccarmnoneeabi @ 1.40804.0:  [Up-to-date]
          Updating framework-arduinonordicnrf51 @ 1.20302.0:  [Up-to-date]
          Updating framework-mbed @ 1.121.1:  [Up-to-date]
          Updating tool-scons @ 2.4.1:    [Up-to-date]

          Platform titiva
          --------
          Updating titiva @ 0.0.0:    [Up-to-date]
          Updating framework-libopencm3 @ 1.1.0:  [Up-to-date]
          Updating toolchain-gccarmnoneeabi @ 1.40804.0:  [Up-to-date]
          Updating framework-energiativa @ 1.17.0:    [Up-to-date]
          Updating tool-scons @ 2.4.1:    [Up-to-date]

          Platform atmelsam
          --------
          Updating atmelsam @ 0.0.0:  [Up-to-date]
          Updating toolchain-gccarmnoneeabi @ 1.40804.0:  [Up-to-date]
          Updating tool-openocd @ 1.900.0:    [Up-to-date]
          Updating framework-mbed @ 1.121.1:  [Up-to-date]
          Updating tool-scons @ 2.4.1:    [Up-to-date]
          Updating tool-avrdude @ 1.60001.1:  [Up-to-date]
          Updating tool-bossac @ 1.10601.0:   [Up-to-date]

          Platform siliconlabsefm32
          --------
          Updating siliconlabsefm32 @ 0.0.0:  [Up-to-date]
          Updating framework-mbed @ 1.121.1:  [Up-to-date]
          Updating toolchain-gccarmnoneeabi @ 1.40804.0:  [Up-to-date]
          Updating tool-scons @ 2.4.1:    [Up-to-date]

          Platform microchippic32
          --------
          Updating microchippic32 @ 0.0.0:    [Up-to-date]
          Updating framework-arduinomicrochippic32 @ 1.10201.0:   [Up-to-date]
          Updating toolchain-microchippic32 @ 1.40803.0:  [Up-to-date]
          Updating tool-pic32prog @ 1.200200.0:   [Up-to-date]
          Updating tool-scons @ 2.4.1:    [Up-to-date]

          Platform linux_i686
          --------
          Updating linux_i686 @ 0.0.0:    [Up-to-date]
          Updating toolchain-gcclinux32 @ 1.40801.0:  [Up-to-date]
          Updating tool-scons @ 2.4.1:    [Up-to-date]

          Platform intel_arc32
          --------
          Updating intel_arc32 @ 0.0.0:   [Up-to-date]
          Updating framework-arduinointel @ 1.10006.0:    [Up-to-date]
          Updating tool-arduino101load @ 1.124.0:     [Up-to-date]
          Updating toolchain-intelarc32 @ 1.40805.0:  [Up-to-date]
          Updating tool-scons @ 2.4.1:    [Up-to-date]

          Platform nxplpc
          --------
          Updating nxplpc @ 0.0.0:    [Up-to-date]
          Updating framework-mbed @ 1.121.1:  [Up-to-date]
          Updating toolchain-gccarmnoneeabi @ 1.40804.0:  [Up-to-date]
          Updating tool-scons @ 2.4.1:    [Up-to-date]

          Platform linux_arm
          --------
          Updating linux_arm @ 0.0.0:     [Up-to-date]
          Updating toolchain-gccarmlinuxgnueabi @ 1.40802.0:  [Up-to-date]
          Updating tool-scons @ 2.4.1:    [Up-to-date]

          Platform native
          --------
          Updating native @ 0.0.0:    [Up-to-date]
          Updating tool-scons @ 2.4.1:    [Up-to-date]

          Library Manager
          ===============
          Updating Adafruit-GFX @ 334e815bc1:     [Up-to-date]
          Updating Adafruit-ST7735 @ d53d4bf03a:  [Up-to-date]
          Updating Adafruit-DHT @ 09344416d2:     [Up-to-date]
          Updating Adafruit-Unified-Sensor @ f2af6f4efc:  [Up-to-date]
          Updating ESP8266_SSD1306 @ 3.2.3:   [Up-to-date]
          Updating EngduinoMagnetometer @ 3.1.0:  [Up-to-date]
          Updating IRremote @ 2.2.1:  [Up-to-date]
          Updating Json @ 5.6.4:  [Up-to-date]
          Updating MODSERIAL @ d8422efe47:    [Up-to-date]
          Updating PJON @ 1fb26fd:    [Checking]
          git version 2.7.4 (Apple Git-66)
          Already up-to-date.
          Updating Servo @ 36b69a7ced07:  [Checking]
          Mercurial Distributed SCM (version 3.8.4)
          (see https://mercurial-scm.org for more information)

          Copyright (C) 2005-2016 Matt Mackall and others
          This is free software; see the source for copying conditions. There is NO
          warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
          pulling from https://developer.mbed.org/users/simon/code/Servo/
          searching for changes
          no changes found
          Updating TextLCD @ 308d188a2d3a:    [Checking]
          Mercurial Distributed SCM (version 3.8.4)
          (see https://mercurial-scm.org for more information)

          Copyright (C) 2005-2016 Matt Mackall and others
          This is free software; see the source for copying conditions. There is NO
          warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
          pulling from https://developer.mbed.org/users/simon/code/TextLCD/
          searching for changes
          no changes found

   platformio run
   Contentsplatformio runUsageDescriptionOptionsExamples

   Usage
          platformio run [OPTIONS]
          pio run [OPTIONS]

   Description
       Process environments which are defined in projectconf file

   Options
       -e, --environment

       Process specified environments.

       You can also specify which environments should be processed by default using projectconf_pio_default_envs
       option from projectconf.

       -t, --target

       Process specified targets.

       NOTE:
          You  can  configure  default  targets  per  project  environment  using  projectconf_targets option in
          projectconf.

       Built-in targets:

       • Processing

            • clean delete compiled object files, libraries and firmware/program binaries

            • upload firmware "auto-uploading" for embedded platforms

            • debug build using Debug Configuration

            • program firmware "auto-uploading" for embedded platforms using external programmer (available only
              for platform_atmelavr)

            • fuses set fuse bits (available only for platform_atmelavr)

            • buildfs platform_espressif_uploadfs

            • uploadfs platform_espressif_uploadfs

            • size print the size of the sections in a firmware/program

            • checkprogsize check maximum allowed firmware size for uploading

            • erase erase device flash (not available on the all platforms)

            • compiledb build compilation_db

       • Device

            • monitor  automatically  start  cmd_device_monitor after success build operation. You can configure
              monitor using projectconf_section_env_monitor.

       • Service

            • envdump dump current build environment

            • idedata export build environment for IDE (defines, build flags, CPPPATH, etc.)

       --upload-port

       Custom upload port of embedded board. To print all available ports use cmd_device_list command.

       If upload port is not specified, PlatformIO will try to detect it automatically.

       -d, --project-dir

       Specify the path to project directory. By default, --project-dir is equal to  current  working  directory
       (CWD).

       -c, --project-conf

       New in version 4.0.

       Process project with a custom projectconf.

       -j, --jobs

       New in version 4.0.

       Control a number of parallel build jobs. Default is a number of CPUs in a system.

       -s, --silent

       Suppress progress reporting

       -v, --verbose

       Shows detailed information when processing environments.

       This  option  can  also  be  set  globally using setting_force_verbose setting or by environment variable
       PLATFORMIO_SETTING_FORCE_VERBOSE.

       --disable-auto-clean

       Disable auto-clean of projectconf_pio_build_dir  when  projectconf  or  projectconf_pio_src_dir  (project
       structure) have been modified.

   Examples
       1. Process Wiring Blink Example

          > platformio run

          [Wed Sep  7 15:48:58 2016] Processing uno (platform: atmelavr, board: uno, framework: arduino)
          -----------------------------------------------------------------------------------------------
          Verbose mode can be enabled via `-v, --verbose` option
          Collected 36 compatible libraries
          Looking for dependencies...
          Project does not have dependencies
          Compiling .pio/build/uno/src/main.o
          Archiving .pio/build/uno/libFrameworkArduinoVariant.a
          Indexing .pio/build/uno/libFrameworkArduinoVariant.a
          Compiling .pio/build/uno/FrameworkArduino/CDC.o
          ...
          Compiling .pio/build/uno/FrameworkArduino/wiring_shift.o
          Archiving .pio/build/uno/libFrameworkArduino.a
          Indexing .pio/build/uno/libFrameworkArduino.a
          Linking .pio/build/uno/firmware.elf
          Building .pio/build/uno/firmware.hex
          Calculating size .pio/build/uno/firmware.elf
          AVR Memory Usage
          ----------------
          Device: atmega328p

          Program:    1034 bytes (3.2% Full)
          (.text + .data + .bootloader)

          Data:          9 bytes (0.4% Full)
          (.data + .bss + .noinit)

          =========================== [SUCCESS] Took 2.47 seconds ===========================

          [Wed Sep  7 15:49:01 2016] Processing nodemcu (platform: espressif8266, board: nodemcu, framework: arduino)
          -----------------------------------------------------------------------------------------------
          Verbose mode can be enabled via `-v, --verbose` option
          Collected 34 compatible libraries
          Looking for dependencies...
          Project does not have dependencies
          Compiling .pio/build/nodemcu/src/main.o
          Archiving .pio/build/nodemcu/libFrameworkArduinoVariant.a
          Indexing .pio/build/nodemcu/libFrameworkArduinoVariant.a
          Compiling .pio/build/nodemcu/FrameworkArduino/Esp.o
          Compiling .pio/build/nodemcu/FrameworkArduino/FS.o
          Compiling .pio/build/nodemcu/FrameworkArduino/HardwareSerial.o
          ...
          Archiving .pio/build/nodemcu/libFrameworkArduino.a
          Indexing .pio/build/nodemcu/libFrameworkArduino.a
          Linking .pio/build/nodemcu/firmware.elf
          Calculating size .pio/build/nodemcu/firmware.elf
          text       data     bss     dec     hex filename
          221240      888   29400  251528   3d688 .pio/build/nodemcu/firmware.elf
          Building .pio/build/nodemcu/firmware.bin
          =========================== [SUCCESS] Took 6.43 seconds ===========================

          [Wed Sep  7 15:49:07 2016] Processing teensy31 (platform: teensy, board: teensy31, framework: arduino)
          -----------------------------------------------------------------------------------------------
          Verbose mode can be enabled via `-v, --verbose` option
          Collected 96 compatible libraries
          Looking for dependencies...
          Project does not have dependencies
          Compiling .pio/build/teensy31/src/main.o
          Compiling .pio/build/teensy31/FrameworkArduino/AudioStream.o
          Compiling .pio/build/teensy31/FrameworkArduino/DMAChannel.o
          ...
          Compiling .pio/build/teensy31/FrameworkArduino/yield.o
          Archiving .pio/build/teensy31/libFrameworkArduino.a
          Indexing .pio/build/teensy31/libFrameworkArduino.a
          Linking .pio/build/teensy31/firmware.elf
          Calculating size .pio/build/teensy31/firmware.elf
          text       data     bss     dec     hex filename
          11288       168    2288   13744    35b0 .pio/build/teensy31/firmware.elf
          Building .pio/build/teensy31/firmware.hex
          =========================== [SUCCESS] Took 5.36 seconds ===========================

          [Wed Sep  7 15:49:12 2016] Processing lpmsp430g2553 (platform: timsp430, build_flags: -D LED_BUILTIN=RED_LED, board: lpmsp430g2553, framework: arduino)
          -----------------------------------------------------------------------------------------------
          Verbose mode can be enabled via `-v, --verbose` option
          Collected 29 compatible libraries
          Looking for dependencies...
          Project does not have dependencies
          Compiling .pio/build/lpmsp430g2553/src/main.o
          Compiling .pio/build/lpmsp430g2553/FrameworkAnergia/HardwareSerial.o
          Compiling .pio/build/lpmsp430g2553/FrameworkAnergia/IPAddress.o
          ...
          Compiling .pio/build/lpmsp430g2553/FrameworkAnergia/wiring_digital.o
          Compiling .pio/build/lpmsp430g2553/FrameworkAnergia/wiring_pulse.o
          Compiling .pio/build/lpmsp430g2553/FrameworkAnergia/wiring_shift.o
          Archiving .pio/build/lpmsp430g2553/libFrameworkAnergia.a
          Indexing .pio/build/lpmsp430g2553/libFrameworkAnergia.a
          Linking .pio/build/lpmsp430g2553/firmware.elf
          Calculating size .pio/build/lpmsp430g2553/firmware.elf
          text       data     bss     dec     hex filename
          820           0      20     840     348 .pio/build/lpmsp430g2553/firmware.elf
          Building .pio/build/lpmsp430g2553/firmware.hex
          =========================== [SUCCESS] Took 2.34 seconds ===========================

       2. Process specific environment

          > platformio run -e nodemcu -e teensy31

          [Wed Sep  7 15:49:01 2016] Processing nodemcu (platform: espressif8266, board: nodemcu, framework: arduino)
          -----------------------------------------------------------------------------------------------
          Verbose mode can be enabled via `-v, --verbose` option
          Collected 34 compatible libraries
          Looking for dependencies...
          Project does not have dependencies
          Compiling .pio/build/nodemcu/src/main.o
          Archiving .pio/build/nodemcu/libFrameworkArduinoVariant.a
          Indexing .pio/build/nodemcu/libFrameworkArduinoVariant.a
          Compiling .pio/build/nodemcu/FrameworkArduino/Esp.o
          Compiling .pio/build/nodemcu/FrameworkArduino/FS.o
          Compiling .pio/build/nodemcu/FrameworkArduino/HardwareSerial.o
          ...
          Archiving .pio/build/nodemcu/libFrameworkArduino.a
          Indexing .pio/build/nodemcu/libFrameworkArduino.a
          Linking .pio/build/nodemcu/firmware.elf
          Calculating size .pio/build/nodemcu/firmware.elf
          text       data     bss     dec     hex filename
          221240      888   29400  251528   3d688 .pio/build/nodemcu/firmware.elf
          Building .pio/build/nodemcu/firmware.bin
          =========================== [SUCCESS] Took 6.43 seconds ===========================

          [Wed Sep  7 15:49:07 2016] Processing teensy31 (platform: teensy, board: teensy31, framework: arduino)
          -----------------------------------------------------------------------------------------------
          Verbose mode can be enabled via `-v, --verbose` option
          Collected 96 compatible libraries
          Looking for dependencies...
          Project does not have dependencies
          Compiling .pio/build/teensy31/src/main.o
          Compiling .pio/build/teensy31/FrameworkArduino/AudioStream.o
          Compiling .pio/build/teensy31/FrameworkArduino/DMAChannel.o
          ...
          Compiling .pio/build/teensy31/FrameworkArduino/yield.o
          Archiving .pio/build/teensy31/libFrameworkArduino.a
          Indexing .pio/build/teensy31/libFrameworkArduino.a
          Linking .pio/build/teensy31/firmware.elf
          Calculating size .pio/build/teensy31/firmware.elf
          text       data     bss     dec     hex filename
          11288       168    2288   13744    35b0 .pio/build/teensy31/firmware.elf
          Building .pio/build/teensy31/firmware.hex
          =========================== [SUCCESS] Took 5.36 seconds ===========================

       3. Process specific target (clean project)

          > platformio run -t clean
          [Wed Sep  7 15:53:26 2016] Processing uno (platform: atmelavr, board: uno, framework: arduino)
          -----------------------------------------------------------------------------------------------------
          Removed .pio/build/uno/firmware.elf
          Removed .pio/build/uno/firmware.hex
          Removed .pio/build/uno/libFrameworkArduino.a
          Removed .pio/build/uno/libFrameworkArduinoVariant.a
          Removed .pio/build/uno/FrameworkArduino/_wiring_pulse.o
          Removed .pio/build/uno/FrameworkArduino/abi.o
          Removed .pio/build/uno/FrameworkArduino/CDC.o
          Removed .pio/build/uno/FrameworkArduino/HardwareSerial.o
          Removed .pio/build/uno/FrameworkArduino/HardwareSerial0.o
          Removed .pio/build/uno/FrameworkArduino/HardwareSerial1.o
          Removed .pio/build/uno/FrameworkArduino/HardwareSerial2.o
          Removed .pio/build/uno/FrameworkArduino/HardwareSerial3.o
          Removed .pio/build/uno/FrameworkArduino/hooks.o
          Removed .pio/build/uno/FrameworkArduino/IPAddress.o
          Removed .pio/build/uno/FrameworkArduino/main.o
          Removed .pio/build/uno/FrameworkArduino/new.o
          Removed .pio/build/uno/FrameworkArduino/PluggableUSB.o
          Removed .pio/build/uno/FrameworkArduino/Print.o
          Removed .pio/build/uno/FrameworkArduino/Stream.o
          Removed .pio/build/uno/FrameworkArduino/Tone.o
          Removed .pio/build/uno/FrameworkArduino/USBCore.o
          Removed .pio/build/uno/FrameworkArduino/WInterrupts.o
          Removed .pio/build/uno/FrameworkArduino/wiring.o
          Removed .pio/build/uno/FrameworkArduino/wiring_analog.o
          Removed .pio/build/uno/FrameworkArduino/wiring_digital.o
          Removed .pio/build/uno/FrameworkArduino/wiring_pulse.o
          Removed .pio/build/uno/FrameworkArduino/wiring_shift.o
          Removed .pio/build/uno/FrameworkArduino/WMath.o
          Removed .pio/build/uno/FrameworkArduino/WString.o
          Removed .pio/build/uno/src/main.o
          Done cleaning
          ======================= [SUCCESS] Took 0.49 seconds =======================

          [Wed Sep  7 15:53:27 2016] Processing nodemcu (platform: espressif8266, board: nodemcu, framework: arduino)
          -----------------------------------------------------------------------------------------------------
          Removed .pio/build/nodemcu/firmware.bin
          Removed .pio/build/nodemcu/firmware.elf
          Removed .pio/build/nodemcu/libFrameworkArduino.a
          Removed .pio/build/nodemcu/libFrameworkArduinoVariant.a
          ...
          Removed .pio/build/nodemcu/FrameworkArduino/spiffs/spiffs_nucleus.o
          Removed .pio/build/nodemcu/FrameworkArduino/umm_malloc/umm_malloc.o
          Removed .pio/build/nodemcu/src/main.o
          Done cleaning
          ======================= [SUCCESS] Took 0.50 seconds =======================

          [Wed Sep  7 15:53:27 2016] Processing teensy31 (platform: teensy, board: teensy31, framework: arduino)
          -----------------------------------------------------------------------------------------------------
          Removed .pio/build/teensy31/firmware.elf
          Removed .pio/build/teensy31/firmware.hex
          Removed .pio/build/teensy31/libFrameworkArduino.a
          Removed .pio/build/teensy31/FrameworkArduino/analog.o
          Removed .pio/build/teensy31/FrameworkArduino/AudioStream.o
          ...
          Removed .pio/build/teensy31/FrameworkArduino/WString.o
          Removed .pio/build/teensy31/FrameworkArduino/yield.o
          Removed .pio/build/teensy31/src/main.o
          Done cleaning
          ======================= [SUCCESS] Took 0.50 seconds =======================

          [Wed Sep  7 15:53:28 2016] Processing lpmsp430g2553 (platform: timsp430, build_flags: -D LED_BUILTIN=RED_LED, board: lpmsp430g2553, framework: energia)
          -----------------------------------------------------------------------------------------------------
          Removed .pio/build/lpmsp430g2553/firmware.elf
          Removed .pio/build/lpmsp430g2553/firmware.hex
          Removed .pio/build/lpmsp430g2553/libFrameworkAnergia.a
          Removed .pio/build/lpmsp430g2553/FrameworkAnergia/atof.o
          ...
          Removed .pio/build/lpmsp430g2553/FrameworkAnergia/avr/dtostrf.o
          Removed .pio/build/lpmsp430g2553/src/main.o
          Done cleaning
          ======================= [SUCCESS] Took 0.49 seconds =======================

       4. Mix environments and targets

          > platformio run -e uno -t upload

          [Wed Sep  7 15:55:11 2016] Processing uno (platform: atmelavr, board: uno, framework: arduino)
          --------------------------------------------------------------------------------------------------
          Verbose mode can be enabled via `-v, --verbose` option
          Collected 36 compatible libraries
          Looking for dependencies...
          Project does not have dependencies
          Compiling .pio/build/uno/src/main.o
          Archiving .pio/build/uno/libFrameworkArduinoVariant.a
          Indexing .pio/build/uno/libFrameworkArduinoVariant.a
          Compiling .pio/build/uno/FrameworkArduino/CDC.o
          ...
          Compiling .pio/build/uno/FrameworkArduino/wiring_shift.o
          Archiving .pio/build/uno/libFrameworkArduino.a
          Indexing .pio/build/uno/libFrameworkArduino.a
          Linking .pio/build/uno/firmware.elf
          Checking program size .pio/build/uno/firmware.elf
          text       data     bss     dec     hex filename
          1034          0       9    1043     413 .pio/build/uno/firmware.elf
          Building .pio/build/uno/firmware.hex
          Looking for upload port...
          Auto-detected: /dev/cu.usbmodemFA141
          Uploading .pio/build/uno/firmware.hex

          avrdude: AVR device initialized and ready to accept instructions

          Reading | ################################################## | 100% 0.01s

          avrdude: Device signature = 0x1e950f
          avrdude: reading input file ".pio/build/uno/firmware.hex"
          avrdude: writing flash (1034 bytes):

          Writing | ################################################## | 100% 0.18s

          avrdude: 1034 bytes of flash written
          avrdude: verifying flash memory against .pio/build/uno/firmware.hex:
          avrdude: load data flash data from input file .pio/build/uno/firmware.hex:
          avrdude: input file .pio/build/uno/firmware.hex contains 1034 bytes
          avrdude: reading on-chip flash data:

          Reading | ################################################## | 100% 0.15s

          avrdude: verifying ...
          avrdude: 1034 bytes of flash verified

          avrdude: safemode: Fuses OK (H:00, E:00, L:00)

          avrdude done.  Thank you.

          ======================== [SUCCESS] Took 4.14 seconds ========================

   platformio settings
       Manage PlatformIO settings

   Contentsplatformio settingsplatformio settings getUsageDescriptionSettingsauto_update_librariesauto_update_platformscheck_libraries_intervalcheck_platformio_intervalcheck_platforms_intervalenable_cachestrict_sslenable_telemetryforce_verboseprojects_dirExamplesplatformio settings setUsageDescriptionExamplesplatformio settings resetUsageDescriptionExamples

   platformio settings get
   Usage
          platformio settings get [NAME]
          pio settings get [NAME]

   Description
       NOTE:

          • The Yes value is equal to: True, Y, 1 and is not case sensitive.

          • You can override these settings using envvars.

       Get/List existing settings

   Settings
   auto_update_libraries
       Default
              No

       Values Yes/No

       Automatically update libraries.

   auto_update_platforms
       Default
              No

       Values Yes/No

       Automatically update platforms.

   check_libraries_interval
       Default
              7

       Values Days (Number)

       Check for the library updates interval.

   check_platformio_interval
       Default
              3

       Values Days (Number)

       Check for the new PlatformIO interval.

   check_platforms_interval
       Default
              7

       Values Days (Number)

       Check for the platform updates interval.

   enable_cache
       Default
              Yes

       Values Yes/No

       Enable caching for API requests and Library Manager

   strict_ssl
       Default
              No

       Values Yes/No

       Strict SSL for PlatformIO Services

   enable_telemetry
       Default
              Yes

       Values Yes/No

       Share minimal diagnostics and usage information to help us make PlatformIO better.

       The  source  code  of  telemetry  service is open source.  You can make sure that we DO NOT SHARE PRIVATE
       information or source code of your project. All information shares ANONYMOUSLY.

       Which data do we collect and why?

       • A version of  Python  Interpreter.  piocore  is  written  in  Python  language,  including  development
         platforms.  We need to know which Python version produces such type of exceptions (see below), which is
         more popular, which version we should drop and focus on a new one

       • piocore errors/exceptions. We report automatically fatal exceptions raised by  PlatformIO  Core  source
         code but NOT by your project

       • The  name  of  the used platform, board, framework. We collect this type of information to have a clear
         picture which software products are the most widely used by our Community and for the which  we  should
         provide frequent updates and add new features ( for example, "atmelavr", "arduino", "uno", etc.)

       • The name of CLI command. It helps us to improve our CLI. For example, "run", "lib list")

       • The  name  of  ide. This is very important information for us. We create native extensions based on the
         popularity of IDEs (for example, ide_vscode, ide_clion)

       Thanks a lot that you keep this setting enabled!

   force_verbose
       Default
              No

       Values Yes/No

       Force verbose output when processing environments. This setting overrides

       • platformio run --verboseplatformio ci --verboseplatformio test --verbose

   projects_dir
       Default
              ~/Documents/PlatformIO/Projects

       Values Path to folder

       Default location for PlatformIO projects (PIO Home)

   Examples
       1. List all settings and theirs current values

          > platformio settings get

          Name                            Value [Default]   Description
          ------------------------------------------------------------------------------------------
          auto_update_libraries           No                Automatically update libraries (Yes/No)
          auto_update_platforms           No                Automatically update platforms (Yes/No)
          check_libraries_interval        7                 Check for the library updates interval (days)
          check_platformio_interval       3                 Check for the new PlatformIO interval (days)
          check_platforms_interval        7                 Check for the platform updates interval (days)
          enable_cache                    Yes               Enable caching for API requests and Library Manager
          strict_ssl                      No                Strict SSL for PlatformIO Services
          enable_telemetry                Yes               Telemetry service?#enable-telemetry> (Yes/No)
          force_verbose                   No                Force verbose output when processing environments
          projects_dir                    ~/Documents/PlatformIO/Projects Default location for PlatformIO projects (PIO Home)

       2. Show specified setting

          $ platformio settings get auto_update_platforms
          Name                            Value [Default]   Description
          ------------------------------------------------------------------------------------------
          auto_update_platforms           Yes               Automatically update platforms (Yes/No)

   platformio settings set
   Usage
          platformio settings set NAME VALUE

   Description
       Set new value for the setting

   Examples
       Change to check for the new PlatformIO each day

          $ platformio settings set check_platformio_interval 1
          The new value for the setting has been set!
          Name                            Value [Default]   Description
          ------------------------------------------------------------------------------------------
          check_platformio_interval       1 [3]             Check for the new PlatformIO interval (days)

   platformio settings reset
   Usage
          platformio settings reset

   Description
       Reset settings to default

   Examples
          $ platformio settings reset
          The settings have been reset!

          Name                            Value [Default]   Description
          ------------------------------------------------------------------------------------------
          auto_update_libraries           No                Automatically update libraries (Yes/No)
          auto_update_platforms           No                Automatically update platforms (Yes/No)
          check_libraries_interval        7                 Check for the library updates interval (days)
          check_platformio_interval       3                 Check for the new PlatformIO interval (days)
          check_platforms_interval        7                 Check for the platform updates interval (days)
          enable_cache                    Yes               Enable caching for API requests and Library Manager
          strict_ssl                      No                Enable SSL for PlatformIO Services
          enable_telemetry                Yes               Telemetry service?#enable-telemetry> (Yes/No)
          force_verbose                   No                Force verbose output when processing environments
          projects_dir                    ~/Documents/PlatformIO/Projects Default location for PlatformIO projects (PIO Home)

   platformio system
       Miscellaneous system commands.

       To print all available commands and options use:

          platformio system --help
          platformio system COMMAND --help
          pio system --help

   PlatformIO Shell Completion
       Shell completion support for

       • FishZshBashPowerShell

       To print all available commands and options use:

          platformio misc completion --help
          platformio misc completion COMMAND --help
          pio misc completion --help

   platformio misc completion install
   Contentsplatformio misc completion installUsageDescriptionOptionsExamples

   Usage
          platformio misc completion install [OPTIONS]
          pio misc completion install [OPTIONS]

   Description
       Install shell completion files or code.

   Options
       --shell

       The shell type, default is auto and will be detected from a current shell session.

       Supported shells are:

       • fishzshbashpowershell

       --path

       Custom installation path of the code to be evaluated by the shell.  The  standard  installation  path  is
       used by default.

   Examples
          > pio misc completion install

          PlatformIO CLI completion has been installed for fish shell to ~/.config/fish/completions/pio.fish
          Please restart a current shell session

   platformio misc completion uninstall
   Contentsplatformio misc completion uninstallUsageDescriptionOptionsExamples

   Usage
          platformio misc completion uninstall [OPTIONS]
          pio misc completion uninstall [OPTIONS]

   Description
       Uninstall shell completion files or code.

   Options
       --shell

       The shell type, default is auto and will be detected from a current shell session.

       Supported shells are:

       • fishzshbashpowershell

       --path

       Custom  installation  path  of  the code to be evaluated by the shell.  The standard installation path is
       used by default.

   Examples
          > pio misc completion uninstall

          PlatformIO CLI completion has been uninstalled for fish shell from ~/.config/fish/completions/pio.fish
          Please restart a current shell session.

   platformio test
       Helper command for local unit_testing.

   Contentsplatformio testUsageDescriptionOptionsExamples

   Usage
          platformio test [OPTIONS]
          pio test [OPTIONS]

   Description
       Run locally tests from PlatformIO based project. More details about PlatformIO unit_testing.

       This command allows you to apply the tests for the environments specified in projectconf.

   Options
       -e, --environment

       Process specified environments. More details platformio run --environment

       -f, --filter

       Process only the tests where the name matches specified patterns. More than one pattern  is  allowed.  If
       you  need  to filter some tests for a specific environment, please take a look at projectconf_test_filter
       option from projectconf.

                                     ┌────────┬──────────────────────────────────┐
                                     │Pattern │ Meaning                          │
                                     ├────────┼──────────────────────────────────┤
                                     │*       │ matches everything               │
                                     ├────────┼──────────────────────────────────┤
                                     │?       │ matches any single character     │
                                     ├────────┼──────────────────────────────────┤
                                     │[seq]   │ matches any character in seq     │
                                     └────────┴──────────────────────────────────┘

                                     │[!seq]  │ matches any character not in seq │
                                     └────────┴──────────────────────────────────┘

       For example, platformio test --filter "mytest*" -i "test[13]"

       -i, --ignore

       Ignore tests where the name matches specified patterns. More than one pattern is allowed. If you need  to
       ignore  some  tests for a specific environment, please take a look at projectconf_test_ignore option from
       projectconf.

                                     ┌────────┬──────────────────────────────────┐
                                     │Pattern │ Meaning                          │
                                     ├────────┼──────────────────────────────────┤
                                     │*       │ matches everything               │
                                     ├────────┼──────────────────────────────────┤
                                     │?       │ matches any single character     │
                                     ├────────┼──────────────────────────────────┤
                                     │[seq]   │ matches any character in seq     │
                                     ├────────┼──────────────────────────────────┤
                                     │[!seq]  │ matches any character not in seq │
                                     └────────┴──────────────────────────────────┘

       For example, platformio test --ignore "mytest*" -i "test[13]"

       --upload-port

       A port that is intended for firmware uploading.  To  list  available  ports  please  use  cmd_device_list
       command.

       If upload port is not specified, PlatformIO will try to detect it automatically.

       --test-port

       A  Serial/UART  port  that PlatformIO uses as communication interface between PlatformIO Unit Test Engine
       and target device. To list available ports please use cmd_device_list command.

       If test port is not specified, PlatformIO will try to detect it automatically.

       -d, --project-dir

       Specify the path to project directory. By default, --project-dir is equal to  current  working  directory
       (CWD).

       -c, --project-conf

       New in version 4.0.

       Process project with a custom projectconf.

       --without-building

       Skip building stage.

       --without-uploading

       Skip uploading stage

       --no-reset

       Disable software reset via Serial.DTR/RST before test running. In this case, need to press "reset" button
       manually after firmware uploading.

       WARNING:
          If board does not support software reset via Serial.DTR/RTS you should add  >2  seconds  delay  before
          UNITY_BEGIN()`.   We  need  that  time  to establish a ``Serial communication between host machine and
          target device. See unit_testing.

       --monitor-rts

       Set initial RTS line state for Serial Monitor (0 or 1), default 1. We use it to gather test  results  via
       Serial connection.

       --monitor-dtr

       Set  initial  DTR line state for Serial Monitor (0 or 1), default 1. We use it to gather test results via
       Serial connection.

       -v, --verbose

       Shows detailed information when processing environments.

       This option can also be set globally using  setting_force_verbose  setting  or  by  environment  variable
       PLATFORMIO_SETTING_FORCE_VERBOSE.

   Examples
       For the examples please follow to unit_testing page.

   platformio update
   Contentsplatformio updateUsageDescriptionOptionsExamples

   Usage
          platformio update [OPTIONS]
          pio update [OPTIONS]

   Description
       Check  or update installed PIO Core packages, platforms and global Libraries. This command is combination
       of 2 sub-commands:

       • cmd_platform_update

       • cmd_lib_update

   Options
       --core-packages

       Update only the core packages

       -c, --only-check

       DEPRECATED. Please use --dry-run instead.

       --dry-run

       Do not update, only check for the new versions

   Examples
          > platformio update

          Platform Manager
          ================
          Platform timsp430
          --------
          Updating timsp430 @ 0.0.0:  [Up-to-date]
          Updating toolchain-timsp430 @ 1.40603.0:    [Up-to-date]
          Updating framework-energiamsp430 @ 1.17.0:  [Up-to-date]
          Updating tool-scons @ 2.4.1:    [Up-to-date]

          Platform freescalekinetis
          --------
          Updating freescalekinetis @ 0.0.0:  [Up-to-date]
          Updating framework-mbed @ 1.121.1:  [Up-to-date]
          Updating toolchain-gccarmnoneeabi @ 1.40804.0:  [Up-to-date]
          Updating tool-scons @ 2.4.1:    [Up-to-date]

          Platform ststm32
          --------
          Updating ststm32 @ 0.0.0:   [Up-to-date]
          Updating framework-libopencm3 @ 1.1.0:  [Up-to-date]
          Updating toolchain-gccarmnoneeabi @ 1.40804.0:  [Up-to-date]
          Updating tool-stlink @ 1.10200.0:   [Up-to-date]
          Updating framework-spl @ 1.10201.0:     [Up-to-date]
          Updating framework-cmsis @ 1.40300.0:   [Up-to-date]
          Updating framework-mbed @ 1.121.1:  [Up-to-date]
          Updating tool-scons @ 2.4.1:    [Up-to-date]

          Platform lattice_ice40
          --------
          Updating lattice_ice40 @ 0.0.0:     [Up-to-date]
          Updating toolchain-icestorm @ 1.7.0:    [Up-to-date]
          Updating tool-scons @ 2.4.1:    [Up-to-date]

          Platform atmelavr
          --------
          Updating atmelavr @ 0.0.0:  [Up-to-date]
          Updating framework-arduinoavr @ 1.10608.1:  [Up-to-date]
          Updating tool-avrdude @ 1.60001.1:  [Up-to-date]
          Updating toolchain-atmelavr @ 1.40801.0:    [Up-to-date]
          Updating tool-scons @ 2.4.1:    [Up-to-date]

          Platform espressif8266
          --------
          Updating espressif8266 @ 0.0.0:     [Up-to-date]
          Updating tool-scons @ 2.4.1:    [Up-to-date]
          Updating toolchain-xtensa @ 1.40802.0:  [Up-to-date]
          Updating tool-esptool @ 1.409.0:    [Up-to-date]
          Updating tool-mkspiffs @ 1.102.0:   [Up-to-date]
          Updating framework-arduinoespressif8266 @ 1.20300.0:    [Up-to-date]
          Updating sdk-esp8266 @ 1.10502.0:   [Up-to-date]

          Platform linux_x86_64
          --------
          Updating linux_x86_64 @ 0.0.0:  [Up-to-date]
          Updating toolchain-gcclinux64 @ 1.40801.0:  [Up-to-date]
          Updating tool-scons @ 2.4.1:    [Up-to-date]

          Platform windows_x86
          --------
          Updating windows_x86 @ 0.0.0:   [Up-to-date]
          Updating toolchain-gccmingw32 @ 1.40800.0:  [Up-to-date]
          Updating tool-scons @ 2.4.1:    [Up-to-date]

          Platform teensy
          --------
          Updating teensy @ 0.0.0:    [Up-to-date]
          Updating framework-arduinoteensy @ 1.128.0:     [Up-to-date]
          Updating tool-teensy @ 1.1.0:   [Up-to-date]
          Updating framework-mbed @ 1.121.1:  [Up-to-date]
          Updating tool-scons @ 2.4.1:    [Up-to-date]
          Updating toolchain-atmelavr @ 1.40801.0:    [Up-to-date]
          Updating toolchain-gccarmnoneeabi @ 1.40804.0:  [Up-to-date]

          Platform nordicnrf51
          --------
          Updating nordicnrf51 @ 0.0.0:   [Up-to-date]
          Updating toolchain-gccarmnoneeabi @ 1.40804.0:  [Up-to-date]
          Updating framework-arduinonordicnrf51 @ 1.20302.0:  [Up-to-date]
          Updating framework-mbed @ 1.121.1:  [Up-to-date]
          Updating tool-scons @ 2.4.1:    [Up-to-date]

          Platform titiva
          --------
          Updating titiva @ 0.0.0:    [Up-to-date]
          Updating framework-libopencm3 @ 1.1.0:  [Up-to-date]
          Updating toolchain-gccarmnoneeabi @ 1.40804.0:  [Up-to-date]
          Updating framework-energiativa @ 1.17.0:    [Up-to-date]
          Updating tool-scons @ 2.4.1:    [Up-to-date]

          Platform atmelsam
          --------
          Updating atmelsam @ 0.0.0:  [Up-to-date]
          Updating toolchain-gccarmnoneeabi @ 1.40804.0:  [Up-to-date]
          Updating tool-openocd @ 1.900.0:    [Up-to-date]
          Updating framework-mbed @ 1.121.1:  [Up-to-date]
          Updating tool-scons @ 2.4.1:    [Up-to-date]
          Updating tool-avrdude @ 1.60001.1:  [Up-to-date]
          Updating tool-bossac @ 1.10601.0:   [Up-to-date]

          Platform siliconlabsefm32
          --------
          Updating siliconlabsefm32 @ 0.0.0:  [Up-to-date]
          Updating framework-mbed @ 1.121.1:  [Up-to-date]
          Updating toolchain-gccarmnoneeabi @ 1.40804.0:  [Up-to-date]
          Updating tool-scons @ 2.4.1:    [Up-to-date]

          Platform microchippic32
          --------
          Updating microchippic32 @ 0.0.0:    [Up-to-date]
          Updating framework-arduinomicrochippic32 @ 1.10201.0:   [Up-to-date]
          Updating toolchain-microchippic32 @ 1.40803.0:  [Up-to-date]
          Updating tool-pic32prog @ 1.200200.0:   [Up-to-date]
          Updating tool-scons @ 2.4.1:    [Up-to-date]

          Platform linux_i686
          --------
          Updating linux_i686 @ 0.0.0:    [Up-to-date]
          Updating toolchain-gcclinux32 @ 1.40801.0:  [Up-to-date]
          Updating tool-scons @ 2.4.1:    [Up-to-date]

          Platform intel_arc32
          --------
          Updating intel_arc32 @ 0.0.0:   [Up-to-date]
          Updating framework-arduinointel @ 1.10006.0:    [Up-to-date]
          Updating tool-arduino101load @ 1.124.0:     [Up-to-date]
          Updating toolchain-intelarc32 @ 1.40805.0:  [Up-to-date]
          Updating tool-scons @ 2.4.1:    [Up-to-date]

          Platform nxplpc
          --------
          Updating nxplpc @ 0.0.0:    [Up-to-date]
          Updating framework-mbed @ 1.121.1:  [Up-to-date]
          Updating toolchain-gccarmnoneeabi @ 1.40804.0:  [Up-to-date]
          Updating tool-scons @ 2.4.1:    [Up-to-date]

          Platform linux_arm
          --------
          Updating linux_arm @ 0.0.0:     [Up-to-date]
          Updating toolchain-gccarmlinuxgnueabi @ 1.40802.0:  [Up-to-date]
          Updating tool-scons @ 2.4.1:    [Up-to-date]

          Platform native
          --------
          Updating native @ 0.0.0:    [Up-to-date]
          Updating tool-scons @ 2.4.1:    [Up-to-date]

          Library Manager
          ===============
          Updating Adafruit-GFX @ 334e815bc1:     [Up-to-date]
          Updating Adafruit-ST7735 @ d53d4bf03a:  [Up-to-date]
          Updating Adafruit-DHT @ 09344416d2:     [Up-to-date]
          Updating Adafruit-Unified-Sensor @ f2af6f4efc:  [Up-to-date]
          Updating ESP8266_SSD1306 @ 3.2.3:   [Up-to-date]
          Updating EngduinoMagnetometer @ 3.1.0:  [Up-to-date]
          Updating IRremote @ 2.2.1:  [Up-to-date]
          Updating Json @ 5.6.4:  [Up-to-date]
          Updating MODSERIAL @ d8422efe47:    [Up-to-date]
          Updating PJON @ 1fb26fd:    [Checking]
          git version 2.7.4 (Apple Git-66)
          Already up-to-date.
          Updating Servo @ 36b69a7ced07:  [Checking]
          Mercurial Distributed SCM (version 3.8.4)
          (see https://mercurial-scm.org for more information)

          Copyright (C) 2005-2016 Matt Mackall and others
          This is free software; see the source for copying conditions. There is NO
          warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
          pulling from https://developer.mbed.org/users/simon/code/Servo/
          searching for changes
          no changes found
          Updating TextLCD @ 308d188a2d3a:    [Checking]
          Mercurial Distributed SCM (version 3.8.4)
          (see https://mercurial-scm.org for more information)

          Copyright (C) 2005-2016 Matt Mackall and others
          This is free software; see the source for copying conditions. There is NO
          warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
          pulling from https://developer.mbed.org/users/simon/code/TextLCD/
          searching for changes
          no changes found

   platformio upgrade
   Contentsplatformio upgradeUsageDescriptionOptionsExamples

   Usage
          platformio upgrade
          pio upgrade

   Description
       Check or upgrade PlatformIO to the latest version

   Options
       --dev

       Use development branch.

   Examples
          > platformio upgrade

          You are up-to-date!
          PlatformIO x.x.x is currently the newest version available.

          # If you have problem with permissions try:
          > sudo platformio upgrade

   PlatformIO Home
       PlatformIO Home allows you to interact with PlatformIO ecosystem using modern and cross-platform GUI:

       • Project Manager

       • pioaccount

       • librarymanager

       • platforms

       • Library and development platform updates

       • frameworks

       • boards

       • Device Manager: serial, logical, and multicast DNS services

       • Static Code Analysis

       • Firmware File Explorer

       • Firmware Memory Inspection

       • Firmware Sections & Symbols Viewer.

   ContentsInstallationQuick StartPlatformIO IDEPlatformIO CoreDemoWelcome & Project ManagerProject InspectStatisticsFirmware File ExplorerFirmware SymbolsFirmware SectionsStatic Code AnalysisLibrary ManagerBoard Explorer

   Installation
       You do not need to install PlatformIO Home separately, it's already built-in in pioide and piocore.

   Quick Start
   PlatformIO IDE
       Please open PlatformIO Home using (HOME) button on PIO Toolbar:

       • Atom: atom_ide_platformio_toolbar

       • VSCode: ide_vscode_toolbar

   PlatformIO Core
       Please  launch  PlatformIO  Home  Web-server  using  cmd_home  command   and   open   in   your   browser
       http://127.0.0.1:8008.

       You can change host and port. Please check cmd_home command for details.

   Demo
   Welcome & Project Manager
       [image]

   Project Inspect
   Statistics
       [image]

       Only code analysis (piocheck) [image]

   Firmware File Explorer
       [image]

       File Symbols [image]

   Firmware Symbols
       [image]

   Firmware Sections
       [image]

   Static Code Analysis
       [image]

   Library Manager
       [image]

   Board Explorer
       [image]

   Tutorials and Examples
   Tutorials
   Unit Testing of a Blink Project
       The goal of this tutorial is to demonstrate how simple it is to use unit_testing.

       • Level: Beginner

       • Platforms: Windows, macOS, Linux

   ContentsSetting Up the ProjectProject structureSource filesTest results

   Setting Up the Project
       1. Please navigate to the core_quickstart section and create the "Blink Project".

       2. Create a test directory in the project (on the same level as src) and place a test_main.cpp file in it
          (the source code is located below).

       3. Run tests using the cmd_test command.

   Project structure
          project_dir
          ├── lib
          │   └── README
          ├── platformio.ini
          ├── src
          │   └── ...
          └── test
              └── test_main.cpp

   Source filesplatformio.ini

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

            [env:uno]
            platform = atmelavr
            framework = arduino
            board = uno

            [env:teensy31]
            platform = teensy
            framework = arduino
            board = teensy31

       • test/test_main.cpp

            #include <Arduino.h>
            #include <unity.h>

            // void setUp(void) {
            // // set stuff up here
            // }

            // void tearDown(void) {
            // // clean stuff up here
            // }

            void test_led_builtin_pin_number(void) {
                TEST_ASSERT_EQUAL(13, LED_BUILTIN);
            }

            void test_led_state_high(void) {
                digitalWrite(LED_BUILTIN, HIGH);
                TEST_ASSERT_EQUAL(HIGH, digitalRead(LED_BUILTIN));
            }

            void test_led_state_low(void) {
                digitalWrite(LED_BUILTIN, LOW);
                TEST_ASSERT_EQUAL(LOW, digitalRead(LED_BUILTIN));
            }

            void setup() {
                // NOTE!!! Wait for >2 secs
                // if board doesn't support software reset via Serial.DTR/RTS
                delay(2000);

                UNITY_BEGIN();    // IMPORTANT LINE!
                RUN_TEST(test_led_builtin_pin_number);

                pinMode(LED_BUILTIN, OUTPUT);
            }

            uint8_t i = 0;
            uint8_t max_blinks = 5;

            void loop() {
                if (i < max_blinks)
                {
                    RUN_TEST(test_led_state_high);
                    delay(500);
                    RUN_TEST(test_led_state_low);
                    delay(500);
                    i++;
                }
                else if (i == max_blinks) {
                  UNITY_END(); // stop unit testing
                }
            }

   Test results
          > platformio test -e uno --verbose

          Verbose mode can be enabled via `-v, --verbose` option
          Collected 1 items

          ===================== [test/*] Building... (1/3) =======================
          Processing uno (platform: atmelavr; board: uno; framework: arduino)
          -------------------------------------------------------------------
          Verbose mode can be enabled via `-v, --verbose` option
          PLATFORM: Atmel AVR > Arduino Uno
          SYSTEM: ATMEGA328P 16MHz 2KB RAM (31.50KB Flash)
          Library Dependency Finder -> http://bit.ly/configure-pio-ldf
          LDF MODES: FINDER(chain) COMPATIBILITY(soft)
          Collected 24 compatible libraries
          Scanning dependencies...
          No dependencies
          Compiling .pio\build\uno\test\output_export.cpp.o
          Compiling .pio\build\uno\test\test_main.cpp.o
          Archiving .pio\build\uno\libFrameworkArduinoVariant.a
          Compiling .pio\build\uno\FrameworkArduino\CDC.cpp.o
          Indexing .pio\build\uno\libFrameworkArduinoVariant.a
          Compiling .pio\build\uno\FrameworkArduino\HardwareSerial.cpp.o
          Compiling .pio\build\uno\FrameworkArduino\HardwareSerial0.cpp.o
          Compiling .pio\build\uno\FrameworkArduino\HardwareSerial1.cpp.o
          Compiling .pio\build\uno\FrameworkArduino\HardwareSerial2.cpp.o
          Compiling .pio\build\uno\FrameworkArduino\HardwareSerial3.cpp.o
          Compiling .pio\build\uno\FrameworkArduino\IPAddress.cpp.o
          Compiling .pio\build\uno\FrameworkArduino\PluggableUSB.cpp.o
          Compiling .pio\build\uno\FrameworkArduino\Print.cpp.o
          Compiling .pio\build\uno\FrameworkArduino\Stream.cpp.o
          Compiling .pio\build\uno\FrameworkArduino\Tone.cpp.o
          Compiling .pio\build\uno\FrameworkArduino\USBCore.cpp.o
          Compiling .pio\build\uno\FrameworkArduino\WInterrupts.c.o
          Compiling .pio\build\uno\FrameworkArduino\WMath.cpp.o
          Compiling .pio\build\uno\FrameworkArduino\WString.cpp.o
          Compiling .pio\build\uno\FrameworkArduino\abi.cpp.o
          Compiling .pio\build\uno\FrameworkArduino\hooks.c.o
          Compiling .pio\build\uno\FrameworkArduino\main.cpp.o
          Compiling .pio\build\uno\FrameworkArduino\new.cpp.o
          Compiling .pio\build\uno\FrameworkArduino\wiring.c.o
          Compiling .pio\build\uno\FrameworkArduino\wiring_analog.c.o
          Compiling .pio\build\uno\FrameworkArduino\wiring_digital.c.o
          Compiling .pio\build\uno\FrameworkArduino\wiring_pulse.S.o
          Compiling .pio\build\uno\FrameworkArduino\wiring_pulse.c.o
          Compiling .pio\build\uno\FrameworkArduino\wiring_shift.c.o
          Compiling .pio\build\uno\UnityTestLib\unity.o
          Archiving .pio\build\uno\libFrameworkArduino.a
          Indexing .pio\build\uno\libFrameworkArduino.a
          Archiving .pio\build\uno\libUnityTestLib.a
          Indexing .pio\build\uno\libUnityTestLib.a
          Linking .pio\build\uno\firmware.elf
          Checking size .pio\build\uno\firmware.elf
          Building .pio\build\uno\firmware.hex
          Memory Usage -> http://bit.ly/pio-memory-usage
          DATA:    [==        ]  20.0% (used 410 bytes from 2048 bytes)
          PROGRAM: [=         ]  12.6% (used 4060 bytes from 32256 bytes)

          ========================================== [SUMMARY] ==========================================
          Environment uno                 [SUCCESS]
          Environment teensy31            [SKIP]
          ================================= [SUCCESS] Took 2.54 seconds =================================

          ================================= [test/*] Uploading... (2/3) =================================
          Processing uno (platform: atmelavr; board: uno; framework: arduino)
          -------------------------------------------------------------------
          Verbose mode can be enabled via `-v, --verbose` option
          PLATFORM: Atmel AVR > Arduino Uno
          SYSTEM: ATMEGA328P 16MHz 2KB RAM (31.50KB Flash)
          Library Dependency Finder -> http://bit.ly/configure-pio-ldf
          LDF MODES: FINDER(chain) COMPATIBILITY(soft)
          Collected 24 compatible libraries
          Scanning dependencies...
          No dependencies
          Checking size .pio\build\uno\firmware.elf
          Memory Usage -> http://bit.ly/pio-memory-usage
          DATA:    [==        ]  20.0% (used 410 bytes from 2048 bytes)
          PROGRAM: [=         ]  12.6% (used 4060 bytes from 32256 bytes)
          Configuring upload protocol...
          AVAILABLE: arduino
          CURRENT: upload_protocol = arduino
          Looking for upload port...
          Auto-detected: COM18
          Uploading .pio\build\uno\firmware.hex

          avrdude: AVR device initialized and ready to accept instructions

          Reading | ################################################## | 100% 0.00s

          avrdude: Device signature = 0x1e950f (probably m328p)
          avrdude: reading input file ".pio\build\uno\firmware.hex"
          avrdude: writing flash (4060 bytes):

          Writing | ################################################## | 100% 0.76s

          avrdude: 4060 bytes of flash written
          avrdude: verifying flash memory against .pio\build\uno\firmware.hex:
          avrdude: load data flash data from input file .pio\build\uno\firmware.hex:
          avrdude: input file .pio\build\uno\firmware.hex contains 4060 bytes
          avrdude: reading on-chip flash data:

          Reading | ################################################## | 100% 0.48s

          avrdude: verifying ...
          avrdude: 4060 bytes of flash verified

          avrdude: safemode: Fuses OK (E:00, H:00, L:00)

          avrdude done.  Thank you.

          =============================== [SUMMARY] ================================
          Environment uno                 [SUCCESS]
          Environment teensy31            [SKIP]
           ====================== [SUCCESS] Took 4.45 seconds ======================

          ================================== [test/*] Testing... (3/3) ==================================
          If you don't see any output for the first 10 secs, please reset board (press reset button)

          test\test_main.cpp:30:test_led_builtin_pin_number       [PASSED]
          test\test_main.cpp:41:test_led_state_high       [PASSED]
          test\test_main.cpp:43:test_led_state_low        [PASSED]
          test\test_main.cpp:41:test_led_state_high       [PASSED]
          test\test_main.cpp:43:test_led_state_low        [PASSED]
          test\test_main.cpp:41:test_led_state_high       [PASSED]
          test\test_main.cpp:43:test_led_state_low        [PASSED]
          test\test_main.cpp:41:test_led_state_high       [PASSED]
          test\test_main.cpp:43:test_led_state_low        [PASSED]
          test\test_main.cpp:41:test_led_state_high       [PASSED]
          test\test_main.cpp:43:test_led_state_low        [PASSED]
          -----------------------
          11 Tests 0 Failures 0 Ignored

          ============================ [TEST SUMMARY] ==============================
          test/*/env:uno  [PASSED]
          test/*/env:teensy31     [IGNORED]
          ==================== [PASSED] Took 12.99 seconds =========================

   Get started with Arduino and ESP32-DevKitC: debugging and unit testing
       The goal of this tutorial is to demonstrate how simple it is to use ide_vscode to develop, run and  debug
       a simple project with the framework_arduino framework for the ESP32-DevKitC board.

       • Level: Beginner

       • Platforms: Windows, Mac OS X, Linux

       Requirements:

              • Downloaded and installed ide_vscode

              • ESP32-DevKitC development board

              • debugging_tool_olimex-arm-usb-ocd or debugging_tool_olimex-jtag-tiny adapter for debugging

   ContentsSetting Up the ProjectAdding Code to the Generated ProjectCompiling and Uploading the FirmwareDebugging the FirmwareSetting Up the HardwareWriting Unit TestsAdding Bluetooth LE featuresConclusion

   Setting Up the Project
       First,  we need to create a new project using the PlatformIO Home Page (to open this page, just press the
       Home icon on the toolbar): [image]

       Next, we need to select ESP32-DevKitC as a development board, framework_arduino as a framework and a path
       to the project location (or use the default one): [image]

       Processing  the  selected  project  may take some time (PlatformIO will download and install all required
       packages).  After that, we have a fully configured project that is ready for  developing  code  with  the
       framework_arduino framework.

   Adding Code to the Generated Project
       Let's  add  some  actual  code to the project. Firstly, we open a default main file named main.cpp in the
       projectconf_pio_src_dir folder and replace its content with following:

          #include <Arduino.h>

          void setup()
          {
              Serial.begin(9600);
          }

          void loop()
          {
              Serial.println("Hello world!");
              delay(1000);
          }
       [image]

       We have now created a basic project ready for compiling and uploading.

   Compiling and Uploading the Firmware
       Now we can build the project. There are several ways to compile firmware:

       • Build option in the Project Tasks menu,

       • Build button in ide_vscode_toolbar,

       • Task Menu: Tasks: Run Task... > PlatformIO: Build, or in the ide_vscode_toolbar,

       • Command Palette: View: Command Palette > PlatformIO: Build, or

       • via hotkeys cmd-alt-b / ctrl-alt-b

       Marked in red: [image]

       If everything went well, we should see a Success message in the terminal window: [image]

       There are also several ways to upload the firmware to the board:

       • Upload option in the Project Tasks menu,

       • Upload button in ide_vscode_toolbar,

       • Command Palette: View: Command Palette > PlatformIO: Upload,

       • using the Task Menu: Tasks: Run Task... > PlatformIO: Upload, or

       • via hotkeys: cmd-alt-u / ctrl-alt-u:
       [image]

       After uploading, we need to check if the firmware is uploaded correctly. To  do  this,  open  the  serial
       monitor and check that the message from the board is received. To open the serial monitor, we can use the
       following options:

       • Monitor option in the Project Tasks menu,

       • Serial Monitor button in the ide_vscode_toolbar,

       • Command Palette: View: Command Palette > PlatformIO: Monitor, or

       • Task Menu: Tasks: Run Task... > PlatformIO: Monitor:
       [image]

       If the firmware works as expected, the message from the board can be observed  in  the  terminal  window:
       [image]

   Debugging the Firmware
   Setting Up the Hardware
       In order to use a JTAG probe with an ESP32, we need to connect the following pins:

                                           ┌──────────────┬────────────────┐
                                           │ESP32 pin     │ JTAG probe pin │
                                           ├──────────────┼────────────────┤
                                           │3.3VPin 1(VTref)   │
                                           ├──────────────┼────────────────┤
                                           │GPIO 9 (EN)Pin 3 (nTRST)  │
                                           ├──────────────┼────────────────┤
                                           │GNDPin 4 (GND)    │
                                           ├──────────────┼────────────────┤
                                           │GPIO 12 (TDI)Pin 5 (TDI)    │
                                           ├──────────────┼────────────────┤
                                           │GPIO 14 (TMS)Pin 7 (TMS)    │
                                           ├──────────────┼────────────────┤
                                           │GPIO 13 (TCK)Pin 9 (TCK)    │
                                           ├──────────────┼────────────────┤
                                           │GPIO 15 (TDO)Pin 13 (TDO)   │
                                           └──────────────┴────────────────┘

       piodebug offers the easiest way to debug the board. Firstly, we need to specify projectconf_debug_tool in
       projectconf. In this tutorial, an debugging_tool_olimex-arm-usb-ocd-h debug probe is used:

          [env:esp32dev]
          platform = espressif32
          board = esp32dev
          framework = arduino
          debug_tool = olimex-arm-usb-ocd-h

       To start the debug session we can use the following methods:

       • Debug: Start debugging in the top menu,

       • Start Debugging option in the Quick Access menu, or

       • hotkey button F5:
       [image]

       We need to wait some time while PlatformIO initializes the debug session, and are ready to debug when the
       first line after the main function is highlighted.

       1. Please wait when debugging session is stopped at the first line of app_main() function

       2. WARNING! Please set a breakpoint at void loopTask(void *pvParameters) (line 13 in the screenshot below
          - this line can change between releases)

       3. Now, please press CONTINUE/RUN button on debugging toolbar (right arrow icon)

       4. The debugging session should stop at the first line of the void loopTask(void *pvParameters) function

       5. Now, navigate to your Arduino setup/loop code and do classic debugging.
       [image]

       We can walk through the code using control buttons, set breakpoints,  and  add  variables  to  the  Watch
       window: [image]

   Writing Unit Tests
       Test  cases can be added to a single file that may include multiple tests. First of all, in this file, we
       need to add four default functions: setUp, tearDown, setup and loop. Functions  setUp  and  tearDown  are
       used  to initialize and finalize test conditions. Implementations of these functions are not required for
       running tests, but if you need to initialize some  variables  before  you  run  a  test,  use  the  setUp
       function.  Likewise, if you need to clean up variables, use tearDown function. In our example we will use
       these functions to respectively initialize and deinitialize LED states.  The setup and loop functions act
       as a simple Arduino program where we describe our test plan.

       Let's  create a test folder in the root of the project and add a new file, test_main.cpp, to this folder.
       Next, basic tests for String class will be implemented in this file:

       • test_string_concat tests the concatenation of two strings

       • test_string_substring tests the correctness of the substring extraction

       • test_string_index_of ensures that the string returns the correct index of the specified symbol

       • test_string_equal_ignore_case tests case-insensitive comparison of two strings

       • test_string_to_upper_case tests conversion of the string to upper-case

       • test_string_replace tests the correctness of the replacing operation

          #include <Arduino.h>
          #include <unity.h>

          String STR_TO_TEST;

          void setUp(void) {
              // set stuff up here
              STR_TO_TEST = "Hello, world!";
          }

          void tearDown(void) {
              // clean stuff up here
              STR_TO_TEST = "";
          }

          void test_string_concat(void) {
              String hello = "Hello, ";
              String world = "world!";
              TEST_ASSERT_EQUAL_STRING(STR_TO_TEST.c_str(), (hello + world).c_str());
          }

          void test_string_substring(void) {
              TEST_ASSERT_EQUAL_STRING("Hello", STR_TO_TEST.substring(0, 5).c_str());
          }

          void test_string_index_of(void) {
              TEST_ASSERT_EQUAL(7, STR_TO_TEST.indexOf('w'));
          }

          void test_string_equal_ignore_case(void) {
              TEST_ASSERT_TRUE(STR_TO_TEST.equalsIgnoreCase("HELLO, WORLD!"));
          }

          void test_string_to_upper_case(void) {
              STR_TO_TEST.toUpperCase();
              TEST_ASSERT_EQUAL_STRING("HELLO, WORLD!", STR_TO_TEST.c_str());
          }

          void test_string_replace(void) {
              STR_TO_TEST.replace('!', '?');
              TEST_ASSERT_EQUAL_STRING("Hello, world?", STR_TO_TEST.c_str());
          }

          void setup()
          {
              delay(2000); // service delay
              UNITY_BEGIN();

              RUN_TEST(test_string_concat);
              RUN_TEST(test_string_substring);
              RUN_TEST(test_string_index_of);
              RUN_TEST(test_string_equal_ignore_case);
              RUN_TEST(test_string_to_upper_case);
              RUN_TEST(test_string_replace);

              UNITY_END(); // stop unit testing
          }

          void loop()
          {
          }

       Now we are ready to upload tests to the board. To do this we can use the following:

       • Test button on ide_vscode_toolbar,

       • Test option in the Project Tasks menu, or

       • Tasks: Run Task... > PlatformIO Test in the top menu:
       [image]

       After processing, we should see a detailed report about the testing results: [image]

       As we can see from the report, all our tests were successful!

   Adding Bluetooth LE features
       Now let's create a basic application that can interact with other BLE devices (e.g phones).  For example,
       the following code declares a BLE characteristic whose value can be printed to the serial port:

          #include <Arduino.h>
          #include <BLEDevice.h>
          #include <BLEUtils.h>
          #include <BLEServer.h>

          #define SERVICE_UUID        "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
          #define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"

          class MyCallbacks: public BLECharacteristicCallbacks {
              void onWrite(BLECharacteristic *pCharacteristic) {
                std::string value = pCharacteristic->getValue();
                if (value.length() > 0) {
                  Serial.print("\r\nNew value: ");
                  for (int i = 0; i < value.length(); i++)
                    Serial.print(value[i]);
                  Serial.println();
                }
              }
          };

          void setup() {
            Serial.begin(9600);

            BLEDevice::init("ESP32 BLE example");
            BLEServer *pServer = BLEDevice::createServer();
            BLEService *pService = pServer->createService(SERVICE_UUID);
            BLECharacteristic *pCharacteristic = pService->createCharacteristic(
                                                   CHARACTERISTIC_UUID,
                                                   BLECharacteristic::PROPERTY_READ |
                                                   BLECharacteristic::PROPERTY_WRITE
                                                 );

            pCharacteristic->setCallbacks(new MyCallbacks());

            pCharacteristic->setValue("Hello World");
            pService->start();

            BLEAdvertising *pAdvertising = pServer->getAdvertising();
            pAdvertising->start();
          }

          void loop() {
            delay(2000);
          }

       Now we can compile and upload this program to the board as described in the previous sections.  To verify
       that our application works as expected, we can use any Android smartphone with the BLE feature and Nordic
       nRF Connect tool.

       At first, we need to scan all advertising BLE devices and connect to the device called ESP32 BLE example.
       After successful connection to the  board,  we  should  see  one  "Unknown  Service"  with  one  "Unknown
       Characteristic" field: [image]

       To set the value, we need to send new text to the BLE characteristic: [image]

       The change of the value is printed to the serial monitor: [image]

   Conclusion
       Now  we  have  a  project  template  for the ESP32-DevKitC board that we can use as boilerplate for later
       projects.

   Get started with ESP-IDF and ESP32-DevKitC: debugging, unit testing, project analysis
       The goal of this tutorial is to demonstrate how simple it is to use ide_vscode to develop, run and  debug
       a simple Wi-Fi project with the framework_espidf framework for the ESP32-DevKitC board.

       • Level: Intermediate

       • Platforms: Windows, Mac OS X, Linux

       Requirements:

              • Downloaded and installed ide_vscode

              • ESP32-DevKitC development board

              • An external debug adapter (e.g. debugging_tool_olimex-arm-usb-ocd)

   ContentsSetting Up the ProjectAdding Code to the Generated ProjectDebugging the FirmwareSetting Up the HardwareWriting Unit TestsProject InspectionConclusion

   Setting Up the Project
       1. Click on "PlatformIO Home" button on the bottom PlatformIO Toolbar:
             [image]

       2. Click  on  "New  Project",  select  ESP32-DevKitC  as  the  development board, framework_espidf as the
          framework and a path to the project location (or use the default one):
             [image]

   Adding Code to the Generated Project
       1. Create a new file main.c in projectconf_pio_src_dir folder and add the following code:

                 /* WiFi softAP Example

                    This example code is in the Public Domain (or CC0 licensed, at your option.)

                    Unless required by applicable law or agreed to in writing, this
                    software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
                    CONDITIONS OF ANY KIND, either express or implied.
                 */
                 #include <string.h>
                 #include "freertos/FreeRTOS.h"
                 #include "freertos/task.h"
                 #include "esp_system.h"
                 #include "esp_wifi.h"
                 #include "esp_event.h"
                 #include "esp_log.h"
                 #include "nvs_flash.h"

                 #include "lwip/err.h"
                 #include "lwip/sys.h"

                 #define EXAMPLE_ESP_WIFI_SSID      "mywifissid"
                 #define EXAMPLE_ESP_WIFI_PASS      "mywifipass"
                 #define EXAMPLE_MAX_STA_CONN       (3)

                 static const char *TAG = "wifi softAP";

                 static void wifi_event_handler(void* arg, esp_event_base_t event_base,
                                                     int32_t event_id, void* event_data)
                 {
                     if (event_id == WIFI_EVENT_AP_STACONNECTED) {
                         wifi_event_ap_staconnected_t* event = (wifi_event_ap_staconnected_t*) event_data;
                         ESP_LOGI(TAG, "station "MACSTR" join, AID=%d",
                                  MAC2STR(event->mac), event->aid);
                     } else if (event_id == WIFI_EVENT_AP_STADISCONNECTED) {
                         wifi_event_ap_stadisconnected_t* event = (wifi_event_ap_stadisconnected_t*) event_data;
                         ESP_LOGI(TAG, "station "MACSTR" leave, AID=%d",
                                  MAC2STR(event->mac), event->aid);
                     }
                 }

                 void wifi_init_softap()
                 {
                     tcpip_adapter_init();
                     ESP_ERROR_CHECK(esp_event_loop_create_default());

                     wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
                     ESP_ERROR_CHECK(esp_wifi_init(&cfg));

                     ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &wifi_event_handler, NULL));

                     wifi_config_t wifi_config = {
                         .ap = {
                             .ssid = EXAMPLE_ESP_WIFI_SSID,
                             .ssid_len = strlen(EXAMPLE_ESP_WIFI_SSID),
                             .password = EXAMPLE_ESP_WIFI_PASS,
                             .max_connection = EXAMPLE_MAX_STA_CONN,
                             .authmode = WIFI_AUTH_WPA_WPA2_PSK
                         },
                     };
                     if (strlen(EXAMPLE_ESP_WIFI_PASS) == 0) {
                         wifi_config.ap.authmode = WIFI_AUTH_OPEN;
                     }

                     ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_AP));
                     ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_AP, &wifi_config));
                     ESP_ERROR_CHECK(esp_wifi_start());

                     ESP_LOGI(TAG, "wifi_init_softap finished. SSID:%s password:%s",
                              EXAMPLE_ESP_WIFI_SSID, EXAMPLE_ESP_WIFI_PASS);
                 }

                 void app_main()
                 {
                     //Initialize NVS
                     esp_err_t ret = nvs_flash_init();
                     if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
                       ESP_ERROR_CHECK(nvs_flash_erase());
                       ret = nvs_flash_init();
                     }
                     ESP_ERROR_CHECK(ret);

                     ESP_LOGI(TAG, "ESP_WIFI_MODE_AP");
                     wifi_init_softap();
                 }

             WARNING:
                 Make sure this new file main.c  is  registered  as  source  file  using  idf_component_register
                 function in src/CMakeLists.txt file:

                    idf_component_register(SRCS "main.c")

       2. To compile the project use one of the following options:

             • Build option from the Project Tasks menu

             • Build button in ide_vscode_toolbar

             • Task Menu Tasks: Run Task... > PlatformIO: Build or in ide_vscode_toolbar

             • Command Palette View: Command Palette > PlatformIO: Build

             • Hotkeys cmd-alt-b / ctrl-alt-b:
             [image]

       3. If everything went well, we should see a successful result message in the terminal window:
             [image]

       4. To upload the firmware to the board we can use the following options:

             • Upload option from the Project Tasks menu

             • Upload button in ide_vscode_toolbar

             • Command Palette View: Command Palette > PlatformIO: Upload

             • Task Menu Tasks: Run Task... > PlatformIO: Upload

             • Hotkeys cmd-alt-u / ctrl-alt-u:
             [image]

       5. Connect  the  board  to your computer and update the default monitor speed to 115200 in platformio.ini
          file:

                 [env:esp32dev]
                 platform = espressif32
                 board = esp32dev
                 framework = espidf
                 monitor_speed = 115200

       6. Open Serial Monitor to observe the output from the board:
             [image]

       7. If everything went well, the board should be visible as a WiFi access point:
             [image]

   Debugging the Firmware
   Setting Up the Hardware
       In order to use piodebug, we need to connect an external JTAG probe and the  board  using  the  following
       pins:

                                           ┌──────────────┬────────────────┐
                                           │ESP32 pin     │ JTAG probe pin │
                                           ├──────────────┼────────────────┤
                                           │3.3VPin 1(VTref)   │
                                           ├──────────────┼────────────────┤
                                           │GPIO 9 (EN)Pin 3 (nTRST)  │
                                           ├──────────────┼────────────────┤
                                           │GNDPin 4 (GND)    │
                                           ├──────────────┼────────────────┤
                                           │GPIO 12 (TDI)Pin 5 (TDI)    │
                                           ├──────────────┼────────────────┤
                                           │GPIO 14 (TMS)Pin 7 (TMS)    │
                                           ├──────────────┼────────────────┤
                                           │GPIO 13 (TCK)Pin 9 (TCK)    │
                                           ├──────────────┼────────────────┤
                                           │GPIO 15 (TDO)Pin 13 (TDO)   │
                                           └──────────────┴────────────────┘

       1. Specify  projectconf_debug_tool  in projectconf. In this tutorial, debugging_tool_olimex-arm-usb-ocd-h
          debug probe is used:

                 [env:esp32dev]
                 platform = espressif32
                 board = esp32dev
                 framework = espidf
                 monitor_speed = 115200
                 debug_tool = olimex-arm-usb-ocd-h

       2. To start the debug session we can use the following methods:

             • Debug: Start debugging in the top menu

             • Start Debugging option in the Quick Access menu

             • Hotkey button F5:
             [image]

       3. Walk through the code using control buttons, set breakpoints, and add variables to the Watch window:
             [image]

   Writing Unit Tests
       NOTE:
          Functions setUp and tearDown are used to initialize and finalize test conditions.  Implementations  of
          these functions are not required for running tests but if you need to initialize some variables before
          you run a test, you use the setUp function and if you need to clean  up  variables  you  use  tearDown
          function.

       For  the  sake  of  simplicity,  let's  create a small library called calculator, implement several basic
       functions addition, subtraction, multiplication, division and test them using unit_testing engine.

       1. Create a  new  folder  calculator  in  the  projectconf_pio_lib_dir  folder  and  add  two  new  files
          calculator.h and calculator.c with the following contents:
             calculator.h:

                 #ifndef _CALCULATOR_H_
                 #define _CALCULATOR_H_

                 #ifdef __cplusplus
                 extern "C" {
                 #endif

                 int addition (int a, int b);
                 int subtraction (int a, int b);
                 int multiplication (int a, int b);
                 int division (int a, int b);

                 #ifdef __cplusplus
                 }
                 #endif

                 #endif // _CALCULATOR_H_

             calculator.c:

                 #include "calculator.h"

                 int addition(int a, int b)
                 {
                     return a + b;
                 }

                 int subtraction(int a, int b)
                 {
                     return a - b;
                 }

                 int multiplication(int a, int b)
                 {
                     return a * b;
                 }

                 int division(int a, int b)
                 {
                     return a / b;
                 }

       2. Create  a  new  file  test_calc.c  to  the folder projectconf_pio_test_dir and add basic tests for the
          calculator library:

                 #include <calculator.h>
                 #include <unity.h>

                 void test_function_calculator_addition(void) {
                     TEST_ASSERT_EQUAL(32, addition(25, 7));
                 }

                 void test_function_calculator_subtraction(void) {
                     TEST_ASSERT_EQUAL(20, subtraction(23, 3));
                 }

                 void test_function_calculator_multiplication(void) {
                     TEST_ASSERT_EQUAL(50, multiplication(25, 2));
                 }

                 void test_function_calculator_division(void) {
                     TEST_ASSERT_EQUAL(32, division(100, 3));
                 }

                 void main() {
                     UNITY_BEGIN();

                     RUN_TEST(test_function_calculator_addition);
                     RUN_TEST(test_function_calculator_subtraction);
                     RUN_TEST(test_function_calculator_multiplication);
                     RUN_TEST(test_function_calculator_division);

                     UNITY_END();
                 }

       3. Let's  run  tests  on  the  board  and  check  the  results.  There   should   be   a   problem   with
          test_function_calculator_division test:
             [image]

       4. Let's  fix  the  incorrect  expected value and run tests again. After processing the results should be
          correct:
             [image]

   Project Inspection
       For illustrative purposes, let's imagine we need to find a function with the  biggest  memory  footprint.
       Also, let's introduce a bug to our project so piocheck can report it.

       1. Open  PlatformIO  Home  and  navigate to Inspect section, select the current project and press Inspect
          button:
             [image]

       2. Project statistics:
             [image]

       3. The biggest function:
             [image]

       4. Possible bugs:
             [image]

   Conclusion
       Now we have a project template for the ESP32-DevKitC board that we  can  use  as  boilerplate  for  later
       projects.

   STM32Cube HAL and Nucleo-F401RE: debugging and unit testing
       The  goal of this tutorial is to demonstrate how simple it is to use ide_atom to develop, run and debug a
       basic blink project with framework_stm32cube framework for STM32 Nucleo-F401RE board.

       • Level: Intermediate

       • Platforms: Windows, Mac OS X, Linux

       Requirements:

              • Downloaded and installed ide_atom

              • Install drivers for debugging_tool_stlink debug tool

              • Nucleo-F401RE development board

   ContentsSetting Up the ProjectAdding Code to the Generated ProjectCompiling and Uploading the FirmwareDebugging the FirmwareWriting Unit TestsConclusionProject Source Code

   Setting Up the Project
       At first step, we need to create a new project using PlatformIO Home Page (to open this page  just  press
       Home icon on the toolbar): [image]

       On  the  next  step,  we need to select ST Nucleo-F401RE as a development board, framework_stm32cube as a
       framework and a path to the project location (or use the default one): [image]

       Processing the selected project may take some amount of time (PlatformIO will download  and  install  all
       required packages) and after these steps, we have a fully configured project that is ready for developing
       code with framework_stm32cube framework.

   Adding Code to the Generated Project
       Let's add some actual code to the project. Firstly, we create two main files main.c  and  main.h  in  the
       projectconf_pio_src_dir folder. Right click on the src in the project window: [image]

       Add next content to main.h:

          #ifndef MAIN_H
          #define MAIN_H

          #include "stm32f4xx_hal.h"

          #define LED_PIN                                GPIO_PIN_5
          #define LED_GPIO_PORT                          GPIOA
          #define LED_GPIO_CLK_ENABLE()                  __HAL_RCC_GPIOA_CLK_ENABLE()

          #endif // MAIN_H

       Add this code to main.c:

          #include "main.h"

          void LED_Init();

          int main(void) {
            HAL_Init();
            LED_Init();

            while (1)
            {
              HAL_GPIO_TogglePin(LED_GPIO_PORT, LED_PIN);
              HAL_Delay(1000);
            }
          }

          void LED_Init() {
            LED_GPIO_CLK_ENABLE();
            GPIO_InitTypeDef GPIO_InitStruct;
            GPIO_InitStruct.Pin = LED_PIN;
            GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
            GPIO_InitStruct.Pull = GPIO_PULLUP;
            GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
            HAL_GPIO_Init(LED_GPIO_PORT, &GPIO_InitStruct);
          }

          void SysTick_Handler(void) {
            HAL_IncTick();
          }

       After this step, we created a basic blink project that is ready for compiling and uploading.

   Compiling and Uploading the Firmware
       Now  we  can  build the project. To compile firmware we can use next options: Build option on the Project
       Tasks menu, Build button on ide_vscode_toolbar, using Command Palette View: Command Palette > PlatformIO:
       Build,  using  Task  Menu  Tasks:  Run Task... > PlatformIO: Build or via hotkeys cmd-alt-b / ctrl-alt-b:
       [image]

       If everything went well, we should see the successful result in the terminal window: [image]

       To upload the firmware to the board we can use next options: Upload option on  the  Project  Tasks  menu,
       Upload  button  on  ide_vscode_toolbar, using Command Palette View: Command Palette > PlatformIO: Upload,
       using Task Menu Tasks: Run Task... > PlatformIO: Upload or via hotkeys cmd-alt-u / ctrl-alt-u: [image]

       After successful uploading, the green LED2 should start blinking.

   Debugging the Firmware
       piodebug offers the easiest way to debug your board.  To  start  debugging  session  you  can  use  Start
       debugging  option  in  PlatformIO  Quick  Access menu, Debug: Start debugging from the top menu or hotkey
       button F5: [image]

       We need to wait some time while PlatformIO is initializing debug session and when the  first  line  after
       the main function is highlighted we are ready to debug: [image]

       We  can  walk  through  the  code  using  control buttons, set breakpoints, see peripheral registers, add
       variables to Watch window: [image]

   Writing Unit Tests
       Now let’s write some tests using unit_testing feature that can help us test code directly on  the  target
       board.   unit_testing   engine   by   default   supports   only   three   frameworks:  framework_arduino,
       framework_espidf, framework_mbed, and framework_mbed. Since we decided to use framework_stm32cube we need
       to  implement  a custom projectconf_test_transport to print testing results and specify that condition in
       projectconf:

          [env:nucleo_f401re]
          platform = ststm32
          board = nucleo_f401re
          framework = stm32cube
          test_transport = custom

       Also, we need to create  a  new  folder  test  where  the  tests  and  custom  projectconf_test_transport
       implementation (described next) will be located: [image]

       We  will  use  USART2  on  ST  Nucleo-F401RE  board  because  it's directly connected to the STLink debug
       interface and in OS it can be visible as a Virtual Com Port, so we don't  need  any  additional  USB-UART
       converter.   To   implement   the   custom   projectconf_test_transport  we  need  to  create  two  files
       unittest_transport.h and unittest_transport.c and put them in the projectconf_pio_test_dir  in  the  root
       folder of our project. In these files we need to implement the next four functions:

          void unittest_uart_begin();
          void unittest_uart_putchar(char c);
          void unittest_uart_flush();
          void unittest_uart_end();

       Implementation of unittest_transport.h:

          #ifndef UNITEST_TRANSPORT_H
          #define UNITEST_TRANSPORT_H

          #ifdef __cplusplus
          extern "C" {
          #endif

          void unittest_uart_begin();
          void unittest_uart_putchar(char c);
          void unittest_uart_flush();
          void unittest_uart_end();

          #ifdef __cplusplus
          }
          #endif

          #endif // UNITEST_TRANSPORT_H

       Implementation of unittest_transport.c:

          #include "unittest_transport.h"
          #include "stm32f4xx_hal.h"

          #define USARTx                           USART2
          #define USARTx_CLK_ENABLE()              __HAL_RCC_USART2_CLK_ENABLE()
          #define USARTx_CLK_DISABLE()             __HAL_RCC_USART2_CLK_DISABLE()
          #define USARTx_RX_GPIO_CLK_ENABLE()      __HAL_RCC_GPIOA_CLK_ENABLE()
          #define USARTx_TX_GPIO_CLK_ENABLE()      __HAL_RCC_GPIOA_CLK_ENABLE()
          #define USARTx_RX_GPIO_CLK_DISABLE()     __HAL_RCC_GPIOA_CLK_DISABLE()
          #define USARTx_TX_GPIO_CLK_DISABLE()     __HAL_RCC_GPIOA_CLK_DISABLE()

          #define USARTx_FORCE_RESET()             __HAL_RCC_USART2_FORCE_RESET()
          #define USARTx_RELEASE_RESET()           __HAL_RCC_USART2_RELEASE_RESET()

          #define USARTx_TX_PIN                    GPIO_PIN_2
          #define USARTx_TX_GPIO_PORT              GPIOA
          #define USARTx_TX_AF                     GPIO_AF7_USART2
          #define USARTx_RX_PIN                    GPIO_PIN_3
          #define USARTx_RX_GPIO_PORT              GPIOA
          #define USARTx_RX_AF                     GPIO_AF7_USART2

          static UART_HandleTypeDef UartHandle;

          void unittest_uart_begin()
          {
             GPIO_InitTypeDef  GPIO_InitStruct;

            USARTx_TX_GPIO_CLK_ENABLE();
            USARTx_RX_GPIO_CLK_ENABLE();

            USARTx_CLK_ENABLE();

            GPIO_InitStruct.Pin       = USARTx_TX_PIN;
            GPIO_InitStruct.Mode      = GPIO_MODE_AF_PP;
            GPIO_InitStruct.Pull      = GPIO_PULLUP;
            GPIO_InitStruct.Speed     = GPIO_SPEED_FAST;
            GPIO_InitStruct.Alternate = USARTx_TX_AF;

            HAL_GPIO_Init(USARTx_TX_GPIO_PORT, &GPIO_InitStruct);

            GPIO_InitStruct.Pin = USARTx_RX_PIN;
            GPIO_InitStruct.Alternate = USARTx_RX_AF;

            HAL_GPIO_Init(USARTx_RX_GPIO_PORT, &GPIO_InitStruct);
            UartHandle.Instance          = USARTx;

            UartHandle.Init.BaudRate     = 115200;
            UartHandle.Init.WordLength   = UART_WORDLENGTH_8B;
            UartHandle.Init.StopBits     = UART_STOPBITS_1;
            UartHandle.Init.Parity       = UART_PARITY_NONE;
            UartHandle.Init.HwFlowCtl    = UART_HWCONTROL_NONE;
            UartHandle.Init.Mode         = UART_MODE_TX_RX;
            UartHandle.Init.OverSampling = UART_OVERSAMPLING_16;

            if(HAL_UART_Init(&UartHandle) != HAL_OK) {
              while(1){}
            }

          }

          void unittest_uart_putchar(char c)
          {
              HAL_UART_Transmit(&UartHandle, (uint8_t*)(&c), 1, 1000);
          }

          void unittest_uart_flush(){}

          void unittest_uart_end() {
            USARTx_CLK_DISABLE();
            USARTx_RX_GPIO_CLK_DISABLE();
            USARTx_TX_GPIO_CLK_DISABLE();
          }

       Now  we  need  to  add  some  test cases. Tests can be added to a single C file that may include multiple
       tests. First of all, we need to add three default functions: setUp, tearDown and main. setUp and tearDown
       are  used to initialize and finalize test conditions. Implementations of these functions are not required
       for running tests but if you need to initialize some variables before you run a test, you use  the  setUp
       function  and  if  you  need to clean up variables you use tearDown function. In our example, we will use
       these functions to accordingly initialize and deinitialize LED.  main function acts as a  simple  program
       where we describe our test plan.

       Let's  add  a  new  file  test_main.c  to  the folder test. Next basic tests for blinking routine will be
       implemented in this file:

       • test_led_builtin_pin_number ensures that LED_PIN has the correct value

       • test_led_state_high  tests functions HAL_GPIO_WritePin and HAL_GPIO_ReadPin with GPIO_PIN_SET value

       • test_led_state_low  tests functions HAL_GPIO_WritePin and HAL_GPIO_ReadPin with GPIO_PIN_RESET value

       NOTE:

          • 2 sec delay is required  since the board doesn't support software resetting  via Serial.DTR/RTS

          #include "../src/main.h"
          #include <unity.h>

          void setUp(void) {
              LED_GPIO_CLK_ENABLE();
              GPIO_InitTypeDef GPIO_InitStruct;
              GPIO_InitStruct.Pin = LED_PIN;
              GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
              GPIO_InitStruct.Pull = GPIO_PULLUP;
              GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
              HAL_GPIO_Init(LED_GPIO_PORT, &GPIO_InitStruct);
          }

          void tearDown(void) {
              HAL_GPIO_DeInit(LED_GPIO_PORT, LED_PIN);
          }

          void test_led_builtin_pin_number(void) {
              TEST_ASSERT_EQUAL(GPIO_PIN_5, LED_PIN);
          }

          void test_led_state_high(void) {
              HAL_GPIO_WritePin(LED_GPIO_PORT, LED_PIN, GPIO_PIN_SET);
              TEST_ASSERT_EQUAL(GPIO_PIN_SET, HAL_GPIO_ReadPin(LED_GPIO_PORT, LED_PIN));
          }

          void test_led_state_low(void) {
              HAL_GPIO_WritePin(LED_GPIO_PORT, LED_PIN, GPIO_PIN_RESET);
              TEST_ASSERT_EQUAL(GPIO_PIN_RESET, HAL_GPIO_ReadPin(LED_GPIO_PORT, LED_PIN));
          }

          int main() {
              HAL_Init();         // initialize the HAL library
              HAL_Delay(2000);    // service delay
              UNITY_BEGIN();
              RUN_TEST(test_led_builtin_pin_number);

              for (unsigned int i = 0; i < 5; i++)
              {
                  RUN_TEST(test_led_state_high);
                  HAL_Delay(500);
                  RUN_TEST(test_led_state_low);
                  HAL_Delay(500);
              }

              UNITY_END(); // stop unit testing

              while(1){}
          }

          void SysTick_Handler(void) {
              HAL_IncTick();
          }

       Now we are ready to upload tests to the board. To do this we can use Test option from the  Project  Tasks
       menu, Tasks: Run Task... > PlatformIO Test option from the top menu or Test button on ide_vscode_toolbar:
       [image]

       After processing we should see a detailed report about the testing results: [image]

       Congratulations! As we can see from the report, all our tests went successfully!

   Conclusion
       Now we have a decent template that we can improve for our next more complex projects.

   Project Source Code
       The        source        code        of        this        tutorial        is        available         at
       https://github.com/platformio/platformio-examples/tree/develop/unit-testing/stm32cube

   Arduino and Nordic nRF52-DK: debugging and unit testing
       The  goal of this tutorial is to demonstrate how simple it is to use ide_vscode to develop, run and debug
       a simple project with framework_arduino framework for Nordic nRF52-DK board.

       • Level: Beginner

       • Platforms: Windows, Mac OS X, Linux

       Requirements:

              • Downloaded and installed ide_vscode

              • Install drivers for debugging_tool_jlink debug tool

              • Nordic nRF52-DK development board

   ContentsSetting Up the ProjectAdding Code to the Generated ProjectCompiling and Uploading the FirmwareDebugging the FirmwareWriting Unit TestsAdding Bluetooth LE featuresConclusion

   Setting Up the Project
       At first step, we need to create a new project using PlatformIO Home Page (to open this page  just  press
       Home icon on the toolbar): [image]

       On  the  next  step  we  need  to  select  Nordic nRF52-DK as a development board, framework_arduino as a
       framework and a path to the project location (or use the default one): [image]

       Processing the selected project may take some amount of time (PlatformIO will download  and  install  all
       required packages) and after these steps, we have a fully configured project that is ready for developing
       code with framework_arduino framework.

   Adding Code to the Generated Project
       Let's add some actual code to the project.  Firstly,  we  open  a  default  main  file  main.cpp  in  the
       projectconf_pio_src_dir folder and replace its contents with the following:

          #include <Arduino.h>

          void setup()
          {
              pinMode(LED_BUILTIN, OUTPUT);
          }

          void loop()
          {
              digitalWrite(LED_BUILTIN, HIGH);
              delay(100);
              digitalWrite(LED_BUILTIN, LOW);
              delay(100);
          }
       [image]

       After this step, we created a basic blink project ready for compiling and uploading.

   Compiling and Uploading the Firmware
       Now  we can build the project. To compile firmware we can use next options: Build option from the Project
       Tasks menu, Build button in ide_vscode_toolbar, Task Menu Tasks: Run Task... > PlatformIO:  Build  or  in
       ide_vscode_toolbar,  Command Palette View: Command Palette > PlatformIO: Build or via hotkeys cmd-alt-b /
       ctrl-alt-b: [image]

       If everything went well, we should see a successful result message in the terminal window: [image]

       To upload the firmware to the board we can use next options: Upload option from the Project  Tasks  menu,
       Upload  button  in  ide_vscode_toolbar, Command Palette View: Command Palette > PlatformIO: Upload, using
       Task Menu Tasks: Run Task... > PlatformIO: Upload or via hotkeys cmd-alt-u / ctrl-alt-u: [image]

       After successful uploading, the green LED1 should start blinking.

   Debugging the Firmware
       piodebug offers the easiest way to debug the board. Firstly, we need to specify projectconf_debug_tool in
       projectconf. Since the board has an on-board JLink debug probe we can directly declare it in projectconf:

          [env:nrf52_dk]
          platform = nordicnrf52
          board = nrf52_dk
          framework = arduino
          debug_tool = jlink

       To  start  the  debug  session  we  can use next options: Debug: Start debugging from the top menu, Start
       Debugging option from Quick Access menu or hotkey button F5: [image]

       We need to wait some time while PlatformIO is initializing the debug session  and  when  the  first  line
       after the main function is highlighted we are ready to debug: [image]

       We  can  walk  through  the  code  using control buttons, set breakpoints, add variables to Watch window:
       [image]

   Writing Unit Tests
       Test cases can be added to a single file that may include multiple tests. First of all, in this file,  we
       need  to  add  four  default functions: setUp, tearDown, setup and loop. Functions setUp and tearDown are
       used to initialize and finalize test conditions. Implementations of these functions are not required  for
       running  tests  but  if  you  need  to initialize some variables before you run a test, you use the setUp
       function and if you need to clean up variables you use tearDown function. In  our  example  we  will  use
       these functions to accordingly initialize and deinitialize LED.  setup and loop functions act as a simple
       Arduino program where we describe our test plan.

       Let's create test folder in the root of the project and add a new file test_main.cpp to this folder. Next
       basic tests for String class will be implemented in this file:

       • test_string_concat tests the concatenation of two strings

       • test_string_substring tests the correctness of the substring extraction

       • test_string_index_of ensures that the string returns the correct index of the specified symbol

       • test_string_equal_ignore_case tests case-insensitive comparison of two strings

       • test_string_to_upper_case tests upper-case conversion of the string

       • test_string_replace tests the correctness of the replacing operation

       NOTE:

          • 2 sec delay is required since the board doesn't support software resetting via Serial.DTR/RTS

          #include <Arduino.h>
          #include <unity.h>

          String STR_TO_TEST;

          void setUp(void) {
              // set stuff up here
              STR_TO_TEST = "Hello, world!";
          }

          void tearDown(void) {
              // clean stuff up here
              STR_TO_TEST = "";
          }

          void test_string_concat(void) {
              String hello = "Hello, ";
              String world = "world!";
              TEST_ASSERT_EQUAL_STRING(STR_TO_TEST.c_str(), (hello + world).c_str());
          }

          void test_string_substring(void) {
              TEST_ASSERT_EQUAL_STRING("Hello", STR_TO_TEST.substring(0, 5).c_str());
          }

          void test_string_index_of(void) {
              TEST_ASSERT_EQUAL(7, STR_TO_TEST.indexOf('w'));
          }

          void test_string_equal_ignore_case(void) {
              TEST_ASSERT_TRUE(STR_TO_TEST.equalsIgnoreCase("HELLO, WORLD!"));
          }

          void test_string_to_upper_case(void) {
              STR_TO_TEST.toUpperCase();
              TEST_ASSERT_EQUAL_STRING("HELLO, WORLD!", STR_TO_TEST.c_str());
          }

          void test_string_replace(void) {
              STR_TO_TEST.replace('!', '?');
              TEST_ASSERT_EQUAL_STRING("Hello, world?", STR_TO_TEST.c_str());
          }

          void setup()
          {
              delay(2000); // service delay
              UNITY_BEGIN();

              RUN_TEST(test_string_concat);
              RUN_TEST(test_string_substring);
              RUN_TEST(test_string_index_of);
              RUN_TEST(test_string_equal_ignore_case);
              RUN_TEST(test_string_to_upper_case);
              RUN_TEST(test_string_replace);

              UNITY_END(); // stop unit testing
          }

          void loop()
          {
          }

       Now  we  are  ready  to  upload  tests  to  the board. To do this we can use next options: Test button on
       ide_vscode_toolbar, Test option from the Project Tasks menu or Tasks: Run Task... > PlatformIO Test  from
       the top menu: [image]

       After processing we should see a detailed report about the testing results: [image]

       As we can see from the report, all our tests were successful!

   Adding Bluetooth LE features
       To  add the basic BLE functionality to our project we need to define the SoftDevice version and install a
       library called BLEPeripheral.  Both these modifications can be specified in projectconf:

          [env:nrf52_dk]
          platform = nordicnrf52
          board = nrf52_dk
          framework = arduino
          debug_tool = jlink
          ; SoftDevice version
          build_flags = -DNRF52_S132
          lib_deps =
            BLEPeripheral

       Now let's create a basic application that can interact with other BLE devices (e.g  phone)  For  example,
       next code declares a BLE characteristic that controls the state of the LED1.

          #include <Arduino.h>
          #include <SPI.h>
          #include <BLEPeripheral.h>

          BLEPeripheral ledPeripheral = BLEPeripheral();

          BLEService ledService = BLEService("19b10000e8f2537e4f6cd104768a1214");
          BLECharCharacteristic ledCharacteristic = BLECharCharacteristic("19b10001e8f2537e4f6cd104768a1214", BLERead | BLEWrite);

          void setup()
          {
            pinMode(LED_BUILTIN, OUTPUT);

            ledPeripheral.setAdvertisedServiceUuid(ledService.uuid());
            ledPeripheral.addAttribute(ledService);
            ledPeripheral.addAttribute(ledCharacteristic);
            ledPeripheral.setLocalName("Nordic NRF52 DK");
            ledPeripheral.begin();
          }

          void loop()
          {
            BLECentral central = ledPeripheral.central();

            if (central) {
              while (central.connected()) {
                if (ledCharacteristic.written()) {
                  if (ledCharacteristic.value()) {
                    digitalWrite(LED_BUILTIN, HIGH);
                  }
                  else{
                    digitalWrite(LED_BUILTIN, LOW);
                  }
                }
              }
            }
          }

       Now  we  can  compile  and upload this program to the board as described in previous sections.  To verify
       that our application works as expected, we can use any Android smartphone with BLE feature and Nordic nRF
       Connect tool.

       At  first,  we need to scan all advertising BLE devices and connect to the device called Nordic NRF52 DK.
       After a successful connection to the board, we  should  see  one  "Unknown  Service"  with  one  "Unknown
       Characteristic" fields: [image]

       To switch the LED on or off we just need write 0 or 1 as UINT8 to the BLE characteristic: [image]

   Conclusion
       Now  we  have  a project template for Nordic nRF52-DK board that we can use as a boilerplate for the next
       projects.

   Zephyr and Nordic nRF52-DK: debugging, unit testing, project analysis
       The goal of this tutorial is to demonstrate how simple it is to use ide_vscode to develop, run and  debug
       a simple Bluetooth project using framework_zephyr framework for the Nordic nRF52-DK board.

       • Level: Intermediate

       • Platforms: Windows, Mac OS X, Linux

       Requirements:

              • Downloaded and installed ide_vscode

              • Install drivers for debugging_tool_jlink debug tool

              • Nordic nRF52-DK development board

   ContentsSetting Up the ProjectAdding Code to the Generated ProjectCompiling and Uploading the FirmwareDebugging the FirmwareWriting Unit TestsProject InspectionConclusion

   Setting Up the Project
       1. Click on "PlatformIO Home" button on the bottom PlatformIO Toolbar:
             [image]

       2. Click  on  "New  Project",  select  Nordic  nRF52-DK as the development board, framework_zephyr as the
          framework and a path to the project location (or use the default one):
             [image]

   Adding Code to the Generated Project
       1. Create a new file main.c in projectconf_pio_src_dir folder and add the following code:

                 //
                 // Copyright (c) 2015-2016 Intel Corporation
                 //
                 // SPDX-License-Identifier: Apache-2.0
                 //

                 #include <zephyr/types.h>
                 #include <stddef.h>
                 #include <sys/printk.h>
                 #include <sys/util.h>

                 #include <bluetooth/bluetooth.h>
                 #include <bluetooth/hci.h>

                 #define DEVICE_NAME CONFIG_BT_DEVICE_NAME
                 #define DEVICE_NAME_LEN (sizeof(DEVICE_NAME) - 1)

                 // Set Advertisement data. Based on the Eddystone specification:
                 // https://github.com/google/eddystone/blob/master/protocol-specification.md
                 // https://github.com/google/eddystone/tree/master/eddystone-url

                 static const struct bt_data ad[] = {
                     BT_DATA_BYTES(BT_DATA_FLAGS, BT_LE_AD_NO_BREDR),
                     BT_DATA_BYTES(BT_DATA_UUID16_ALL, 0xaa, 0xfe),
                     BT_DATA_BYTES(BT_DATA_SVC_DATA16,
                               0xaa, 0xfe,
                               0x10, // Eddystone-URL frame type
                               0x00, // Calibrated Tx power at 0m
                               0x00, // URL Scheme Prefix http://www.
                               'z', 'e', 'p', 'h', 'y', 'r',
                               'p', 'r', 'o', 'j', 'e', 'c', 't',
                               0x08) // .org
                 };

                 // Set Scan Response data
                 static const struct bt_data sd[] = {
                     BT_DATA(BT_DATA_NAME_COMPLETE, DEVICE_NAME, DEVICE_NAME_LEN),
                 };

                 static void bt_ready(int err)
                 {
                     if (err) {
                         printk("Bluetooth init failed (err %d)\n", err);
                         return;
                     }

                     printk("Bluetooth initialized\n");

                     // Start advertising
                     err = bt_le_adv_start(BT_LE_ADV_NCONN, ad, ARRAY_SIZE(ad),
                                   sd, ARRAY_SIZE(sd));
                     if (err) {
                         printk("Advertising failed to start (err %d)\n", err);
                         return;
                     }

                     printk("Beacon started\n");
                   }

                 void main(void)
                 {
                     int err;

                     printk("Starting Beacon Demo\n");

                     // Initialize the Bluetooth Subsystem
                     err = bt_enable(bt_ready);
                     if (err) {
                         printk("Bluetooth init failed (err %d)\n", err);
                     }
                 }

       2. By default Bluetooth feature is disabled, we can enable it by creating a new file prj.conf  in  zephyr
          folder and adding the following lines:

                 CONFIG_BT=y
                 CONFIG_BT_DEBUG_LOG=y
                 CONFIG_BT_DEVICE_NAME="Test beacon"

   Compiling and Uploading the Firmware
       1. To compile the project use one of the following options:

             • Build option from the Project Tasks menu

             • Build button in ide_vscode_toolbar

             • Task Menu Tasks: Run Task... > PlatformIO: Build or in ide_vscode_toolbar

             • Command Palette View: Command Palette > PlatformIO: Build

             • Hotkeys cmd-alt-b / ctrl-alt-b:
             [image]

       2. If everything went well, we should see a successful result message in the terminal window:
             [image]

       3. To upload the firmware to the board we can use the following options:

             • Upload option from the Project Tasks menu

             • Upload button in ide_vscode_toolbar

             • Command Palette View: Command Palette > PlatformIO: Upload

             • Task Menu Tasks: Run Task... > PlatformIO: Upload

             • Hotkeys cmd-alt-u / ctrl-alt-u:
             [image]

       4. Connect  the  board  to your computer and update the default monitor speed to 115200 in platformio.ini
          file:

                 [env:hifive1-revb]
                 platform = sifive
                 board = hifive1-revb
                 framework = zephyr
                 monitor_speed = 115200

       5. Open Serial Monitor to observe the output from the board:
             [image]

       6. If everything went well, the board should be visible as a beacon:
             [image]

   Debugging the Firmware
       Since Nordic nRF52-DK includes an onboard debug probe we can use piodebug without any configuration.

       1. To start a debug session we can use the following options:

             • Debug: Start debugging from the top menu

             • Start Debugging option from Quick Access menu

             • Hotkey button F5:
             [image]

       2. We can walk through the code using control buttons, set breakpoints, add variables to Watch window:
             [image]

   Writing Unit Tests
       NOTE:
          Functions setUp and tearDown are used to initialize and finalize test conditions.  Implementations  of
          these functions are not required for running tests but if you need to initialize some variables before
          you run a test, you use the setUp function and if you need to clean  up  variables  you  use  tearDown
          function.

       For  the  sake  of  simplicity,  let's  create a small library called calculator, implement several basic
       functions add, sub, mul, div and test them using unit_testing engine.

       1. PlatformIO uses a unit testing framework  called  Unity.  Unity  is  not  compatible  with  C  library
          implemented in the framework. Let's enable standard version of newlib C library in prj.conf file using
          the following config:

                 CONFIG_NEWLIB_LIBC=y

       2. Create a new folder calculator in the lib folder and add two new files calculator.h  and  calculator.c
          with the following contents:
             calculator.h:

                 #ifndef _CALCULATOR_H_
                 #define _CALCULATOR_H_

                 #ifdef __cplusplus
                 extern "C" {
                 #endif

                 int add (int a, int b);
                 int sub (int a, int b);
                 int mul (int a, int b);
                 int div (int a, int b);

                 #ifdef __cplusplus
                 }
                 #endif

                 #endif // _CALCULATOR_H_

             calculator.c:

                 #include "calculator.h"

                 int add(int a, int b)
                 {
                     return a + b;
                 }

                 int sub(int a, int b)
                 {
                     return a - b;
                 }

                 int mul(int a, int b)
                 {
                     return a * b;
                 }

       3. Create a new file `test_calc.c to the folder test and add basic tests for calculator library:

                 #include <calculator.h>
                 #include <unity.h>

                 void test_function_calculator_addition(void) {
                     TEST_ASSERT_EQUAL(32, add(25, 7));
                 }

                 void test_function_calculator_subtraction(void) {
                     TEST_ASSERT_EQUAL(20, sub(23, 3));
                 }

                 void test_function_calculator_multiplication(void) {
                     TEST_ASSERT_EQUAL(50, mul(25, 2));
                 }

                 void test_function_calculator_division(void) {
                     TEST_ASSERT_EQUAL(32, div(100, 3));
                 }

                 void main() {
                     UNITY_BEGIN();

                     RUN_TEST(test_function_calculator_addition);
                     RUN_TEST(test_function_calculator_subtraction);
                     RUN_TEST(test_function_calculator_multiplication);
                     RUN_TEST(test_function_calculator_division);

                     UNITY_END();
                 }

       4. Let's   run   tests   on   the   board  and  check  the  results.  There  should  be  a  problem  with
          test_function_calculator_division test:
             [image]

       5. Let's fix the incorrect expected value, run tests  again.  After  processing  the  results  should  be
          correct:
             [image]

   Project Inspection
       For  illustrative  purposes,  let's imagine we need to find a function with the biggest memory footprint.
       Also, let's introduce a bug to our project so piocheck can report it.

       1. Open PlatformIO Home and navigate to Inspect section, select the current  project  and  press  Inspect
          button:
             [image]

       2. Project statistics:
             [image]

       3. The biggest function:
             [image]

       4. Possible bugs:
             [image]

   Conclusion
       Now  we have a project template for Nordic Nordic nRF52-DK board that we can use as a boilerplate for the
       next projects.

   RISC-V ASM Video Tutorial
       An introduction to using platform_sifive and Assembly language  on  the  SiFive  board_sifive_hifive1  by
       Martin Fink, Chief Technology Officer at Western Digital.

   Source Files
       A demo source code is published on Github: https://github.com/martin-robert-fink/superBlink.git

       It is already pre-configured PlatformIO project:

       • Clone it or download

       • Open in ide_vscode

       • Happy coding and debugging!

   Video Collection
       .INDENT 0.0

       • Part 1 of 12 | IntroductionPart 2 of 12 | Setting UpPart 3 of 12 | Tour PlatformIOPart 4 of 12 | C Code WrapperPart 5 of 12 | HiFive DocsPart 6 of 12 | Understanding GPIOPart 7 of 12 | setupGPIOPart 8 of 12 | Debug setupGPIOPart 9 of 12 | setLEDPart 10 of 12 | Debug setLEDPart 11 of 12 | DelayPart 12 of 12 | Final and Conclusion

   Project Examples
       Pre-configured projects with source code are located in PlatformIO Examples repository.

   Community ProjectsPlatformIO DIY Projects & Tutorials at Hackster.io

   Community Video TutorialsPlatformIO Video Collection on YouTubeNext-generation IDE for your RISC-V Product in 20 Minutes by CEO of PlatformIOUse the PlatformIO Debugger on the ESP32 Using an ESP-progRISC-V ASM TutorialPlatformIO for Arduino, ESP8266, and ESP32 TutorialFree Inline Debugging for ESP32 and Arduino SketchesPlatformIO или прощай, Arduino IDEОтладка ESP32 в PlatformIOA Better Arduino IDE - Getting Started with PlatformIOPlatformIO - Using External Libraries

   platformio.ini (Project Configuration File)
       Each  PlatformIO  project  has  a  configuration  file named platformio.ini in the root directory for the
       project. This is a INI-style file.

       platformio.ini has sections (each denoted by a [header]) and key / value pairs within the sections. Lines
       beginning with ; are ignored and may be used to provide comments.

       Multiple value options can be specified in two ways:

       1. Split values with ", " (comma + space)

       2. Multi-line format, where each new line starts with at least two spaces

       There are two required sections:

       • piocore settings: projectconf_section_platformio

       • Environment settings: projectconf_section_env

       The other sections are optional to include. Here are the allowed sections and their allowed contents:

   Section [platformio]Generic optionsdescriptiondefault_envsextra_configsDirectory optionscore_dirgloballib_dirplatforms_dirpackages_dircache_dirbuild_cache_dirworkspace_dirbuild_dirlibdeps_dirinclude_dirsrc_dirlib_dirdata_dirtest_dirboards_dirshared_dir

       The platform.ini platformio section is used for overriding the default configuration options for piocore.

       NOTE:
          Relative path is allowed for directory option:

          • ~ will be expanded to user's home directory

          • ../ or ..\ go up to one folder

          There is a $PROJECT_HASH template variable. You can use it in a directory path. It will by replaced by
          a SHA1[0:10] hash of the full project path.  This is very useful  to  declare  a  global  storage  for
          project      workspaces.      For     example,     /tmp/pio-workspaces/$PROJECT_HASH     (Unix)     or
          $[sysenv.TEMP}/pio-workspaces/$PROJECT_HASH (Windows).  You can set a global workspace directory using
          the system environment variable PLATFORMIO_WORKSPACE_DIR.

          See the available directory ***_dir options below.

   Generic options
   description
       Type: String | Multiple: No

       Short description of the project. PlatformIO uses it for piohome in the multiple places.

   default_envs
       Type: String | Multiple: Yes

       The  cmd_run  command processes all environments [env:***] by default if the platformio run --environment
       option is not specified.  default_envs allows one to define which environments that should  be  processed
       by default.

       Also, piodebug checks this option when looking for debug environment.

       This option can also be configured by the global environment variable PLATFORMIO_DEFAULT_ENVS.

       Example:

          [platformio]
          default_envs = uno, nodemcu

          [env:uno]
          platform = atmelavr
          framework = arduino
          board = uno

          [env:nodemcu]
          platform = espressif8266
          framework = arduino
          board = nodemcu

          [env:teensy31]
          platform = teensy
          framework = arduino
          board = teensy31

          [env:lpmsp430g2553]
          platform = timsp430
          framework = arduino
          board = lpmsp430g2553
          build_flags = -D LED_BUILTIN=RED_LED

   extra_configs
       New in version 4.0.

       Type: String (Pattern) | Multiple: Yes

       This  option allows extending a base projectconf with extra configuration files. The format and rules are
       the same as for the projectconf.  A name of the configuration file can be any.

       extra_configs can be a single path to an extra configuration file or a list of them. Please note that you
       can use Unix shell-style wildcards:

                                     ┌────────┬──────────────────────────────────┐
                                     │Pattern │ Meaning                          │
                                     ├────────┼──────────────────────────────────┤
                                     │*       │ matches everything               │
                                     ├────────┼──────────────────────────────────┤
                                     │?       │ matches any single character     │
                                     ├────────┼──────────────────────────────────┤
                                     │[seq]   │ matches any character in seq     │
                                     ├────────┼──────────────────────────────────┤
                                     │[!seq]  │ matches any character not in seq │
                                     └────────┴──────────────────────────────────┘

       NOTE:
          If you declare the same pair of "group" + "option" in an extra configuration file which was previously
          declared in a base projectconf, it will be overwritten with a value from extra configuration.

       Example

       Base "platformio.ini"

          [platformio]
          extra_configs =
            extra_envs.ini
            extra_debug.ini

          ; Global data for all [env:***]
          [env]
          platform = espressif32
          framework = espidf

          ; Custom data group
          ; can be use in [env:***] via ${common.***}
          [common]
          debug_flags = -D RELEASE
          lib_flags = -lc -lm

          [env:esp-wrover-kit]
          board = esp-wrover-kit
          build_flags = ${common.debug_flags}

       "extra_envs.ini"

          [env:esp32dev]
          board = esp32dev
          build_flags = ${common.lib_flags} ${common.debug_flags}

          [env:lolin32]
          platform = espressif32
          framework = espidf
          board = lolin32
          build_flags = ${common.debug_flags}

       "extra_debug.ini"

          # Override base "common.debug_flags"
          [common]
          debug_flags = -D DEBUG=1

          [env:lolin32]
          build_flags = -Og

       After a parsing process, configuration state will be the next:

          [common]
          debug_flags = -D DEBUG=1
          lib_flags = -lc -lm

          [env:esp-wrover-kit]
          platform = espressif32
          framework = espidf
          board = esp-wrover-kit
          build_flags = ${common.debug_flags}

          [env:esp32dev]
          platform = espressif32
          framework = espidf
          board = esp32dev
          build_flags = ${common.lib_flags} ${common.debug_flags}

          [env:lolin32]
          platform = espressif32
          framework = espidf
          board = lolin32
          build_flags = -Og

   Directory options
   core_dir
       New in version 4.0.

       Type: DirPath | Multiple: No

       The core_dir variable points out the directory used for all development  platform  packages  (toolchains,
       frameworks,  SDKs,  upload  and debug tools), global libraries for ldf, and other PlatformIO Core service
       data. The size of this folder will depend on the number of installed development platforms.

       The default value is the user's home directory:

       • Unix ~/.platformio

       • Windows %HOMEPATH%\.platformio

       This option can also be configured by the global environment variable PLATFORMIO_CORE_DIR.

       Example:

          [platformio]
          core_dir = /path/to/custom/pio-core/storage

   globallib_dir
       New in version 4.0.

       Type: DirPath | Multiple: No | Default: "core_dir/lib"

       Global library storage for PlatfrmIO projects and librarymanager where ldf looks for dependencies.

       This option can also be configured by the global environment variable PLATFORMIO_GLOBALLIB_DIR.

   platforms_dir
       New in version 4.0.

       Type: DirPath | Multiple: No | Default: "core_dir/platforms"

       Global storage where PlatformIO Package Manager installs platforms.

       This option can also be configured by the global environment variable PLATFORMIO_PLATFORMS_DIR.

   packages_dir
       New in version 4.0.

       Type: DirPath | Multiple: No | Default: "core_dir/packages"

       Global storage where PlatformIO Package Manager installs platforms dependencies (toolchains,  frameworks,
       SDKs, upload and debug tools).

       This option can also be configured by the global environment variable PLATFORMIO_PACKAGES_DIR.

   cache_dir
       New in version 4.0.

       Type: DirPath | Multiple: No | Default: "core_dir/cache"

       piocore  uses  this  folder  to  store  caching  information (requests to PlatformIO Registry, downloaded
       packages and other service information).

       To reset a cache, please run cmd_update command.

       This option can also be configured by the global environment variable PLATFORMIO_CACHE_DIR.

   build_cache_dir
       New in version 4.0.

       Type: DirPath | Multiple: No | Default: None (Disabled)

       piocore uses this folder to store derived files from a build system  (objects,  firmwares,  ELFs).  These
       files  are shared between all build environments. To speed up a build process, you can use the same cache
       folder between different projects if they depend on the same development platform and framework.

       This option can also be configured by the global environment variable PLATFORMIO_BUILD_CACHE_DIR.

       The example of projectconf below instructs PlatformIO Build System to check build_cache_dir  for  already
       compiled  objects for framework_stm32cube and project source files. The cached object will not be used if
       the original source file was modified or build environment  has  a  different  configuration  (new  build
       flags, etc):

          [platformio]
          ; Set a path to a cache folder
          build_cache_dir =

          ; Examples:
          ; (Unix) build_cache_dir = /path/to/cache/folder
          ; (Windows) build_cache_dir = C:/path/to/cache/folder

          [env:bluepill_f103c6]
          platform = ststm32
          framework = stm32cube
          board = bluepill_f103c6

          [env:nucleo_f411re]
          platform = ststm32
          framework = stm32cube
          board = nucleo_f411re

   workspace_dir
       New in version 4.0.

       Type: DirPath | Multiple: No | Default: "Project/.pio"

       The  path  to  a  project  workspace directory where PlatformIO keeps by default compiled objects, static
       libraries, firmwares, and external library dependencies. It is used by these options:

       • build_dirlibdeps_dir.

       The default value is .pio and means that folder is located in the root of project.

       This option can also be configured by the global environment variable PLATFORMIO_WORKSPACE_DIR.

   build_dir
       WARNING:
          PLEASE DO NOT EDIT FILES IN THIS FOLDER. PlatformIO will overwrite your changes  on  the  next  build.
          THIS IS A CACHE DIRECTORY.

       Type: DirPath | Multiple: No | Default: "workspace_dir/build"

       PlatformIO  Build System uses this folder for project environments to store compiled object files, static
       libraries, firmwares and other cached information. It allows PlatformIO to build  source  code  extremely
       fast!

       You  can delete this folder without any risk! If you modify projectconf, then PlatformIO will remove this
       folder automatically. It will be created on the next build operation.

       This option can also be configured by the global environment variable PLATFORMIO_BUILD_DIR.

       NOTE:
          If you have any problems with building your project environments which  are  defined  in  projectconf,
          then  TRY  TO DELETE this folder. In this situation you will remove all cached files without any risk.
          Also, you can use "clean" target for platformio run --target command.

   libdeps_dir
       Type: DirPath | Multiple: No | Default: "workspace_dir/libdeps"

       Internal storage where librarymanager will install project dependencies (projectconf_lib_deps).

       This option can also be configured by the global environment variable PLATFORMIO_LIBDEPS_DIR.

   include_dir
       Type: DirPath | Multiple: No | Default: "Project/include"

       The path to project's default header files. PlatformIO uses it for the cmd_run command. The default value
       is  include  meaning an include directory located under the root directory of the project. This path will
       be added to CPPPATH of the build environment.

       If you need to add extra include directories to CPPPATH scope, please use projectconf_build_flags with -I
       /path/to/extra/dir option.

       This option can also be configured by the global environment variable PLATFORMIO_INCLUDE_DIR.

   src_dir
       Type: DirPath | Multiple: No | Default: "Project/src"

       The  path  to  the  project's directory with source code. PlatformIO uses it for the cmd_run command. The
       default value is src meaning a src directory located in the root directory of the project.

       This option can also be configured by the global environment variable PLATFORMIO_SRC_DIR.

       NOTE:
          This option is useful for people who migrate from Arduino IDE where the source directory  should  have
          the same name as the main source file.  See example project with own source directory.

   lib_dir
       Type: DirPath | Multiple: No | Default: "Project/lib"

       You can put your own/private libraries here. The source code of each library should be placed in separate
       directory, like lib/private_lib/[here are source files]. This directory has the highest priority for ldf.

       The default value is lib, meaning a lib directory located in the root of the project.

       This option can also be configured by the global environment variable PLATFORMIO_LIB_DIR.

       For example, see how the Foo and Bar libraries are organized:

          |--lib
          |  |--Bar
          |  |  |--docs
          |  |  |--examples
          |  |  |--src
          |  |     |- Bar.c
          |  |     |- Bar.h
          |  |--Foo
          |  |  |- Foo.c
          |  |  |- Foo.h
          |- platformio.ini
          |--src
             |- main.c

       Then in src/main.c you should use:

          #include <Foo.h>
          #include <Bar.h>

          // rest of H/C/CPP code

       PlatformIO will find your libraries automatically, configure the preprocessor's include paths  and  build
       them.

   data_dir
       Type: DirPath | Multiple: No | Default: "Project/data"

       Data  directory  to store contents and platform_espressif_uploadfs.  The default value is data that means
       that folder is located in the root of the project.

       This option can also be configured by the global environment variable PLATFORMIO_DATA_DIR.

   test_dir
       Type: DirPath | Multiple: No | Default: "Project/test"

       The directory where unit_testing engine will look for the tests.  The default value is  test,  meaning  a
       test directory located in the root of the project.

       This option can also be configured by the global environment variable PLATFORMIO_TEST_DIR.

   boards_dir
       Type: DirPath | Multiple: No | Default: "Project/boards"

       The  location  of  project-specific board definitions. Each project may choose a suitable directory name.
       The default value is boards, meaning a "boards" directory located in the root of the project.

       By default, PlatformIO looks for boards in this order:

       1. Project boards_dir (as defined by this setting)

       2. Global core_dir/boards

       3. Development platform core_dir/platforms/*/boards.

       This option can also be configured by the global environment variable PLATFORMIO_BOARDS_DIR.

   shared_dir
       New in version 4.0.

       Type: DirPath | Multiple: No | Default: "Project/shared"

       pioremote uses this folder to synchronize extra files between remote machine. For example, you can  share
       projectconf_extra_scripts.

       Please note that these folders are automatically shared between remote machine with platformio remote run
       --force-remote or platformio remote test --force-remote commands:

       • lib_dirinclude_dirsrc_dirboards_dirdata_dirtest_dir

       The default value is shared, meaning a directory named "shared" located in the root of the project.

       This option can also be configured by the global environment variable PLATFORMIO_SHARED_DIR.

   Section [env]Common [env]Environment [env:NAME]Options

       Each project may have multiple configuration  environments  defining  the  available  project  tasks  for
       building,  programming,  debugging,  unit  testing,  device  monitoring,  library  dependencies, etc. The
       configuration environments are declared using [env] sections in projectconf.

       The allowed options are listed under Options.

   Common [env]
       New in version 4.0.

       An optional configuration environment with common options that will  be  shared  between  all  [env:NAME]
       environments  in  the  platform.ini  file.  It  is  very  useful  if  the configuration file has a lot of
       environments [env:NAME] and they share common settings.

       For example:

          [env]
          platform = ststm32
          framework = stm32cube
          board = nucleo_l152re
          lib_deps = Dep1, Dep2

          [env:release]
          build_flags = -D RELEASE
          lib_deps =
              ${env.lib_deps}
              Dep3

          [env:debug]
          build_type = debug
          build_flags = -D DEBUG
          lib_deps = DepCustom

       In this example we have  two  configuration  environments  release  and  debug.  This  is  equivalent  to
       duplicating all options as shown below:

          [env:release]
          platform = ststm32
          framework = stm32cube
          board = nucleo_l152re
          build_flags = -D RELEASE
          lib_deps = Dep1, Dep2, Dep3

          [env:debug]
          platform = ststm32
          framework = stm32cube
          board = nucleo_l152re
          build_type = debug
          build_flags = -D DEBUG
          lib_deps = DepCustom

   Environment [env:NAME]
       A  section  with an env: prefix defines a working environment for cmd_run, cmd_test, cmd_check, cmd_debug
       and other commands.  Multiple [env:NAME] environments with different NAME are allowed. Every project must
       define at least one working environment.

       Each environment must have a unique NAME. The valid chars for NAME are letters a-z, numbers 0-9,  special
       char _ (underscore).  For example, [env:hello_world].

       If you have multiple working environments and you need to process  only  a  few  of  them,  the  commands
       mentioned  above  accept  the  -e, --environment option to select a subset of the working environments to
       process.  The [platformio] projectconf_pio_default_envs option can be used to define  a  default  set  of
       working environments for the commands to process.

   Options
   Platform optionsplatformplatform_packagesframeworkboardboard_build.mcuboard_build.f_cpuboard_build.ldscriptMore options

   platform
       Type: String | Multiple: No

       platforms name.

       PlatformIO   allows   one   to   use   specific   version   of   platform   using   Semantic   Versioning
       (X.Y.Z=MAJOR.MINOR.PATCH) or VCS (Git, Mercurial and Subversion).

       Version specifications can take any of the following forms:

       • 1.2.3: an exact version number. Use only this exact version

       • ^1.2.3: any compatible version (exact version for 1.x.x versions)

       • ~1.2.3: any version with the same major and minor versions, and an equal or greater patch version

       • >1.2.3: any version greater than 1.2.3. >=, <, and <= are also possible

       • >0.1.0,!=0.2.0,<0.3.0: any version greater than 0.1.0, not equal to 0.2.0 and less than 0.3.0

       Other forms are the same as for the  cmd_platform_install command.

       Examples:

          [env:the_latest_version]
          platform = atmelavr

          [env:exact_version]
          platform = atmelavr@1.2.3

          [env:specific_major_version]
          platform = atmelavr@^1.2.3

          [env:specific_major_and_minor_version]
          platform = atmelavr@~1.2.3

          [env:development_verion_by_git]
          platform = https://github.com/platformio/platform-ststm32.git

          [env:custom_git_branch]
          platform = https://github.com/platformio/platform-espressif8266.git#feature/stage

          [env:specific_git_commit]
          platform = https://github.com/platformio/platform-espressif8266.git#921855a9c530082efddb5d48b44c3f4be0e2dfa2

   platform_packages
       New in version 4.0.

       Type: String | Multiple: Yes

       Configure custom packages per a build environment. You can also override default  packages  by  platforms
       using the same name. Packages will be installed in projectconf_pio_packages_dir.

       Examples:

          [env:override_default_toolchain]
          platform = atmelavr
          platform_packages =
            ; use GCC AVR 5.0+
            toolchain-gccarmnoneeabi@>1.50000.0

          [env:override_framework]
          platform = espressif8266
          platform_packages =
            ; use upstream Git version
            framework-arduinoespressif8266 @ https://github.com/esp8266/Arduino.git

          [env:external_package]
          platform = ststm32
          platform_packages =
            ; latest openOCD from PlatformIO Package Registry
            tool-openocd

            ; source code of ST-Link
            tool-stlink-source @ https://github.com/texane/stlink.git

   framework
       Type: String | Multiple: Yes

       frameworks name.

   board
       Type: String (ID) | Multiple: No

       PlatformIO has pre-configured settings for the most popular boards:

       • build configuration

       • upload configuration

       • debugging configuration

       • connectivity information, etc.

       You can find a valid  board ID in boards catalog, Boards Explorer or cmd_boards command.

   board_build.mcu
       Type: String | Multiple: No

       board_build.mcu  is  a  microcontroller(MCU) type that is used by compiler to recognize MCU architecture.
       The correct type of board_build.mcu depends on platform library. For example, the list of board_build.mcu
       for "megaAVR Devices" is described here.

       The  full  list  of  board_build.mcu for the popular embedded platforms you can find in Boards section of
       platforms. See "Microcontroller" column.

   board_build.f_cpu
       Type: Integer | Multiple: No

       The option board_build.f_cpu is used to define MCU frequency (Hertz, Clock). A format of this  option  is
       C-like long integer value with L suffix. The 1 Hertz is equal to 1L, then 16 MHz (Mega Hertz) is equal to
       16000000L.

       The full list of board_build.f_cpu for the popular embedded platforms you can find in Boards  section  of
       platforms.  See  "Frequency"  column.  You  can overclock a board by specifying a board_build.f_cpu value
       other than the default.

   board_build.ldscript
       Type: String | Multiple: No

       Path to the linker script to be used instead of the one defined  by  a  framework.  This  is  useful  for
       specifying  a  modified linker script, for example, when an application requires a special memory section
       for a bootloader.

   More options
       You can override any board option declared in manifest file using the  next  format  board_{OBJECT.PATH},
       where  {OBJECT.PATH}  is an object path in JSON manifest. Please navigate to "boards" folder of PlatfomIO
       development platforms and open JSON file to list all available options.

       For example, Manifest: Espressif ESP32 Dev Module:

          [env:custom_board_options]
          ; Custom CPU Frequency
          board_build.f_cpu = 160000000L

          ; Custom FLASH Frequency
          board_build.f_flash = 80000000L

          ; Custom FLASH Mode
          board_build.flash_mode = qio

          ; Custom linker script
          board_build.ldscript = /path/to/ldscript.ld

          ; Custom maximum program size
          board_upload.maximum_size = 1310720

   Build optionsbuild_typebuild_flagsBuilt-in VariablesDynamic build flagssrc_build_flagsbuild_unflagssrc_filtertargets

   build_type
       New in version 4.0.

       Type: String | Multiple: No | Default: release

       See extended documentation for build_configurations.

   build_flags
       Type: String | Multiple: Yes

       These flags/options affect the preprocessing, compilation, assembly and linking processes for C  and  C++
       code. All compiler and linker flags can be used. Here is a list of some common options.

       In spite of the name, CPPDEFINES rows also applies to the C compiler.

                     ┌───────────────────┬────────────────────────┬──────────────────────────────┐
                     │Format             │ Affects build variable │ Description                  │
                     ├───────────────────┼────────────────────────┼──────────────────────────────┤
                     │-D name            │ CPPDEFINES             │ Predefine  name  as a macro, │
                     │                   │                        │ with definition 1.           │
                     └───────────────────┴────────────────────────┴──────────────────────────────┘

                     │-D name=definition │ CPPDEFINES             │ The contents  of  definition │
                     │                   │                        │ are  tokenized and processed │
                     │                   │                        │ as if they  appeared  during │
                     │                   │                        │ translation phase three in a │
                     │                   │                        │ #define directive.           │
                     ├───────────────────┼────────────────────────┼──────────────────────────────┤
                     │-U name            │ CPPDEFINES             │ Cancel     any      previous │
                     │                   │                        │ definition  of  name, either │
                     │                   │                        │ built in or provided with  a │
                     │                   │                        │ -D option.                   │
                     ├───────────────────┼────────────────────────┼──────────────────────────────┤
                     │-Wp,option         │ CPPFLAGS               │ Bypass  the  compiler driver │
                     │                   │                        │ and  pass  option   directly │
                     │                   │                        │ through to the preprocessor  │
                     ├───────────────────┼────────────────────────┼──────────────────────────────┤
                     │-Wall              │ CCFLAGS                │ Turn    on    all   optional │
                     │                   │                        │ warnings which are desirable │
                     │                   │                        │ for normal code.             │
                     ├───────────────────┼────────────────────────┼──────────────────────────────┤
                     │-Werror            │ CCFLAGS                │ Make  all warnings into hard │
                     │                   │                        │ errors. With this option, if │
                     │                   │                        │ any   source  code  triggers │
                     │                   │                        │ warnings,  the   compilation │
                     │                   │                        │ will be aborted.             │
                     ├───────────────────┼────────────────────────┼──────────────────────────────┤
                     │-w                 │ CCFLAGS                │ Suppress    all    warnings, │
                     │                   │                        │ including  those  which  GNU │
                     │                   │                        │ CPP issues by default.       │
                     ├───────────────────┼────────────────────────┼──────────────────────────────┤
                     │-include file      │ CCFLAGS                │ Process  file as if #include │
                     │                   │                        │ "file" appeared as the first │
                     │                   │                        │ line  of  the primary source │
                     │                   │                        │ file.                        │
                     ├───────────────────┼────────────────────────┼──────────────────────────────┤
                     │-Idir              │ CPPPATH                │ Add the directory dir to the │
                     │                   │                        │ list  of  directories  to be │
                     │                   │                        │ searched for header files.   │
                     ├───────────────────┼────────────────────────┼──────────────────────────────┤
                     │-Wa,option         │ ASFLAGS, CCFLAGS       │ Pass option as an option  to │
                     │                   │                        │ the   assembler.  If  option │
                     │                   │                        │ contains commas, it is split │
                     │                   │                        │ into multiple options at the │
                     │                   │                        │ commas.                      │
                     ├───────────────────┼────────────────────────┼──────────────────────────────┤
                     │-Wl,option         │ LINKFLAGS              │ Pass option as an option  to │
                     │                   │                        │ the    linker.   If   option │
                     │                   │                        │ contains commas, it is split │
                     │                   │                        │ into multiple options at the │
                     │                   │                        │ commas.                      │
                     ├───────────────────┼────────────────────────┼──────────────────────────────┤
                     │-llibrary          │ LIBS                   │ Search  the  library   named │
                     │                   │                        │ library when linking         │
                     ├───────────────────┼────────────────────────┼──────────────────────────────┤
                     │-Ldir              │ LIBPATH                │ Add  directory  dir  to  the │
                     │                   │                        │ list of  directories  to  be │
                     │                   │                        │ searched for -l.             │
                     └───────────────────┴────────────────────────┴──────────────────────────────┘

       This option can also be set by global environment variable PLATFORMIO_BUILD_FLAGS.

       For more detailed information about available flags/options go to:

       • Options to Request or Suppress WarningsOptions for Debugging Your ProgramOptions That Control OptimizationOptions Controlling the PreprocessorPassing Options to the AssemblerOptions for LinkingOptions for Directory Search

       Examples:

          [env:specific_defines]
          build_flags =
            -DFOO -DBAR=1
            -D BUILD_ENV_NAME=$PIOENV
            -D CURRENT_TIME=$UNIX_TIME
            -DFLOAT_VALUE=1.23457e+07

          [env:string_defines]
          build_flags =
            -DHELLO="World!"
            '-DWIFI_PASS="My password"'
            ; Password with special chars: My pass'word
            -DWIFI_PASS=\"My\ pass\'word\"

          [env:specific_inclibs]
          build_flags =
            -I/opt/include
            -L/opt/lib
            -lfoo

          [env:ignore_incremental_builds]
          ; We dynamically change the value of "LAST_BUILD_TIME" macro,
          ; PlatformIO will not cache objects
          build_flags = -DLAST_BUILD_TIME=$UNIX_TIME

       NOTE:
          If  you  need  to  control  build  flags  that  are  specific  for debug configuration please refer to
          projectconf_debug_build_flags.

   Built-in Variables
       You can inject the built-in variables into your build flags, such as:

       • $PYTHONEXE, full path to current Python interpreter

       • $UNIX_TIME, current time in Unix format

       • $PIOENV, name of build environment from projectconf

       • $PIOPLATFORM, name of development platform

       • $PIOFRAMEWORK, a list of frameworks

       • $PROJECT_DIR, project directory

       • $PROJECT_CORE_DIR, PlatformIO Core directory, see projectconf_pio_core_dir

       • $PROJECT_BUILD_DIR, project build directory per all environments

       • $BUILD_DIR, build directory per current environment

       See the full list of PlatformIO variables.

       Please use target envdump for the platformio run --target command to see ALL variable values for a  build
       environment.

   Dynamic build flags
       PlatformIO  allows  users  to  run  an  external  command/script which outputs build flags into STDOUT by
       prepending the shell command with a ! character. PlatformIO  will  automatically  replace  commands  with
       their output when appending flags to build environments.

       You can use any shell or programming language.

       This external command will be called on each cmd_run command before building/uploading process.

       Use cases:

          • Macro with the latest VCS revision/tag "on-the-fly"

          • Generate dynamic headers (*.h)

          • Process media content before generating SPIFFS image

          • Make some changes to source code or related libraries

       NOTE:
          If  you  need  more  advanced  control  and  would  like to apply changes to a PlatformIO Build System
          environment, please refer to projectconf_advanced_scripting.

       Example:

          [env:generate_flags_with_external_command]
          build_flags = !cmd_or_path_to_script

          ; Unix only, get output from internal command
          build_flags = !echo "-DSOME_MACRO="$(some_cmd arg1 --option1)

       Use Case: Create a "PIO_SRC_REV" macro with the latest Git revision

       This example includes a separate file named git_rev_macro.py, to be  placed  in  the  same  directory  as
       platformio.ini.

       platformio.ini:

          [env:git_revision_macro]
          build_flags = !python git_rev_macro.py

       git_rev_macro.py:

          import subprocess

          revision = subprocess.check_output(["git", "rev-parse", "HEAD"]).strip()
          print("-DPIO_SRC_REV=%s" % revision)

   src_build_flags
       Type: String | Multiple: Yes

       An  option  src_build_flags  has  the  same  behavior as build_flags but will be applied only for project
       source files in the projectconf_pio_src_dir directory.

       This option can also be set by the global environment variable PLATFORMIO_SRC_BUILD_FLAGS.

   build_unflags
       Type: String | Multiple: Yes

       Selectively remove base/initial flags that were set by the development platform.

          [env:unflags]
          build_unflags = -Os -std=gnu++11
          build_flags = -O2

   src_filter
       Type: String (Templates) | Multiple: Yes

       This  option  allows  one  to  specify  which  source  files  should  be  included   or   excluded   from
       projectconf_pio_src_dir for a build process.  Filter supports two templates:

       • +<PATH> include template

       • -<PATH> exclude template

       PATH  is  relative to projectconf_pio_src_dir. All patterns will be applied in their order of definition.
       GLOB Patterns are allowed.

       By default, src_filter  is  predefined  to  +<*>  -<.git/>  -<.svn/>  -<example/>  -<examples/>  -<test/>
       -<tests/>,  meaning  "include ALL files, then exclude the .git and svn repository folders and the example
       ... folder.

       This option can also be set by the global environment variable PLATFORMIO_SRC_FILTER.

   targets
       Type: String | Multiple: Yes

       A list of targets which will be processed by the cmd_run command by default. You can enter more than  one
       target, if separated by comma+space ", ".

       The list with available targets is located in platformio run --target.

       Examples

       1. Build  a  project  using  Release  Configuration,  upload  the  firmware,  and  start  Serial  Monitor
          automatically:

                 [env:upload_and_monitor]
                 targets = upload, monitor

       2. Build a project using Debug Configuration.

       Tip! You can use these targets like an option to platformio run --target command. For example:

          # clean project
          platformio run -t clean

          # dump current build environment
          platformio run --target envdump

       When no targets are defined, PlatformIO will build only sources by default.

   Library options
       SEE ALSO:
          Please make sure to read ldf guide first.

       • lib_depslib_ignorelib_extra_dirslib_ldf_modelib_compat_modelib_archive

   lib_deps
       SEE ALSO:
          Please make sure to read ldf guide first.

       Type: String | Multiple: Yes

       Specify project dependencies that should be installed automatically to projectconf_pio_libdeps_dir before
       environment processing.

       If   you   have   multiple   build   environments  that  depend  on  the  same  libraries,  you  can  use
       projectconf_dynamic_vars to use common configuration.

       Valid forms

          ; one line definition (comma + space)
          [env:myenv]
          lib_deps = LIBRARY_1, LIBRARY_2, LIBRARY_N

          ; multi-line definition
          [env:myenv2]
          lib_deps =
            LIBRARY_1
            LIBRARY_2
            LIBRARY_N

       The each line with LIBRARY_1... LIBRARY_N will be passed automatically to cmd_lib_install command. Please
       follow to cmd_lib_install for detailed documentation about possible values.

       Example:

          [env:myenv]
          lib_deps =
            13
            PubSubClient
            ArduinoJson@~5.6,!=5.4
            https://github.com/gioblu/PJON.git#v2.0
            me-no-dev/ESPAsyncTCP
            IRremoteESP8266=https://github.com/markszabo/IRremoteESP8266/archive/master.zip

   lib_ignore
       SEE ALSO:
          Please make sure to read ldf guide first.

       Type: String | Multiple: Yes

       Specify libraries which should be ignored by Library Dependency Finder.

       The  correct  value  for  this  option  is a library name (not folder name).  You will see these names in
       "Library Dependency Graph" when building a project between < and > symbols.

       Example:

       Build output

          ...
          Library Dependency Finder -> http://bit.ly/configure-pio-ldf
          LDF MODES: FINDER(chain+) COMPATIBILITY(soft)
          Collected 54 compatible libraries
          Scanning dependencies...
          Dependency Graph
          |-- <Hash> v1.0
          |-- <AsyncMqttClient> v0.8.2
          |   |-- <ESPAsyncTCP> v1.1.3
          |-- <ESP8266WiFi> v1.0
          |-- <ESP Async WebServer> v1.1.1
          |   |-- <ESPAsyncTCP> v1.1.3
          |   |-- <ESP8266WiFi> v1.0
          |   |-- <Hash> v1.0
          |   |-- <ArduinoJson> v5.13.1
          |-- <ArduinoJson> v5.13.1
          |-- <DNSServer> v1.1.0
          |   |-- <ESP8266WiFi> v1.0
          |-- <Ticker> v1.0
          ....

       platformio.ini

          [env:myenv]
          ; Single line
          lib_ignore = AsyncMqttClient, DNSServer

          ; Multi-line
          lib_ignore =
            AsyncMqttClient
            ESP Async WebServer

   lib_extra_dirs
       SEE ALSO:
          Please make sure to read ldf guide first.

       Type: DirPath | Multiple: Yes

       A list with extra directories/storages where ldf will look for dependencies.

       This option can also be set by global environment variable PLATFORMIO_LIB_EXTRA_DIRS.

       WARNING:
          This is a not direct path to a library with source code. It should be a path to storage that  contains
          libraries    grouped    by    folders.    For    example,    D:\PlatformIO\extra\libraries   but   not
          D:\PlatformIO\extra\libraries\FooLibrary.

       Example:

          [env:myenv]
          lib_extra_dirs =
              /common/libraries
              /iot/libraries

   lib_ldf_mode
       SEE ALSO:
          Please make sure to read ldf guide first.

       Type: String | Multiple: No | Default: chain

       This  option  specifies  how  does  Library  Dependency  Finder  should  analyze  dependencies  (#include
       directives). See ldf_mode for details and available options.

       Example:

          [env:myenv]
          ; evaluate C/C++ Preprocessor conditional syntax
          lib_ldf_mode = chain+

   lib_compat_mode
       SEE ALSO:
          Please make sure to read ldf guide first.

       Type: String | Multiple: No | Default: soft

       Library  compatibility  mode  allows  one  to  control  strictness  of  Library  Dependency  Finder.  See
       ldf_compat_mode for details and available options..

       By default, this value is set to lib_compat_mode = soft and means that LDF will check only for  framework
       compatibility.

       Example:

          [env:myenv]
          ; Checks for the compatibility with frameworks and dev/platforms
          lib_compat_mode = strict

   lib_archive
       Type: Bool (yes or no) | Multiple: No | Default: yes

       Create an archive (*.a, static library) from the object files and link it into a firmware (program). This
       is default behavior of PlatformIO Build System (lib_archive = yes).

       Setting lib_archive = no will instruct PIO Build System to link object  files  directly  (in-line).  This
       could be useful if you need to override weak symbols defined in framework or other libraries.

       You  can  disable  library  archiving  per a custom library using libjson_archive field in library_config
       manifest.

       Example:

          [env:myenv]
          lib_archive = no

   Upload optionsupload_portupload_protocolupload_speedupload_flagsupload_resetmethodupload_command

   upload_port
       Type: String (Pattern) | Multiple: No

       This option is used by "uploader" tool when sending firmware to board via upload_port. For example,

       • /dev/ttyUSB0 - Serial port (Unix-based OS)

       • COM3 - Serial port (Windows OS)

       • 192.168.0.13 - IP address when using OTA

       • /media/disk - physical path to media disk/flash drive (framework_mbed enabled boards)

       • D: - physical path to media disk/flash drive (Windows OS).

       If upload_port isn't specified, then PlatformIO will try to detect it automatically.

       To print all available serial ports please use cmd_device_list command.

       This option can also be set by global environment variable PLATFORMIO_UPLOAD_PORT.

       Please note that you can use Unix shell-style wildcards:

                                     ┌────────┬──────────────────────────────────┐
                                     │Pattern │ Meaning                          │
                                     ├────────┼──────────────────────────────────┤
                                     │*       │ matches everything               │
                                     ├────────┼──────────────────────────────────┤
                                     │?       │ matches any single character     │
                                     ├────────┼──────────────────────────────────┤
                                     │[seq]   │ matches any character in seq     │
                                     ├────────┼──────────────────────────────────┤
                                     │[!seq]  │ matches any character not in seq │
                                     └────────┴──────────────────────────────────┘

       Example

          [env:uno]
          platform = atmelavr
          framework = arduino
          ; any port that starts with /dev/ttyUSB
          upload_port = /dev/ttyUSB*

          ; COM1 or COM3
          upload_port = COM[13]

   upload_protocol
       Type: String | Multiple: No

       A protocol that "uploader" tool uses to talk to a board. Please  check  boards  for  supported  uploading
       protocols by your board.

   upload_speed
       Type: Integer | Multiple: No

       A connection speed (baud rate) which "uploader" tool uses when sending firmware to board.

   upload_flags
       Type: String | Multiple: Yes

       Extra  flags for uploader. Will be added to the end of uploader command. If you need to override uploader
       command or base flags please use projectconf_extra_scripts.

       This option can also be set by global environment variable PLATFORMIO_UPLOAD_FLAGS.

       Example

       Please specify each flag/option in a new line starting with minimum 2 spaces.

          [env:atmega328pb]
          platform = atmelavr
          board = atmega328pb
          framework = arduino
          upload_flags =
            -P$UPLOAD_PORT
            -b$UPLOAD_SPEED
            -u
            -Ulock:w:0xCF:m
            -Uhfuse:w:0xD7:m
            -Uefuse:w:0xF6:m
            -Ulfuse:w:0xE2:m

   upload_resetmethod
       Type: String | Multiple: No

       Specify reset method for "uploader" tool. This option isn't available for all development platforms.  The
       only platform_espressif8266 supports it.

   upload_command
       New in version 4.0.

       Type: String | Multiple: No

       Override  default  platforms  upload  command  with  a  custom.  You  can pass a full upload command with
       arguments and options or mix with upload_flags.

       Default upload commands are declared in build/main.py script file of platforms.  See  a  list  with  open
       source platforms => https://github.com/topics/platformio-platform

       NOTE:
          Please note that you can use build variables in upload_command, such as PlatformIO project folders and
          other runtime configuration. A list with build variables  are  available  by  running  platformio  run
          --target envdump command.

       Examples

       1. Override default upload command but handle pre-uploading actions (looking for serial port, extra image
          preparation, etc.). Normally, the pre-configured upload options will be stored in $UPLOADERFLAGS build
          variable.   A   classic   default  upload  command  for  platforms  may  look  as  some-flash-bin-tool
          $UPLOADERFLAGS $SOURCE, where $SOURCE will be replaced by a real program/firmware binary.

          $PROJECT_PACKAGES_DIR build variable points to projectconf_pio_packages_dir.

             [env:program_via_AVR_ISP]
             platform = atmelavr
             framework = arduino
             board = uno
             upload_flags =
                 -C
                 $PROJECT_PACKAGES_DIR/tool-avrdude/avrdude.conf
                 -p
                 atmega328p
                 -P
                 $UPLOAD_PORT
                 -b
                 115200
                 -c
                 stk500v1
             upload_command = avrdude $UPLOAD_FLAGS -U flash:w:$SOURCE:i

       2. Override default upload command and skip pre-uploading actions.

             [env:program_via_usbasp]
             platform = atmelavr
             framework = arduino
             board = uno
             upload_flags =
                 -C
                 $PROJECT_PACKAGES_DIR/tool-avrdude/avrdude.conf
                 -p
                 atmega328p
                 -Pusb
                 -c
                 stk500v1
             upload_command = avrdude $UPLOAD_FLAGS -U flash:w:$SOURCE:i

             ; Use ST-util for flashing
             ; https://github.com/texane/stlink

             [env:custom_st_flash]
             platform = ststm32
             framework = stm32cube
             board = bluepill_f103c6
             upload_command = $PROJECT_PACKAGES_DIR/tool-stlink/st-flash write $SOURCE 0x8000000

   Monitor optionsmonitor_portmonitor_speedmonitor_filtersmonitor_rtsmonitor_dtrmonitor_flags

       Custom options for cmd_device_monitor command.

   monitor_port
       Type: String | Multiple: No

       Port, a number or a device name, or valid URL Handlers.  See platformio device monitor --port.  To  print
       all available serial ports please use cmd_device_list command.

       Please note that you can use Unix shell-style wildcards:

                                     ┌────────┬──────────────────────────────────┐
                                     │Pattern │ Meaning                          │
                                     ├────────┼──────────────────────────────────┤
                                     │*       │ matches everything               │
                                     ├────────┼──────────────────────────────────┤
                                     │?       │ matches any single character     │
                                     ├────────┼──────────────────────────────────┤
                                     │[seq]   │ matches any character in seq     │
                                     ├────────┼──────────────────────────────────┤
                                     │[!seq]  │ matches any character not in seq │
                                     └────────┴──────────────────────────────────┘

       Example:

          [env:custom_monitor_port]
          ...
          ; Unix
          monitor_port = /dev/ttyUSB1

          ; Windows, COM1 or COM3
          monitor_port = COM[13]

          ; Socket
          monitor_port = socket://localhost:4444

   monitor_speed
       Type: Integer | Multiple: No | Default: 9600

       A monitor speed (baud rate).  See platformio device monitor --baud.

       Example:

          [env:custom_monitor_speedrate]
          ...
          monitor_speed = 115200

   monitor_filters
       New in version 4.3.

       Type: String | Multiple: Yes

       Apply    filters    and   text   transformation   for   device   output.   See   available   filters   at
       cmd_device_monitor_filters.

       Example:

          [env:log_output_to_file_with_timestamp]
          ...
          platform = ...
          monitor_filters = log2file, time, default

   monitor_rts
       Type: Integer (0 or 1) | Multiple: No

       A monitor initial RTS line state. See platformio device monitor --rts.

   monitor_dtr
       Type: Integer (0 or 1) | Multiple: No

       A monitor initial DTR line state. See platformio device monitor --dtr.

   monitor_flags
       New in version 4.0.

       Type: String | Multiple: Yes

       Pass extra flags and options to cmd_device_monitor command. Please note that each  flag,  option  or  its
       value should be passed in a new line. See example below.

       Available flags and options are the same which are documented for cmd_device_monitor command.

       Example:

          [env:extra_monitor_flags]
          platform = ...
          board = ...
          monitor_flags=
              --parity
              N
              --encoding
              hexlify

   Check options
       SEE ALSO:
          Please make sure to read piocheck guide first.

       • check_toolcheck_patternscheck_flagscheck_severity

   check_tool
       Type: String | Multiple: Yes | Default: cppcheck

       A name of the check tool used for analysis. This option is useful when you want to check source code with
       two or more tools.

       See available tools in check_tools.

       Example

          [env:myenv]
          platform = ...
          board = ...
          check_tool = cppcheck, clangtidy

   check_patterns
       Type: String (Pattern) | Multiple: Yes

       This option allows specifying which source files or folders should be included/excluded  from  the  check
       process.  GLOB Patterns are allowed.  projectconf_pio_src_dir and projectconf_pio_include_dir folders are
       checked by default.

       Another option for filtering source files is platformio check --pattern command.

       Example

          [env:custom_check_patterns]
          platform = ...
          board = ...
          check_tool = clangtidy
          check_patterns =
            app/sources
            tests/hardware/*.c

   check_flags
       Type: String | Multiple: Yes

       Additional flags to be passed to the tool command line. This option is useful when you want to adjust the
       check  process to fit your project requirements.  By default, the flags are passed to all tools specified
       in check_tool section. To set individual flags, define tool name at the beginning of the line.

       Another option for adding flags is platformio check --flags command.

       Example

          [env:extra_check_flags]
          platform = ...
          board = ...
          check_tool = cppcheck, clangtidy
          check_flags =
            --common-flag
            cppcheck: --enable=performance --inline-suppr
            clangtidy: -fix-errors -format-style=mozilla

   check_severity
       Type: String | Multiple: Yes | Default: low, medium, high

       This option allows specifying the check_severity types which will be reported by the check_tools.

       Another option for filtering source files is platformio check --severity command.

       Example

          [env:detect_only_medium_or_high_defects]
          platform = ...
          board = ...
          check_severity = medium, high

   Test options
       SEE ALSO:
          Please make sure to read unit_testing guide first.

       • test_filtertest_ignoretest_porttest_speedtest_transporttest_build_project_src

   test_filter
       Type: String (Pattern) | Multiple: Yes

       Process only the unit_testing tests where the name matches specified patterns.

       Also, you can filter some tests using platformio test --filter command.

                                     ┌────────┬──────────────────────────────────┐
                                     │Pattern │ Meaning                          │
                                     ├────────┼──────────────────────────────────┤
                                     │*       │ matches everything               │
                                     ├────────┼──────────────────────────────────┤
                                     │?       │ matches any single character     │
                                     ├────────┼──────────────────────────────────┤
                                     │[seq]   │ matches any character in seq     │
                                     ├────────┼──────────────────────────────────┤
                                     │[!seq]  │ matches any character not in seq │
                                     └────────┴──────────────────────────────────┘

       Example

          [env:myenv]
          test_filter = footest, bartest_*, test[13]

   test_ignore
       Type: String (Pattern) | Multiple: Yes

       Ignore unit_testing tests where the name matches specified patterns.

       Also, you can ignore some tests using platformio test --ignore command.

                                     ┌────────┬──────────────────────────────────┐
                                     │Pattern │ Meaning                          │
                                     ├────────┼──────────────────────────────────┤
                                     │*       │ matches everything               │
                                     ├────────┼──────────────────────────────────┤
                                     │?       │ matches any single character     │
                                     ├────────┼──────────────────────────────────┤
                                     │[seq]   │ matches any character in seq     │
                                     ├────────┼──────────────────────────────────┤
                                     │[!seq]  │ matches any character not in seq │
                                     └────────┴──────────────────────────────────┘

       Example

          [env:myenv]
          test_ignore =
            footest
            bartest_*
            test[13]

   test_port
       Type: String (Pattern) | Multiple: No

       This option specifies communication interface (Serial/UART) between PlatformIO  unit_testing  Engine  and
       target device. For example,

       • /dev/ttyUSB0 - Unix-based OS

       • COM3 - Windows OS

       If test_port isn't specified, then PlatformIO will try to detect it automatically.

       To print all available serial ports use cmd_device_list command.

   test_speed
       Type: Integer | Multiple: No | Default: 115200

       A connection speed (baud rate) to communicate with a target device.

   test_transport
       Type: String | Multiple: No

       A  transport  type  which  will  be  used to read test results from a target device.  See more details at
       unit_testing_transport.

   test_build_project_src
       Type: Bool (yes or no) | Multiple: No | Default: no

       Force  unit_testing  engine  to  build  project  source   code   from   projectconf_pio_src_dir   setting
       test_build_project_src to yes.  More detail about unit_testing_shared_code.

       Example

          [env:myenv]
          platform = ...
          test_build_project_src = yes

   Debugging options
       SEE ALSO:
          Please make sure to read piodebug guide first.

       • debug_tooldebug_build_flagsdebug_init_breakdebug_init_cmdsdebug_extra_cmdsdebug_load_cmdsdebug_load_modedebug_serverdebug_portdebug_svd_path

   debug_tool
       Type: String | Multiple: No

       A  name  of  debugging  tool.  This  option  is  useful  when board supports more than one debugging tool
       (adapter, probe) or you want to create debugging_tool_custom debugging configuration.

       See available tools in debugging_tools.

       Example

          [env:debug]
          platform = ...
          board = ...
          debug_tool = custom

   debug_build_flags
       New in version 4.2.0.

       Type: String | Multiple: Yes | Default: -Og -g2 -ggdb2

       These flags/options affect the preprocessing, compilation, assembly and linking processes for C  and  C++
       code.

       NOTE:
          This  option  might  be helpful to adjust the optimization level if firmware with debug information is
          too big to be uploaded to a target

       Example

          [env:debug]
          platform = ...
          board = ...

          ; Set optimization level and amount of debug information generated by the compiler
          debug_build_flags = -O0 -ggdb3 -g3

       Other possible flags that might be useful for debugging your application.

   debug_init_break
       Type: String | Multiple: No | Default: tbreak main

       An initial breakpoint that makes your program stop whenever a certain point in the  program  is  reached.
       Default  value  is set to tbreak main and means creating a temporary breakpoint at int main(...) function
       and automatically delete it after the first time a program stops there.

       • GDB Setting BreakpointsGDB Breakpoint Locations

       NOTE:
          Please note that each debugging tool (adapter, probe) has limited number of hardware breakpoints.

          If you need more Project Initial Breakpoints, please place them in debug_extra_cmds.

       Examples

          [env:debug]
          platform = ...
          board = ...

          ; Examples 1: disable initial breakpoint
          debug_init_break =

          ; Examples 2: temporary stop at ``void loop()`` function
          debug_init_break = tbreak loop

          ; Examples 3: stop in main.cpp at line 13
          debug_init_break = break main.cpp:13

          ; Examples 4: temporary stop at ``void Reset_Handler(void)``
          debug_init_break = tbreak Reset_Handler

   debug_init_cmds
       Type: String | Multiple: Yes | Default: See details...

       Initial commands that will be passed to back-end debugger.

       PlatformIO dynamically configures back-end debugger depending on a debug environment. Here is a list with
       default initial commands for the popular debugging_tools.

       For example, the custom initial commands for GDB:

          [env:debug]
          platform = ...
          board = ...
          debug_init_cmds =
            target extended-remote $DEBUG_PORT
            $INIT_BREAK
            monitor reset halt
            $LOAD_CMDS
            monitor init
            monitor reset halt

   debug_extra_cmds
       Type: String | Multiple: Yes

       Extra  commands  that will be passed to back-end debugger after debug_init_cmds.  For example, add custom
       breakpoint and load .gdbinit from a project directory for GDB:

          [env:debug]
          platform = ...
          board = ...
          debug_extra_cmds =
            break main.cpp:13
            break foo.cpp:100
            source .gdbinit

       NOTE:
          Initial Project Breakpoints: Use break path/to/file:LINE_NUMBER  to  define  initial  breakpoints  for
          debug environment. Multiple breakpoints are allowed.

          To  save  session  breakpoints,  please  use save breakpoints [filename] command in Debug Console. For
          example, save breakpoints .gdbinit. Later, this file could be loaded via  source  [filename]  command.
          See above.

   debug_load_cmds
       New in version 4.0.

       Type: String | Multiple: Yes | Default: load

       Specify a command which will be used to load program/firmware to a target device. Possible options:

       • load - default option

       • load [address] - load program at specified address, where "[address]" should be a valid number

       • preload  - some embedded devices have locked Flash Memory (a few Freescale Kinetis and NXP LPC boards).
         In this case, firmware loading using debugging client is disabled. preload command instructs piocore to
         load program/firmware using development platform "upload" method (via bootloader, media disk, etc)

       • (empty value, debug_load_cmds =), disables program loading at all.

       • custom commands - pass any debugging client command (GDB, etc.)

       Sometimes  you need to run extra monitor commands (on debug server side) before program/firmware loading,
       such as flash unlocking or erasing. In this case we can combine service commands  with  loading  and  run
       them before. See example:

          [env:debug]
          platform = ...
          board = ...
          debug_load_cmds =
            monitor flash erase_sector 0 0 11
            load

   debug_load_mode
       Type: String | Multiple: No | Default: always

       Allows one to control when PlatformIO should load debugging firmware to the end target. Possible options:

       • always - load for the each debugging session, defaultmodified - load only when firmware was modified

       • manual  -  do  not  load firmware automatically. You are responsible to pre-flash target with debugging
         firmware in this case.

   debug_server
       Type: String | Multiple: Yes

       Allows one to setup a custom debugging server. By default, boards are  pre-configured  with  a  debugging
       server  that  is  compatible with "on-board" debugging tool (adapter, probe). Also, this option is useful
       for a debugging_tool_custom debugging tool.

       Option format (multi-line):

       • First line is an executable path of debugging server

       • 2-nd and the next lines are arguments for executable file

       Example:

          [env:debug]
          platform = ...
          board = ...
          debug_server =
            /path/to/debugging/server
            arg1
            arg2
            ...
            argN

   debug_port
       Type: String | Multiple: No

       A debugging port of a remote target. Could be a serial device or network address.  PlatformIO detects  it
       automatically if is not specified.

       For example:

       • /dev/ttyUSB0 - Unix-based OS

       • COM3 - Windows OS

       • localhost:3333

   debug_svd_path
       Type: FilePath | Multiple: No

       A custom path to SVD file which contains information about device peripherals.

   Advanced options
   extends
       New in version 4.1.

       Type: String | Multiple: Yes

       This option allows one to inherit configuration from other sections or build environments in projectconf.
       Multiple items are allowed, split them with , or with a new line.

       If  you  need  to  extend  only  a  few  options   from   some   section,   please   take   a   look   at
       projectconf_dynamic_vars.

       Example:

          [strict_ldf]
          lib_ldf_mode = chain+
          lib_compat_mode = strict

          [espressi32_base]
          platform = espressif32
          framework = arduino

          [env:release]
          extends = espressi32_base, strict_ldf
          board = esp32dev
          build_flags = -D RELEASE

          [env:debug]
          extends = env:release
          build_type = debug
          build_flags = -D DEBUG

   extra_scripts
       Type: FilePath | Multiple: Yes

       A list of PRE and POST extra scripts.

       See details and examples in projectconf_advanced_scripting section.

       If you plan to share these scripts with pioremote machine, please put them to projectconf_pio_shared_dir.

   Build Configurations
       New in version 4.0.0.

       There are 2 types (projectconf_build_type) of build configuration in PlatformIO:

       release
              Default  configuration.  A  "release"  configuration  of  your  firmware/program  does not contain
              symbolic debug information and  is  optimized  for  the  firmware  size  or  speed  (depending  on
              platforms)

       debug  A  "debug" configuration of your firmware/program is compiled with full symbolic debug information
              and no optimization. Optimization complicates debugging, because the relationship  between  source
              code and generated instructions is more complex.

       NOTE:
          If  you  need  to  control  build  flags  that  are  specific  for debug configuration please refer to
          projectconf_debug_build_flags.

       If you need to build a project in debug configuration, please use one of these options:

       • Add projectconf_build_type with debug value to projectconf

       • Use target debug for the platformio run --target command.

       NOTE:
          piodebug automatically switches to debug configuration when you do project debugging  from  pioide  or
          use the cmd_debug command.

          To  avoid having piodebug rebuild the project, please create a separate build environment that defines
          build_type = debug.  See  the  example  below  where  the  mydebug  build  environment  will  be  used
          automatically by piodebug:

              [env]
              platform = ...
              board = ...
              framework = ...
              ... other common configuration

              [env:myrelease]
              some_extra_options = ...

              [env:mydebug]
              build_type = debug
              some_extra_options = ...

       Please   note   that   you   can   set   a   default   build   environment   per   a  project  using  the
       projectconf_pio_default_envs option in projectconf_section_platformio.

   Dynamic variables
       Dynamic variables (interpolations) are useful when you have a custom  configuration  data  between  build
       environments. For examples, extra projectconf_build_flags or project dependencies projectconf_lib_deps.

       Each  variable  should  have  a  next  format:  ${<section>.<option>},  where  <section>  is a value from
       [<section>] group, and <option> is a first item from pair <option> = value.

       You can inject system environment variable using sysenv as a section.  For example, ${sysenv.HOME}.

       • Variable can be applied only for the option's value

       • Multiple variables are allowed

       • The projectconf_section_platformio and projectconf_section_env sections are reserved and could  not  be
         used as a custom section. Some good section names might be extra or custom.

       NOTE:
          If  you  need  to share common configuration options between build environments, please take a look at
          "Global scope" in projectconf_section_env or projectconf_env_extends option which allows extending  of
          other sections.

       Example:

          [env]
          ; Unix
          lib_extra_dirs = ${sysenv.HOME}/Documents/Arduino/libraries
          ; Windows
          lib_extra_dirs = ${sysenv.HOMEDRIVE}${sysenv.HOMEPATH}\Documents\Arduino\libraries

          ; You MUST inject these options into [env:] section
          ; using ${extra.***} (see below)
          [extra]
          build_flags = -D VERSION=1.2.3 -D DEBUG=1
          lib_deps_builtin =
            SPI
            Wire
          lib_deps_external = ArduinoJson@>5.6.0

          [env:uno]
          platform = atmelavr
          framework = arduino
          board = uno
          build_flags = ${extra.build_flags}
          lib_deps =
            ${extra.lib_deps_builtin}
            ${extra.lib_deps_external}

          [env:nodemcuv2]
          platform = espressif8266
          framework = arduino
          board = nodemcuv2
          build_flags = ${extra.build_flags} -Wall
          lib_deps =
            ${extra.lib_deps_builtin}
            ${extra.lib_deps_external}
            PubSubClient@2.6
            OneWire

          ; Keep sensitive data in environment variables
          ;
          ; Unix
          ; export WIFI_SSID='\"my\ ssid\ name\"'
          ; export WIFI_PASS='\"my\ password\"'
          ;
          ; Windows
          ; set WIFI_SSID='"my ssid name"'
          ; set WIFI_PASS='"my password"'

          [env:esp32dev]
          extends = env:nodemcuv2
          platform = espressif32
          board = esp32dev
          build_flags =
            -DWIFI_SSID=${sysenv.WIFI_SSID}
            -DWIFI_PASS=${sysenv.WIFI_PASS}

       WARNING:
          Be  careful  with  special characters in system environment variables on Unix systems, especially when
          they are used as the value for preprocessor directives.  Symbols like $, &, ~, etc must be  explicitly
          escaped, for example:

              export WIFI_PASS='\"my\~p\&a\\\$\$\$\$word\"'

   Examples
       NOTE:
          A full list with project examples can be found in PlatformIO Repository.

       Community project examples with platformio.ini:

       • MarlinFirmware/Marlinxoseperez/espurnaesphome/esphomecyberman54/ESP32-Paxcounter

       Example

       For more examples, see projectconf_examples.

          [platformio]
          default_envs = nodemcuv2

          ; You MUST inject these options into [env:] section
          ; using ${common_env_data.***} (see below)
          [common_env_data]
          build_flags =
              -D VERSION=1.2.3
              -D DEBUG=1
          lib_deps_builtin =
              SPI
              Wire
          lib_deps_external =
              ArduinoJson@~5.6,!=5.4
              https://github.com/gioblu/PJON.git#v2.0
              IRremoteESP8266=https://github.com/markszabo/IRremoteESP8266/archive/master.zip

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

          ; Build options
          build_flags =
              ${common_env_data.build_flags}
              -DSSID_NAME=HELLO
              -DSSID_PASWORD=WORLD

          ; Library options
          lib_deps =
              ${common_env_data.lib_deps_builtin}
              ${common_env_data.lib_deps_external}
              https://github.com/me-no-dev/ESPAsyncTCP.git
              PubSubClient@2.6
              OneWire

          ; Serial Monitor options
          monitor_speed = 115200
          monitor_flags =
              --encoding
              hexlify

          ; Unit Testing options
          test_ignore = test_desktop

          [env:bluepill_f103c8]
          platform = ststm32
          framework = arduino
          board = bluepill_f103c8

          ; Build options
          build_flags = ${common_env_data.build_flags}

          ; Library options
          lib_deps =
              ${common_env_data.lib_deps_external}

          ; Debug options
          debug_tool = custom
          debug_server =
              JLinkGDBServer
              -singlerun
              -if
              SWD
              -select
              USB
              -port
              2331
              -device
              STM32F103C8

          ; Unit Testing options
          test_ignore = test_desktop

   Environment variables
       Environment  variables  are  a set of dynamic named values that can affect the way running processes will
       behave on a computer. PlatformIO handles variables which start with PLATFORMIO_ prefix.

       How to set environment variable?

          # Windows
          set VARIABLE_NAME=VALUE

          # Windows GUI -> https://www.youtube.com/watch?v=bEroNNzqlF4

          # Unix (bash, zsh)
          export VARIABLE_NAME=VALUE

          # Unix (fish)
          set -x VARIABLE_NAME VALUE

   ContentsGeneralDirectoriesBuildingUploadingSettings

   General
       PlatformIO uses General environment variables for the common operations/commands.

       CI

       PlatformIO handles CI variable which is  setup  by  Continuous  Integration  (Travis,  Circle  and  etc.)
       systems.   PlatformIO uses it to disable prompts and progress bars. In other words, CI=true automatically
       setup PLATFORMIO_DISABLE_PROGRESSBAR to true.

       PLATFORMIO_AUTH_TOKEN

       Allows one to specify Personal Authentication Token  that  could  be  used  for  automatic  login  in  to
       pioaccount.  It  is  very  useful for ci systems and pioremote operations where you are not able manually
       authorize.

       You can get own Personal Authentication Token using cmd_account_token command.

       PLATFORMIO_FORCE_ANSI

       Force to output ANSI control character even if the output is a pipe (not a tty).  The possible values are
       true and false. Default is PLATFORMIO_FORCE_ANSI=false.

       PLATFORMIO_NO_ANSI

       Do   not   print  ANSI  control  characters.   The  possible  values  are  true  and  false.  Default  is
       PLATFORMIO_NO_ANSI=false.

       You can also use platformio --no-ansi flag for piocore.

       PLATFORMIO_DISABLE_PROGRESSBAR

       Disable progress bar for package/library downloader and uploader. This is useful when calling  PlatformIO
       from  subprocess  and  output  is a pipe (not a tty).  The possible values are true and false. Default is
       PLATFORMIO_DISABLE_PROGRESSBAR=false.

   Directories
       PLATFORMIO_CORE_DIR

       Allows one to override projectconf option projectconf_pio_core_dir.

       PLATFORMIO_GLOBALLIB_DIR

       Allows one to override projectconf option projectconf_pio_globallib_dir.

       PLATFORMIO_PLATFORMS_DIR

       Allows one to override projectconf option projectconf_pio_platforms_dir.

       PLATFORMIO_PACKAGES_DIR

       Allows one to override projectconf option projectconf_pio_packages_dir.

       PLATFORMIO_CACHE_DIR

       Allows one to override projectconf option projectconf_pio_cache_dir.

       PLATFORMIO_BUILD_CACHE_DIR

       Allows one to override projectconf option projectconf_pio_build_cache_dir.

       PLATFORMIO_WORKSPACE_DIR

       Allows one to override projectconf option projectconf_pio_workspace_dir.

       PLATFORMIO_INCLUDE_DIR

       Allows one to override projectconf option projectconf_pio_include_dir.

       PLATFORMIO_SRC_DIR

       Allows one to override projectconf option projectconf_pio_src_dir.

       PLATFORMIO_LIB_DIR

       Allows one to override projectconf option projectconf_pio_lib_dir.

       PLATFORMIO_LIBDEPS_DIR

       Allows one to override projectconf option projectconf_pio_libdeps_dir.

       PLATFORMIO_BUILD_DIR

       Allows one to override projectconf option projectconf_pio_build_dir.

       PLATFORMIO_DATA_DIR

       Allows one to override projectconf option projectconf_pio_data_dir.

       PLATFORMIO_TEST_DIR

       Allows one to override projectconf option projectconf_pio_test_dir.

       PLATFORMIO_BOARDS_DIR

       Allows one to override projectconf option projectconf_pio_boards_dir.

       PLATFORMIO_SHARED_DIR

       Allows one to override projectconf option projectconf_pio_shared_dir.

       PLATFORMIO_REMOTE_AGENT_DIR

       Allows one to override platformio remote agent start --working-dir.

       PLATFORMIO_LIB_EXTRA_DIRS

       Allows one to set projectconf option projectconf_lib_extra_dirs.

   Building
       PLATFORMIO_BUILD_FLAGS

       Allows one to set projectconf option projectconf_build_flags.

       Examples:

          # Unix:
          export PLATFORMIO_BUILD_FLAGS=-DFOO
          export PLATFORMIO_BUILD_FLAGS=-DFOO -DBAR=1 -Wall

          # Windows:
          SET PLATFORMIO_BUILD_FLAGS=-DFOO
          SET PLATFORMIO_BUILD_FLAGS=-DFOO -DBAR=1 -Wall

       WARNING:
          Consider using projectconf_dynamic_vars instead  of  PLATFORMIO_BUILD_FLAGS  environment  variable  if
          additional  build  flags  contain preprocessor directive with special characters ($, &, ~, etc) in its
          value.

       PLATFORMIO_SRC_BUILD_FLAGS

       Allows one to set projectconf option projectconf_src_build_flags.

       PLATFORMIO_SRC_FILTER

       Allows one to set projectconf option projectconf_src_filter.

       PLATFORMIO_EXTRA_SCRIPTS

       Allows one to set projectconf option projectconf_extra_scripts.

       PLATFORMIO_DEFAULT_ENVS

       Allows one to set projectconf option projectconf_pio_default_envs.

   Uploading
       PLATFORMIO_UPLOAD_PORT

       Allows one to set projectconf option projectconf_upload_port.

       PLATFORMIO_UPLOAD_FLAGS

       Allows one to set projectconf option projectconf_upload_flags.

   Settings
       Allows one to override PlatformIO settings. You can manage them via cmd_settings command.

       PLATFORMIO_SETTING_AUTO_UPDATE_LIBRARIES

       Allows one to override setting setting_auto_update_libraries.

       PLATFORMIO_SETTING_AUTO_UPDATE_PLATFORMS

       Allows one to override setting setting_auto_update_platforms.

       PLATFORMIO_SETTING_CHECK_LIBRARIES_INTERVAL

       Allows one to override setting setting_check_libraries_interval.

       PLATFORMIO_SETTING_CHECK_PLATFORMIO_INTERVAL

       Allows one to override setting setting_check_platformio_interval.

       PLATFORMIO_SETTING_CHECK_PLATFORMS_INTERVAL

       Allows one to override setting setting_check_platforms_interval.

       PLATFORMIO_SETTING_ENABLE_CACHE

       Allows one to override setting setting_enable_cache.

       PLATFORMIO_SETTING_STRICT_SSL

       Allows one to override setting setting_strict_ssl.

       PLATFORMIO_SETTING_ENABLE_TELEMETRY

       Allows one to override setting setting_enable_telemetry.

       PLATFORMIO_SETTING_FORCE_VERBOSE

       Allows one to override setting setting_force_verbose.

       PLATFORMIO_SETTING_PROJECTS_DIR

       Allows one to override setting setting_projects_dir.

   Advanced Scripting
       WARNING:
          Advanced Scripting is recommended for Advanced Users and requires knowledge of the Python language.

       WARNING:
          projectconf_dynamic_build_flags is a highly recommended alternative to advanced scripting,  where  you
          can  use  any  programming  language.  Also, that option is useful if you need to apply changes to the
          project before the building/uploading process, such as:

          • Macro with the latest VCS revision/tag "on-the-fly"

          • Generate dynamic headers (*.h)

          • Process media content before generating SPIFFS image

          • Make some changes to source code or related libraries

   ContentsAdvanced ScriptingLaunch typesConstruction EnvironmentsBefore/Pre and After/Post actionsBuild MiddlewaresCustom targetCommand shortcutDependent targetTarget with optionsExamplesCustom options in platformio.iniSplit C/C++ build flagsExtra Linker Flags without -Wl, prefixCustom upload toolUpload to Cloud (OTA)Custom firmware/program nameOverride package filesOverride Board ConfigurationCustom debug flags

       The PlatformIO Build System allows the user to extend the build process with  custom  scripts  using  the
       Python  interpreter and the SCons construction tool.  Build flags, upload flags, targets, toolchains data
       and other information are available for modification as SCons Construction Environments.  Custom  scripts
       are included with projectconf_extra_scripts

       WARNING:
          You  can  not  run  or  debug  these  scripts  manually with a Python interpreter. They will be loaded
          automatically when the cmd_run command processes the project environment.

   Launch types
       There are two execution orders for extra scripts:

       1. PRE - executes before the main script of platforms

       2. POST - executes after the main script of platforms

       Multiple extra scripts are allowed. Please split them via  ", " (comma + space) in the same line  or  use
       multi-line values.

       For example, in projectconf:

          [env:my_env_1]
          platform = ...
          ; Defaults to POST script since no prefix is used
          extra_scripts = post_extra_script.py

          [env:my_env_2]
          platform = ...
          extra_scripts =
            pre:pre_extra_script.py
            post:post_extra_script1.py
            post_extra_script2.py

       This option can also be set by the global environment variable PLATFORMIO_EXTRA_SCRIPTS.

   Construction Environments
       The PlatformIO Build System uses two built-in construction environments to process each project:

       • env,  Import("env")  -  the global construction environment used for the platforms and frameworks build
         scripts, upload tools, ldf, and other internal operations

       • projenv, Import("projenv") - the isolated construction environment  used  for  processing  the  project
         source  code in projectconf_pio_src_dir.  Please note that any projectconf_src_build_flags specified in
         projectconf will be passed to projenv and not to env.

       WARNING:

          1. projenv is available only for POST-type scripts

          2. Flags passed to env using PRE-type script will affect projenv too.

       my_pre_extra_script.py:

          Import("env")

          # access to global construction environment
          print(env)

          # Dump construction environment (for debug purpose)
          print(env.Dump())

          # append extra flags to global build environment
          # which later will be used to build:
          # - project source code
          # - frameworks
          # - dependent libraries
          env.Append(CPPDEFINES=[
            "MACRO_1_NAME",
            ("MACRO_2_NAME", "MACRO_2_VALUE")
          ])

       my_post_extra_script.py:

          Import("env", "projenv")

          # access to global construction environment
          print(env)

          # access to project construction environment
          print(projenv)

          # Dump construction environments (for debug purpose)
          print(env.Dump())
          print(projenv.Dump())

          # append extra flags to global build environment
          # which later will be used to build:
          # - frameworks
          # - dependent libraries
          env.Append(CPPDEFINES=[
            "MACRO_1_NAME",
            ("MACRO_2_NAME", "MACRO_2_VALUE")
          ])

          # append extra flags to only project build environment
          projenv.Append(CPPDEFINES=[
            "PROJECT_EXTRA_MACRO_1_NAME",
            ("ROJECT_EXTRA_MACRO_2_NAME", "ROJECT_EXTRA_MACRO_2_VALUE")
          ])

       See examples below how to import construction environments and modify existing data or add new.

   Before/Pre and After/Post actions
       The PlatformIO Build System has a rich API that allows one to attach different pre-/post actions  (hooks)
       using   env.AddPreAction(target,  callback)  or  env.AddPreAction(target,  [callback1,  callback2,  ...])
       function. The first argument target can be the name of a target that is passed using the  platformio  run
       --target  command,  the  name  of a built-in target (buildprog, size, upload, program, buildfs, uploadfs,
       uploadfsota) or the path to a file which PlatformIO processes (ELF, HEX, BIN, OBJ, etc.).

       Examples

       The extra_script.py file is located in the same directory as platformio.ini.

       platformio.ini:

          [env:pre_and_post_hooks]
          extra_scripts = post:extra_script.py

       extra_script.py:

          Import("env", "projenv")

          # access to global build environment
          print(env)

          # access to project build environment (is used source files in "src" folder)
          print(projenv)

          #
          # Dump build environment (for debug purpose)
          # print(env.Dump())
          #

          #
          # Change build flags in runtime
          #
          env.ProcessUnFlags("-DVECT_TAB_ADDR")
          env.Append(CPPDEFINES=("VECT_TAB_ADDR", 0x123456789))

          #
          # Upload actions
          #

          def before_upload(source, target, env):
              print("before_upload")
              # do some actions

              # call Node.JS or other script
              env.Execute("node --version")

          def after_upload(source, target, env):
              print("after_upload")
              # do some actions

          print("Current build targets", map(str, BUILD_TARGETS))

          env.AddPreAction("upload", before_upload)
          env.AddPostAction("upload", after_upload)

          #
          # Custom actions when building program/firmware
          #

          env.AddPreAction("buildprog", callback...)
          env.AddPostAction("buildprog", callback...)

          #
          # Custom actions for specific files/objects
          #

          env.AddPreAction("$BUILD_DIR/${PROGNAME}.elf", [callback1, callback2,...])
          env.AddPostAction("$BUILD_DIR/${PROGNAME}.hex", callback...)

          # custom action before building SPIFFS image. For example, compress HTML, etc.
          env.AddPreAction("$BUILD_DIR/spiffs.bin", callback...)

          # custom action for project's main.cpp
          env.AddPostAction("$BUILD_DIR/src/main.cpp.o", callback...)

          # Custom HEX from ELF
          env.AddPostAction(
              "$BUILD_DIR/${PROGNAME}.elf",
              env.VerboseAction(" ".join([
                  "$OBJCOPY", "-O", "ihex", "-R", ".eeprom",
                  "$BUILD_DIR/${PROGNAME}.elf", "$BUILD_DIR/${PROGNAME}.hex"
              ]), "Building $BUILD_DIR/${PROGNAME}.hex")
          )

   Build Middlewares
       New in version 4.1.

       PlatformIO Build System allows you to add middleware functions that can be used  for  Build  Node(Object)
       construction.  This is very useful if you need to add custom flags for the specific file nodes or exclude
       them from a build process.

       There is env.AddBuildMiddleware(callback, pattern) helper which instructs PlatformIO Build System to call
       callback for each SCons File System Node whose path matches with Unix shell-style "pattern" (wildcards).

       If  a  pattern  is  omitted, the callback will be called for each File System Node which is added for the
       build process.

       You can add an unlimited number of build middlewares. They will  be  called  in  order  of  registration.
       Please  note,  if  the  first  middleware  ignores  some  File Nodes, they will not be passed to the next
       middleware in chain.

       Examples

       platformio.ini:

          [env:build_middleware]
          extra_scripts = pre:extra_script.py

       extra_script.py:

          Import("env")

          # --- Add custom macros for the ALL files which name contains "http"
          def extra_http_configuration(node):
              """
              `node.name` - a name of File System Node
              `node.get_path()` - a relative path
              `node.get_abspath()` - an absolute path
              """

              # do not modify node if file name does not contain "http"
              if "http" not in node.name:
                  return node

              # now, we can override ANY SCons variables (CPPDEFINES, CCFLAGS, etc.,) for the specific file
              # pass SCons variables as extra keyword arguments to `env.Object()` function
              # p.s: run `pio run -t envdump` to see a list with SCons variables

              return env.Object(
                  node,
                  CPPDEFINES=env["CPPDEFINES"]
                  + [("HTTP_HOST", "device.local"), ("HTTP_PORT", 8080)],
                  CCFLAGS=env["CCFLAGS"] + ["-fno-builtin-printf"]
              )

          env.AddBuildMiddleware(extra_http_configuration)

          # --- Replace some file from a build process with another

          def replace_node_with_another(node):
              return env.File("path/to/patched/RtosTimer.cpp")

          env.AddBuildMiddleware(
              replace_node_with_another,
              "framework-mbed/rtos/RtosTimer.cpp"
          )

          # --- Skip assembly *.S files from build process

          def skip_asm_from_build(node):
              # to ignore file from a build process, just return None
              return None

          env.AddBuildMiddleware(skip_asm_from_build, "*.S")

   Custom target
       There is a list with built-in targets which could be processed using platformio run --target option.  You
       can create unlimited number of the own targets and declare custom handlers for them.

       We will use SCons's Alias(alias, [targets, [action]]) , env.Alias(alias, [targets, [action]]) function to
       declare a custom target/alias.

   Command shortcut
       Create a custom node target (alias) which will print a NodeJS version

       platformio.ini:

          [env:myenv]
          platform = ...
          ...
          extra_scripts = extra_script.py

       extra_script.py:

          Import("env")
          env.AlwaysBuild(env.Alias("node", None, ["node --version"]))

       Now, run pio run -t node.

   Dependent target
       Sometimes you need to run a command which depends on another target (file, firmware, etc).  Let's  create
       an  ota target and declare command which will depend on a project firmware. If a build process successes,
       declared command will be run.

       platformio.ini:

          [env:myenv]
          platform = ...
          ...
          extra_scripts = extra_script.py

       extra_script.py:

          Import("env")
          env.AlwaysBuild(env.Alias("ota",
              "$BUILD_DIR/${PROGNAME}.elf",
              ["ota_script --firmware-path $SOURCE"]))

       Now, run pio run -t ota.

   Target with options
       Let's create a simple ping target and process it with platformio run --target ping command:

       platformio.ini:

          [env:env_custom_target]
          platform = ...
          ...
          extra_scripts = extra_script.py
          custom_ping_host = google.com

       extra_script.py:

          try:
              import configparser
          except ImportError:
              import ConfigParser as configparser

          Import("env")

          config = configparser.ConfigParser()
          config.read("platformio.ini")
          host = config.get("env_custom_target", "custom_ping_host")

          def mytarget_callback(*args, **kwargs):
              print("Hello PlatformIO!")
              env.Execute("ping " + host)

          env.AlwaysBuild(env.Alias("ping", None, mytarget_callback))

   Examples
       The best examples are PlatformIO development platforms.  Please check builder folder  for  the  main  and
       framework scripts.

   Custom options in platformio.ini
       platformio.ini:

          [env:my_env]
          platform = ...
          extra_scripts = extra_script.py

          custom_option1 = value1
          custom_option2 = value2

       extra_script.py:

          try:
              import configparser
          except ImportError:
              import ConfigParser as configparser

          config = configparser.ConfigParser()
          config.read("platformio.ini")

          value1 = config.get("my_env", "custom_option1")
          value2 = config.get("my_env", "custom_option2")

   Split C/C++ build flags
       platformio.ini:

          [env:my_env]
          platform = ...
          extra_scripts = extra_script.py

       extra_script.py (place it near platformio.ini):

          Import("env")

          # General options that are passed to the C and C++ compilers
          env.Append(CCFLAGS=["flag1", "flag2"])

          # General options that are passed to the C compiler (C only; not C++).
          env.Append(CFLAGS=["flag1", "flag2"])

          # General options that are passed to the C++ compiler
          env.Append(CXXFLAGS=["flag1", "flag2"])

   Extra Linker Flags without -Wl, prefix
       Sometimes  you  need to pass extra flags to GCC linker without Wl,. You could use projectconf_build_flags
       option but it will not work. PlatformIO will not parse these flags to  LINKFLAGS  scope.  In  this  case,
       simple extra script will help:

       platformio.ini:

          [env:env_extra_link_flags]
          platform = windows_x86
          extra_scripts = extra_script.py

       extra_script.py (place it near platformio.ini):

          Import("env")

          #
          # Dump build environment (for debug)
          # print(env.Dump())
          #

          env.Append(
            LINKFLAGS=[
                "-static",
                "-static-libgcc",
                "-static-libstdc++"
            ]
          )

   Custom upload tool
       You  can  override default upload command of development platform using extra script. There is the common
       environment variable UPLOADCMD which PlatformIO Build System will  handle  when  you  platformio  run  -t
       upload.

       Please  note  that  some  development  platforms  can  have  more  than  1  upload command.  For example,
       platform_atmelavr has UPLOADHEXCMD (firmware) and UPLOADEEPCMD (EEPROM data).

       See examples below:

       Template

       platformio.ini:

          [env:my_custom_upload_tool]
          platform = ...
          ; place it into the root of project or use full path
          extra_scripts = extra_script.py
          upload_protocol = custom
          ; each flag in a new line
          upload_flags =
            -arg1
            -arg2
            -argN

       extra_script.py (place it near platformio.ini):

          Import("env")

          # please keep $SOURCE variable, it will be replaced with a path to firmware

          # Generic
          env.Replace(
              UPLOADER="executable or path to executable",
              UPLOADCMD="$UPLOADER $UPLOADERFLAGS $SOURCE"
          )

          # In-line command with arguments
          env.Replace(
              UPLOADCMD="executable -arg1 -arg2 $SOURCE"
          )

          # Python callback
          def on_upload(source, target, env):
              print(source, target)
              firmware_path = str(source[0])
              # do something
              env.Execute("executable arg1 arg2")

          env.Replace(UPLOADCMD=on_upload)

       Custom openOCD command

       platformio.ini:

          [env:disco_f407vg]
          platform = ststm32
          board = disco_f407vg
          framework = mbed

          extra_scripts = extra_script.py
          upload_protocol = custom
          ; each flag in a new line
          upload_flags =
              -f
              scripts/interface/stlink.cfg
              -f
              scripts/target/stm32f4x.cfg

       extra_script.py (place it near platformio.ini):

          Import("env")

          platform = env.PioPlatform()

          env.Prepend(
              UPLOADERFLAGS=["-s", platform.get_package_dir("tool-openocd") or ""]
          )
          env.Append(
              UPLOADERFLAGS=["-c", "program {{$SOURCE}} verify reset; shutdown"]
          )
          env.Replace(
              UPLOADER="openocd",
              UPLOADCMD="$UPLOADER $UPLOADERFLAGS"
          )

   Upload to Cloud (OTA)
       See project example https://github.com/platformio/bintray-secure-ota

   Custom firmware/program name
       Sometimes is useful to have a different firmware/program name in projectconf_pio_build_dir.

       platformio.ini:

          [env:env_custom_prog_name]
          platform = espressif8266
          board = nodemcuv2
          framework = arduino
          build_flags = -D VERSION=13
          extra_scripts = pre:extra_script.py

       extra_script.py:

          Import("env")

          my_flags = env.ParseFlags(env['BUILD_FLAGS'])
          defines = {k: v for (k, v) in my_flags.get("CPPDEFINES")}
          # print(defines)

          env.Replace(PROGNAME="firmware_%s" % defines.get("VERSION"))

   Override package files
       PlatformIO Package Manager automatically installs pre-built packages (frameworks, toolchains,  libraries)
       required  by  development platforms and build process. Sometimes you need to override original files with
       own versions: configure custom GPIO, do changes to built-in LD scripts, or  some  patching  to  installed
       library dependency.

       The simplest way is using Diff and Patch technique. How does it work?

       1. Modify original source files

       2. Generate patches

       3. Apply patches via PlatformIO extra script before build process.

       Example

       We  need  to  patch the original standard/pins_arduino.h variant from framework_arduino framework and add
       extra macro #define PIN_A8   (99).  Let's duplicate standard/pins_arduino.h and apply changes. Generate a
       patch file and place it into patches folder located in the root of a project:

          diff ~/.platformio/packages/framework-arduinoavr/variants/standard/pins_arduino.h /tmp/pins_arduino_modified.h > /path/to/platformio/project/patches/1-framework-arduinoavr-add-pin-a8.patch

       The result of 1-framework-arduinoavr-add-pin-a8.patch:

          63a64
          > #define PIN_A8   (99)
          112c113
          < // 14-21 PA0-PA7 works
          ---
          > // 14-21 PA0-PA7 works

       Using  extra  scripting we can apply patching before a build process. The final result of projectconf and
       "PRE" extra script named apply_patches.py:

       platformio.ini:

          [env:uno]
          platform = atmelavr
          board = uno
          framework = arduino
          extra_scripts = pre:apply_patches.py

       apply_patches.py:

          from os.path import join, isfile

          Import("env")

          FRAMEWORK_DIR = env.PioPlatform().get_package_dir("framework-arduinoavr")
          patchflag_path = join(FRAMEWORK_DIR, ".patching-done")

          # patch file only if we didn't do it before
          if not isfile(join(FRAMEWORK_DIR, ".patching-done")):
              original_file = join(FRAMEWORK_DIR, "variants", "standard", "pins_arduino.h")
              patched_file = join("patches", "1-framework-arduinoavr-add-pin-a8.patch")

              assert isfile(original_file) and isfile(patched_file)

              env.Execute("patch %s %s" % (original_file, patched_file))
              # env.Execute("touch " + patchflag_path)

              def _touch(path):
                  with open(path, "w") as fp:
                      fp.write("")

              env.Execute(lambda *args, **kwargs: _touch(patchflag_path))

       Please note that this example will work on a system where a patch tool is available. For Windows OS,  you
       can use patch and diff tools provided by Git client utility (located inside installation directory).

       If  you  need  to  make  it  more  independent  to  the operating system, please replace the patch with a
       multi-platform python-patch script.

   Override Board Configuration
       PlatformIO  allows  one  to  override   some   basic   options   (integer   or   string   values)   using
       projectconf_board_more_options in projectconf.  Sometimes you need to do complex changes to default board
       manifest and extra PRE scripting work well here. See example  below  how  to  override  default  hardware
       VID/PIDs.

       WARNING:
          Due to a technical limitation these board changes will not work for cmd_device_monitor command.

       platformio.ini:

          [env:uno]
          platform = atmelavr
          board = uno
          framework = arduino
          extra_scripts = pre:custon_hwids.py

       custon_hwids.py:

          Import("env")

          board_config = env.BoardConfig()
          # should be array of VID:PID pairs
          board_config.update("build.hwids", [
            ["0x2341", "0x0243"],  # 1st pair
            ["0x2A03", "0x0043"].  # 2nd pair, etc.
          ])

   Custom debug flags
       PlatformIO  removes  all  debug/optimization flags before a debug session or when build_configurations is
       set to debug and overrides them with -0g -g2 -ggdb2 for ASFLAGS, CCFLAGS, and LINKFLAGS build scopes.

       An extra script allows us to override PlatformIO's default behavior and declare custom flags. See example
       below where we override -Og with -O0:

       platformio.ini:

          [env:teensy31]
          platform = teensy
          board = teensy31
          framework = arduino
          extra_scripts = custom_debug_flags.py

       custom_debug_flags.py:

          Import("env")

          if env.GetBuildType() == "debug":
             for scope in ("ASFLAGS", "CCFLAGS", "LINKFLAGS"):
                for i, flag in enumerate(env[scope]):
                   if flag == "-Og":
                      env[scope][i] = "-O0"

   Library Manager
       PlatformIO  Library  Manager is a tool for managing libraries of PlatformIO Registry and VCS repositories
       (Git, Hg, SVN). It makes it exceedingly simple to find, install and keep libraries up-to-date. PlatformIO
       Library Manager supports Semantic Versioning and its rules.

                                                         ----

       pioide has built-in piohome with a modern GUI which allows:

       • Search for new libraries in PlatformIO Registry

       • "1-click" library installation, per-project libraries, extra storages

       • List installed libraries in multiple storages

       • List built-in libraries (by frameworks)

       • Updates for installed libraries

       • Multiple examples, trending libraries, and more.
       [image]

   Quick Start
       PlatformIO  Library  Manager is a tool for managing libraries of PlatformIO Registry and VCS repositories
       (Git, Hg, SVN). It makes it exceedingly simple to find, install and keep libraries up-to-date. PlatformIO
       Library Manager supports Semantic Versioning and its rules.

       There are 3 options how to find/manage libraries:

       • piohome

       • Web Library Search

       • PIO Core Command Line Interface

       You  can manage different library storages using platformio lib --global or  platformio lib --storage-dir
       options. If you change current working directory in terminal  to  project  folder,  then  platformio  lib
       command will manage automatically dependency storage in projectconf_pio_libdeps_dir.

   Project dependencies
       PlatformIO Library Manager allows one to specify project dependencies (projectconf_lib_deps) that will be
       installed automatically per project before environment processing. You do not need to  install  libraries
       manually.   The  only  one simple step is to define dependencies in projectconf.  You can use library ID,
       Name or even repository URL. For example,

          [env:myenv]
          platform = ...
          framework = ...
          board = ...
          lib_deps =
            13
            PubSubClient
            ArduinoJson@~5.6,!=5.4
            https://github.com/gioblu/PJON.git#v2.0
            https://github.com/me-no-dev/ESPAsyncTCP.git
            https://github.com/adafruit/DHT-sensor-library/archive/master.zip

       Please follow to cmd_lib_install for detailed documentation about possible values.

       WARNING:
          If some libraries are not visible in pioide  and  Code  Completion  or  Code  Linting  does  not  work
          properly, please perform

          • Atom: "Menu: PlatformIO > Rebuild C/C++ Project Index (Autocomplete, Linter)"

          • VSCode: "Menu: View > Command Palette... > PlatformIO: Rebuild C/C++ Project Index"

   PlatformIO IDE
       pioide has built-in piohome with a modern GUI which allows:

       • Search for new libraries in PlatformIO Registry

       • "1-click" library installation, per-project libraries, extra storages

       • List installed libraries in multiple storages

       • List built-in libraries (by frameworks)

       • Updates for installed libraries

       • Multiple examples, trending libraries, and more.
       [image]

   PlatformIO Core
       [image]

   CLI Guide
   Library Dependency Finder (LDF)
       Library  Dependency  Finder is a core part of PlatformIO Build System that operates with the C/C++ source
       files and looks for #include ...  directives to know what header directories to include for the compiler.

       In spite of the fact that Library Dependency Finder  is  written  in  pure  Python,  it  evaluates  C/C++
       Preprocessor  conditional  syntax  (#ifdef,  if,  defined,  else,  and elif) without calling gcc -E. This
       approach allows to significantly reduce the total compilation time. See Dependency Finder Mode  for  more
       details.

   ContentsLibrary Dependency Finder (LDF)ConfigurationStorageDependency Finder ModeCompatibility ModeC/C++ Preprocessor conditional syntax

   Configuration
       Library Dependency Finder can be configured from projectconf:

   Storage
       There  are  different  storages  where  Library  Dependency  Finder  looks  for libraries. These storages
       (folders) have priority and LDF operates in the next order:

       1. projectconf_lib_extra_dirs - extra storages per build environment

       2. projectconf_pio_lib_dir - own/private library storage per project

       3. projectconf_pio_libdeps_dir - project dependency storage used by librarymanager

       4. "projectconf_pio_core_dir/lib" - global storage per all projects.

       5. Library storages built into frameworks, SDKs.

   Dependency Finder Mode
       Library   Dependency   Finder   starts   work   from   analyzing   source   files    of    the    project
       (projectconf_pio_src_dir) and can work in the next modes:

       off    "Manual  mode",  does  not  process  source  files of a project and dependencies.  Builds only the
              libraries   that   are   specified   in   manifests   (library_config,   module.json)   or   using
              projectconf_lib_deps option.

       chain  [DEFAULT]  Parses  ALL  C/C++  source  files  of  the  project and follows only by nested includes
              (#include ..., chain...) from the libraries.  It also parses C, CC, CPP files from libraries which
              have  the  same  name  as  included  header file. Does not evaluate C/C++ Preprocessor conditional
              syntax.

       deep   Parses ALL C/C++ source files of the project and parses ALL C/C++ source files of the  each  found
              dependency (recursively).  Does not evaluate C/C++ Preprocessor conditional syntax.

       chain+ The same behavior as for the chain but evaluates C/C++ Preprocessor conditional syntax.

       deep+  The same behavior as for the deep but evaluates C/C++ Preprocessor conditional syntax.

       The  mode  can  be  changed using projectconf_lib_ldf_mode option in projectconf. Default value is set to
       chain.

       NOTE:
          Usually, when the LDF appears to fail to identify a  dependency  of  a  library,  it  is  because  the
          dependency  is  only referenced from a library source file, and not a library header file (see example
          below). In this case, it is necessary to either explicitly reference the dependency from  the  project
          source  or  projectconf (projectconf_lib_deps option), or change the LDF mode to "deep" (not generally
          recommended).

       A difference between chain/chain+ and deep/deep+ modes. For example, there are 2 libraries:

       • Library Foo with files:

         • Foo/foo.hFoo/foo.cppFoo/extra.cpp

       • Library Bar with files:

         • Bar/bar.hBar/bar.cpp

       Case 1lib_ldf_mode = chainFoo/foo.h depends on the Bar library (contains #include <bar.h>)

              • #include <foo.h> is located in one of the project source files

              Here the nested includes (project file > foo.h > bar.h) and LDF will find  both  libraries  "Foo``
              and Bar.

       Case 2lib_ldf_mode = chainFoo/extra.cpp depends on the Bar library (contains #include <bar.h>)

              • #include <foo.h> is located in one of the project source files

              In  this  case,  LDF  will  not  find  the  Bar library because it doesn't know about the CPP file
              (Foo/extra.cpp).

       Case 3lib_ldf_mode = deepFoo/extra.cpp depends on Bar library (contains #include <bar.h>)

              • #include <foo.h> is located in one of the project source files

              Firstly, LDF finds the Foo library, then it parses all sources from  the  Foo  library  and  finds
              Foo/extra.cpp  that depends on #include <bar.h>.  Secondly, it will parse all sources from the Bar
              library. This operation continues until all dependencies will not be parsed.

   Compatibility Mode
       Compatibility mode allows one to control strictness of Library Dependency Finder.   If  library  contains
       one  of  manifest file (library_config, library.properties, module.json), then LDF check compatibility of
       this library with real build environment. Available compatibility modes:

       off    Does not check for compatibility (is not recommended)

       soft   [DEFAULT] Checks for the compatibility with projectconf_env_framework from build environment

       strict Checks for the compatibility  with  projectconf_env_framework  and  projectconf_env_platform  from
              build environment.

       This mode can be changed using projectconf_lib_compat_mode option in projectconf. Default value is set to
       soft.

   C/C++ Preprocessor conditional syntax
       In spite of the fact that Library Dependency Finder  is  written  in  pure  Python,  it  evaluates  C/C++
       Preprocessor  conditional  syntax  (#ifdef,  if,  defined,  else,  and  elif) without calling gcc -E. For
       example,

       platformio.ini

          [env:myenv]
          lib_ldf_mode = chain+
          build_flags = -D MY_PROJECT_VERSION=13

       mylib.h

          #ifdef MY_PROJECT_VERSION
          // include common file for the project
          #include "my_common.h"
          #endif

          #if MY_PROJECT_VERSION < 10
          // this include will be ignored because does not satisfy condition above
          #include "my_old.h"
          #endif

   library.json
       library.json is a manifest file of development library. It allows  developers  to  keep  project  in  own
       structure and define:

       • location of source code

       • examples list

       • compatible frameworks and platforms

       • library dependencies

       • advanced build settings

       PlatformIO  Library  Crawler  uses library.json manifest to extract source code from developer's location
       and keeps a cleaned library in own Library Registry.

       A data in library.json should be represented in JSON-style via associative array (name/value  pairs).  An
       order doesn't matter. The allowable fields (names from pairs) are described below.

   FieldsnameversiondescriptionkeywordsauthorsrepositorylicensedownloadUrlhomepageexportincludeexcludeframeworksplatformsdependenciesexamplesbuildflagsunflagsincludeDirsrcDirsrcFilterextraScriptlibArchivelibLDFModelibCompatModeExamples

   name
       Required | Type: String | Max. Length: 50

       A name of the library.

       • Must be unique.

       • Should be slug style for simplicity, consistency and compatibility.  Example: Arduino-SPI

       • Title Case, Aa-z, can contain digits and dashes (but not start/end with them).

       • Consecutive dashes are not allowed.

   version
       Required | Type: String | Max. Length: 20

       A  version  of  the  current  library  source  code.  Can contain a-z, digits, dots or dash and should be
       Semantic Versioning <http://semver.org> compatible.

       Example:

          "name": "Bar",
          "version": "1.0.0",
          "repository":
          {
              "type": "git",
              "url": "https://github.com/foo/bar.git"
          }

   description
       Required | Type: String | Max. Length: 255

       The field helps users to identify and search for your library with  a  brief  description.  Describe  the
       hardware devices (sensors, boards and etc.) which are suitable with it.

   keywords
       Required | Type: String | Max. Length: 255

       Used  for search by keyword. Helps to make your library easier to discover without people needing to know
       its name.

       The keyword should be lowercased, can contain a-z, digits and dash (but not start/end with them). A  list
       from the keywords can be specified with separator ,

   authors
       Required if repository field is not defined | Type: Object or Array

       An author contact information

       • name Full name (Required)

       • emailurl An author's contact page

       • maintainer Specify "maintainer" status

       Examples:

          "authors":
          {
              "name": "John Smith",
              "email": "me@john-smith.com",
              "url": "http://www.john-smith/contact"
          }

          ...

          "authors":
          [
              {
                  "name": "John Smith",
                  "email": "me@john-smith.com",
                  "url": "http://www.john-smith/contact"
              },
              {
                  "name": "Andrew Smith",
                  "email": "me@andrew-smith.com",
                  "url": "http://www.andrew-smith/contact",
                  "maintainer": true
              }
          ]

       NOTE:
          You can omit authors field and define repository field. Only GitHub-based repository is supported now.
          In this case PlatformIO Library Registry Crawler will use information from GitHub API Users.

   repository
       Required if downloadUrl field is not defined | Type: Object

       The repository in which the source code can be found. The field consists of the next items:

       • type the only "git", "hg" or "svn" are supported

       • urlbranch if is not specified, default branch will be used. This field  will  be  ignored  if  tag/release
         exists with the value of version.

       Example:

          "repository":
          {
              "type": "git",
              "url": "https://github.com/foo/bar.git"
          }

   license
       Optional | Type: String

       A  license  of  the library. You can check the full list of SPDX license IDs. Ideally you should pick one
       that is OSI approved.

          "license": "Apache-2.0"

   downloadUrl
       Required if repository field is not defined | Type: String

       It is the HTTP URL to the archived source code of library. It should end with the type of  archive  (.zip
       or .tar.gz).

       NOTE:
          downloadUrl has higher priority than repository.

       Example with detached release/tag on GitHub:

          "version": "1.0.0",
          "downloadUrl": "https://github.com/foo/bar/archive/v1.0.0.tar.gz",
          "include": "bar-1.0.0"

       See more library.json library_creating_examples.

   homepage
       Optional | Type: String | Max. Length: 255

       Home page of library (if is different from repository url).

   export
       Optional | Type: Object

       Explain  PlatformIO  Library  Crawler  which  content  from  the repository/archive should be exported as
       "source code" of the library. This option is useful if need to  exclude  extra  data  (test  code,  docs,
       images, PDFs, etc). It allows one to reduce size of the final archive.

       Possible options:

       • includeexclude

   include
       Optional | Type: String or Array | Glob Pattern

       If  include  field is a type of String, then PlatformIO Library Registry Crawler will recognize it like a
       "relative path inside repository/archive to library source code".   See  example  below  where  the  only
       source code from the relative directory LibrarySourceCodeHere will be included.

          "include": "some/child/dir/LibrarySourceCodeHere"

       If  include  field  is  a  type  of  Array,  then  PlatformIO Library Registry Crawler  will include only
       directories/files which match with include patterns.

       Example:

          "export": {
              "include":
              [
                  "dir/*.[ch]pp",
                  "dir/examples/*",
                  "*/*/*.h"
              ]
          }

       Pattern Meaning

                                     ┌────────┬──────────────────────────────────┐
                                     │Pattern │ Meaning                          │
                                     ├────────┼──────────────────────────────────┤
                                     │*       │ matches everything               │
                                     ├────────┼──────────────────────────────────┤
                                     │?       │ matches any single character     │
                                     ├────────┼──────────────────────────────────┤
                                     │[seq]   │ matches any character in seq     │
                                     ├────────┼──────────────────────────────────┤
                                     │[!seq]  │ matches any character not in seq │
                                     └────────┴──────────────────────────────────┘

       See more library.json library_creating_examples.

   exclude
       Optional | Type: String or Array | Glob Pattern

       Exclude the directories and files which match with exclude patterns.

   frameworks
       Optional | Type: String or Array

       A list with compatible frameworks. The available framework types are defined in the frameworks section.

       If the library is compatible with the all frameworks, then you can use * symbol:

          "frameworks": "*"

   platforms
       Optional | Type: String or Array

       A list with compatible platforms. The available platform types are defined in platforms section.

       If the library is compatible with the all platforms, then you can use * symbol:

          "platforms": "*"

   dependencies
       Optional | Type: Array or Object

       A list of dependent libraries. They will be installed automatically with cmd_lib_install command.

       Allowed requirements for dependent library:

       • name | Type: Stringversion | Type: Stringauthors | Type: String or Arrayframeworks | Type: String or Arrayplatforms | Type: String or Array

       The version supports Semantic Versioning ( <major>.<minor>.<patch>) and can take  any  of  the  following
       forms:

       • 1.2.3 - an exact version number. Use only this exact version

       • ^1.2.3 - any compatible version (exact version for 1.x.x versions

       • ~1.2.3 - any version with the same major and minor versions, and an equal or greater patch version

       • >1.2.3 - any version greater than 1.2.3. >=, <, and <= are also possible

       • >0.1.0,!=0.2.0,<0.3.0 - any version greater than 0.1.0, not equal to 0.2.0 and less than 0.3.0

       The rest possible values including VCS repository URLs are documented in cmd_lib_install command.

       Example:

          "dependencies":
          [
              {
                  "name": "Library-Foo",
                  "authors":
                  [
                      "Jhon Smith",
                      "Andrew Smith"
                  ]
              },
              {
                  "name": "Library-Bar",
                  "version": "~1.2.3"
              },
              {
                  "name": "lib-from-repo",
                  "version": "https://github.com/user/package.git#1.2.3"
              }
          ]

       A short definition of dependencies is allowed:

          "dependencies": {
              "mylib": "1.2.3",
              "lib-from-repo": "githubuser/package"
          }

       See more library.json library_creating_examples.

   examples
       Optional | Type: String or Array | Glob Pattern

       A list of example patterns. This field is predefined with default value:

          "examples": [
              "[Ee]xamples/*.c",
              "[Ee]xamples/*.cpp",
              "[Ee]xamples/*.ino",
              "[Ee]xamples/*.pde",
              "[Ee]xamples/*/*.c",
              "[Ee]xamples/*/*.cpp",
              "[Ee]xamples/*/*.ino",
              "[Ee]xamples/*/*.pde",
              "[Ee]xamples/*/*/*.c",
              "[Ee]xamples/*/*/*.cpp",
              "[Ee]xamples/*/*/*.ino",
              "[Ee]xamples/*/*/*.pde"
          ]

   build
       Optional | Type: Object

       Specify advanced settings, options and flags for the build system. Possible options:

       • flagsunflagsincludeDirsrcDirsrcFilterextraScriptlibArchivelibLDFModelibCompatMode

   flags
       Optional | Type: String or Array

       Extra  flags  to  control  preprocessing,  compilation,  assembly  and  linking  processes.  More details
       projectconf_build_flags.

   unflags
       Optional | Type: String or Array

       Remove base/initial flags which were set by development platform. More details projectconf_build_unflags.

   includeDir
       Optional | Type: String

       New in version 4.0.

       Custom location of library header files. A default value is include and means that folder is  located  in
       the root of a library.

   srcDir
       Optional | Type: String

       New in version 4.0.

       Custom  location  of  library source code. A default value is src and means that folder is located in the
       root of a library.

   srcFilter
       Optional | Type: String or Array

       Specify which source files should be included/excluded from build process.  The path in filter should  be
       relative from a root of library.

       See syntax in projectconf_src_filter.

       Please note that you can generate source filter "on-the-fly" using extraScript (see below)

   extraScript
       Optional | Type: String

       Launch extra script before build process.  More details projectconf_extra_scripts.

       Example (HAL-based library)

       This  example  demonstrates how to build HAL-dependent source files and exclude other source files from a
       build process.

       Project structure

          ├── lib
          │   ├── README
          │   └── SomeLib
          │       ├── extra_script.py
          │       ├── hal
          │       │   ├── bar
          │       │   │   ├── hal.c
          │       │   │   └── hal.h
          │       │   ├── foo
          │       │       ├── hal.c
          │       │       └── hal.h
          │       ├── library.json
          │       ├── SomeLib.c
          │       └── SomeLib.h
          ├── platformio.ini
          └── src
              └── test.c

       platformio.ini

          [env:foo]
          platform = native
          build_flags = -DHAL=foo

          [env:bar]
          platform = native
          build_flags = -DHAL=bar

       library.json

          {
              "name": "SomeLib",
              "version": "0.0.0",
              "build": {
                  "extraScript": "extra_script.py"
              }
          }

       extra_script.py

          Import('env')
          from os.path import join, realpath

          # private library flags
          for item in env.get("CPPDEFINES", []):
              if isinstance(item, tuple) and item[0] == "HAL":
                  env.Append(CPPPATH=[realpath(join("hal", item[1]))])
                  env.Replace(SRC_FILTER=["+<*>", "-<hal>", "+<%s>" % join("hal", item[1])])
                  break

          # pass flags to a global build environment (for all libraries, etc)
          global_env = DefaultEnvironment()
          global_env.Append(
              CPPDEFINES=[
                  ("MQTT_MAX_PACKET_SIZE", 512),
                  "ARDUINOJSON_ENABLE_STD_STRING",
                  ("BUFFER_LENGTH", 32)
              ]
          )

   libArchive
       Optional | Type: Boolean

       Create an archive (*.a, static library) from the object files and link it into a firmware (program). This
       is default behavior of PlatformIO Build System ("libArchive": true).

       Setting  "libArchive": false will instruct PIO Build System to link object files directly (in-line). This
       could be useful if you need to override weak symbols defined in framework or other libraries.

       You can disable library archiving globally using projectconf_lib_archive option in projectconf.

   libLDFMode
       Optional | Type: String

       Specify Library Dependency Finder Mode. See ldf_mode for details.

   libCompatMode
       Optional | Type: String

       Specify Library Compatibility Mode. See ldf_compat_mode for details.

   Examples
       1. Custom macros/defines

          "build": {
              "flags": "-D MYLIB_REV=1.2.3 -DRELEASE"
          }

       2. Extra includes for C preprocessor

          "build": {
              "flags": [
                  "-I inc",
                  "-I inc/target_x13"
              ]
          }

       3. Force to use C99 standard instead of C11

          "build": {
              "unflags": "-std=gnu++11",
              "flags": "-std=c99"
          }

       4. Build source files (c, cpp, h) at the top level of the library

          "build": {
              "srcFilter": [
                  "+<*.c>",
                  "+<*.cpp>",
                  "+<*.h>"
              ]
          }

       5. Extend PlatformIO Build System with own extra script

          "build": {
              "extraScript": "generate_headers.py"
          }

       generate_headers.py

          Import('env')
          # print(env.Dump())
          env.Append(
              CPPDEFINES=["HELLO=WORLD", "TAG=1.2.3", "DEBUG"],
              CPPPATH=["inc", "inc/devices"]
          )

          # some python code that generates header files "on-the-fly"

   Creating Library
       PlatformIO librarymanager doesn't have any requirements to a library source code structure. The only  one
       requirement  is  library's  manifest  file - library_config, library.properties or module.json. It can be
       located inside your library or in the another location where PlatformIO  Library  Registry  Crawler  will
       have HTTP access.

       Updates  to existing libraries are done every 24 hours. In case a more urgent update is required, you can
       post a request on PlatformIO community.

   ContentsSource Code LocationAt GitHubUnder VCS (SVN/GIT)Self-hostedRegisterExamples

   Source Code Location
       There are a several ways how to share your library with the whole world (see examples).

       You can hold a lot of libraries (split into separated folders) inside one of the  repository/archive.  In
       this  case, you need to specify include option of libjson_export field to relative path to your library's
       source code.

   At GitHub
       Recommended

       If a library source code is located at GitHub, then  you  need  to  specify  only  these  fields  in  the
       library_config:

       • libjson_name

       • libjson_version (is not required, but highly recommended for new librarymanager)

       • libjson_keywords

       • libjson_description

       • libjson_repository

       PlatformIO  Library  Registry  Crawler will populate the rest fields, like libjson_authors with an actual
       information from GitHub.

       Example, DallasTemperature:

          {
            "name": "DallasTemperature",
            "keywords": "onewire, 1-wire, bus, sensor, temperature",
            "description": "Arduino Library for Dallas Temperature ICs (DS18B20, DS18S20, DS1822, DS1820)",
            "repository":
            {
              "type": "git",
              "url": "https://github.com/milesburton/Arduino-Temperature-Control-Library.git"
            },
            "authors":
            [
              {
                "name": "Miles Burton",
                "email": "miles@mnetcs.com",
                "url": "http://www.milesburton.com",
                "maintainer": true
              },
              {
                "name": "Tim Newsome",
                "email": "nuisance@casualhacker.net"
              },
              {
                "name": "Guil Barros",
                "email": "gfbarros@bappos.com"
              },
              {
                "name": "Rob Tillaart",
                "email": "rob.tillaart@gmail.com"
              }
            ],
            "dependencies": [
              {
                "name": "OneWire",
                "authors": "Paul Stoffregen",
                "frameworks": "arduino"
              }
            ],
            "version": "3.7.7",
            "frameworks": "arduino",
            "platforms": "*"
          }

   Under VCS (SVN/GIT)
       PlatformIO Library Registry Crawler can operate with a library source code that  is  under  VCS  control.
       The list of required fields in the library_config will look like:

       • libjson_name

       • libjson_keywords

       • libjson_description

       • libjson_authors

       • libjson_repository

       Example:

          {
              "name": "XBee",
              "keywords": "xbee, protocol, radio",
              "description": "Arduino library for communicating with XBees in API mode",
              "authors":
              {
                  "name": "Andrew Rapp",
                  "email": "andrew.rapp@gmail.com",
                  "url": "https://code.google.com/u/andrew.rapp@gmail.com/"
              },
              "repository":
              {
                  "type": "git",
                  "url": "https://code.google.com/p/xbee-arduino/"
              },
              "frameworks": "arduino",
              "platforms": "atmelavr"
          }

   Self-hosted
       You  can  manually  archive  (Zip, Tar.Gz) your library source code and host it in the Internet. Then you
       should specify the additional fields, like libjson_version and libjson_downloadurl.  The  final  list  of
       required fields in the library_config will look like:

       • libjson_name

       • libjson_keywords

       • libjson_description

       • libjson_authors

       • libjson_version

       • libjson_downloadurl

          {
              "name": "OneWire",
              "keywords": "onewire, 1-wire, bus, sensor, temperature, ibutton",
              "description": "Control devices (from Dallas Semiconductor) that use the One Wire protocol (DS18S20, DS18B20, DS2408 and etc)",
              "authors":
              {
                  "name": "Paul Stoffregen",
                  "url": "http://www.pjrc.com/teensy/td_libs_OneWire.html"
              },
              "version": "2.2",
              "downloadUrl": "http://www.pjrc.com/teensy/arduino_libraries/OneWire.zip",
              "export": {
                  "include": "OneWire"
              },
              "frameworks": "arduino",
              "platforms": "atmelavr"
          }

   Register
       The registration requirements:

       • A  library  must  adhere  to the library manifest specification - library_config, library.properties or
         module.json.

       • There must be public HTTP access to the library manifest file.

       Now, you can register your library and allow others to install it.

   Examples
       Command:

          $ platformio lib register http://my.example.com/library.json
          $ platformio lib register http://my.example.com/library.properties
          $ platformio lib register http://my.example.com/module.jsonGitHub + detached releaseDependencies by author and frameworkMultiple libraries in the one repository

   Development Platforms
       The PlatformIO  ecosystem  has  a  decentralized  architecture,  allowing  development  for  a  range  of
       development  platforms.  A  development  platform  (or just "platform" for short) is usually a particular
       microcontroller or processor architecture that PlatformIO projects can be compiled  to  run  on.  (A  few
       platforms, for example Teensy, use different target architectures for different boards.)

       Each  of the three supported host systems Mac OS X, Linux and Windows support compiling for all platforms
       listed below. Some platforms are also supported under ARM Linux hosts such  as  Raspberry  Pi.  For  each
       development platform, PlatformIO defines:

       • The PlatformIO Build System build scripts for the supported frameworks and SDKs

       • Pre-configured presets for embedded circuit boards

       • Pre-compiled toolchains and related tools for the architechture(s)

       Each  project  must specify the platform name using the projectconf_env_platform option in projectconf. A
       specific platform version can optionally be specified as well. As embedded boards  are  equipped  with  a
       particular  microcontroller, each embedded board specifies what development platform it uses and this can
       not be changed.

       If a new board uses an architecture not in this list, a custom development platform can be  created;  see
       platform_creating.

   Embedded
   Aceinna IMU
       Configuration
              projectconf_env_platform = aceinna_imu

       Open-source, embedded development platform for Aceinna IMU hardware. Run custom algorithms and navigation
       code on Aceinna IMU/INS hardware.

       For more detailed information please visit vendor site.

   ContentsExamplesDebuggingStable and upstream versionsPackagesBoards

   Examples
       Examples are listed from Aceinna IMU development platform repository:

       • OpenIMU300RIOpenIMU330BIOpenRTK330LIOpenIMU300ZI

   Debugging
       piodebug - "1-click" solution for debugging with a zero configuration.

       • Tools & Debug ProbesOn-Board Debug ToolsExternal Debug Tools

   Tools & Debug Probes
       Supported debugging tools are listed in "Debug" column. For  more  detailed  information,  please  scroll
       table  by  horizontal.   You  can  switch  between debugging debugging_tools using projectconf_debug_tool
       option in projectconf.

       WARNING:
          You will need to install debug tool drivers depending on your  system.   Please  click  on  compatible
          debug tool below for the further instructions.

   On-Board Debug Tools
       Boards  listed  below  have on-board debug probe and ARE READY for debugging!  You do not need to use/buy
       external debug probe.

                      ┌─────────────────────────────┬───────────────┬───────────┬───────┬───────┐
                      │Name                         │ MCU           │ Frequency │ Flash │ RAM   │
                      ├─────────────────────────────┼───────────────┼───────────┼───────┼───────┤
                      │board_aceinna_imu_LowCostRTK │ STM32F469NIH6 │ 180MHz    │ 1MB   │ 384KB │
                      └─────────────────────────────┴───────────────┴───────────┴───────┴───────┘

   External Debug Tools
       Boards  listed  below are compatible with piodebug but DEPEND ON external debug probe. They ARE NOT READY
       for debugging.  Please click on board name for the further details.

                      ┌───────────────────────────────┬─────────────┬───────────┬───────┬───────┐
                      │Name                           │ MCU         │ Frequency │ Flash │ RAM   │
                      ├───────────────────────────────┼─────────────┼───────────┼───────┼───────┤
                      │board_aceinna_imu_OpenIMU300   │ STM32F405RG │ 120MHz    │ 1MB   │ 128KB │
                      ├───────────────────────────────┼─────────────┼───────────┼───────┼───────┤
                      │board_aceinna_imu_OpenIMU300ZA │ STM32F405RG │ 120MHz    │ 1MB   │ 128KB │
                      ├───────────────────────────────┼─────────────┼───────────┼───────┼───────┤
                      │board_aceinna_imu_OpenIMU330   │ STM32L431CB │ 80MHz     │ 128KB │ 64KB  │
                      ├───────────────────────────────┼─────────────┼───────────┼───────┼───────┤
                      │board_aceinna_imu_OpenRTK      │ STM32F469IG │ 180MHz    │ 1MB   │ 384KB │
                      ├───────────────────────────────┼─────────────┼───────────┼───────┼───────┤
                      │board_aceinna_imu_OpenRTK330L  │ STM32F469IG │ 180MHz    │ 1MB   │ 384KB │
                      └───────────────────────────────┴─────────────┴───────────┴───────┴───────┘

   Stable and upstream versions
       You can switch between stable releases of Aceinna  IMU  development  platform  and  the  latest  upstream
       version using projectconf_env_platform option in projectconf as described below.

   Stable
          ; Latest stable version
          [env:latest_stable]
          platform = aceinna_imu
          board = ...

          ; Custom stable version
          [env:custom_stable]
          platform = aceinna_imu@x.y.z
          board = ...

   Upstream
          [env:upstream_develop]
          platform = https://github.com/aceinna/platform-aceinna_imu.git
          board = ...

   Packages
                          ┌─────────────────────────┬───────────────────────────────────────┐
                          │Name                     │ Description                           │
                          ├─────────────────────────┼───────────────────────────────────────┤
                          │tool-jlink               │ SEGGER     J-Link     Software    and │
                          │                         │ Documentation Pack                    │
                          ├─────────────────────────┼───────────────────────────────────────┤
                          │tool-openocd             │ OpenOCD                               │
                          ├─────────────────────────┼───────────────────────────────────────┤
                          │toolchain-gccarmnoneeabi │ gcc-arm-embedded                      │
                          └─────────────────────────┴───────────────────────────────────────┘

       WARNING:
          Linux Users:

              • Install "udev" rules faq_udev_rules

              • Raspberry Pi users, please read this article Enable serial port on Raspberry Pi.

          Windows Users:
              Please check that you have a correctly installed USB driver from board manufacturer

   Boards
       NOTE:

          • You can list pre-configured boards by cmd_boards command or PlatformIO Boards Explorer

          • For more detailed board information please scroll the tables below by horizontally.

   Aceinna
                ┌───────────────────────────────┬──────────┬───────────────┬───────────┬───────┬───────┐
                │Name                           │ Debug    │ MCU           │ Frequency │ Flash │ RAM   │
                ├───────────────────────────────┼──────────┼───────────────┼───────────┼───────┼───────┤
                │board_aceinna_imu_LowCostRTK   │ On-board │ STM32F469NIH6 │ 180MHz    │ 1MB   │ 384KB │
                ├───────────────────────────────┼──────────┼───────────────┼───────────┼───────┼───────┤
                │board_aceinna_imu_OpenIMU300   │ External │ STM32F405RG   │ 120MHz    │ 1MB   │ 128KB │
                ├───────────────────────────────┼──────────┼───────────────┼───────────┼───────┼───────┤
                │board_aceinna_imu_OpenIMU300ZA │ External │ STM32F405RG   │ 120MHz    │ 1MB   │ 128KB │
                ├───────────────────────────────┼──────────┼───────────────┼───────────┼───────┼───────┤
                │board_aceinna_imu_OpenIMU330   │ External │ STM32L431CB   │ 80MHz     │ 128KB │ 64KB  │
                ├───────────────────────────────┼──────────┼───────────────┼───────────┼───────┼───────┤
                │board_aceinna_imu_OpenRTK      │ External │ STM32F469IG   │ 180MHz    │ 1MB   │ 384KB │
                ├───────────────────────────────┼──────────┼───────────────┼───────────┼───────┼───────┤
                │board_aceinna_imu_OpenRTK330L  │ External │ STM32F469IG   │ 180MHz    │ 1MB   │ 384KB │
                └───────────────────────────────┴──────────┴───────────────┴───────────┴───────┴───────┘

   Atmel AVR
       Configuration
              projectconf_env_platform = atmelavr

       Atmel AVR  8-bit  MCUs  deliver  a  unique  combination  of  performance,  power  efficiency  and  design
       flexibility.  Optimized  to  speed  time  to  market-and  easily  adapt to new ones-they are based on the
       industry's most code-efficient architecture for C and assembly programming

       For more detailed information please visit vendor site.

   ContentsConfigurationExamplesDebuggingStable and upstream versionsPackagesFrameworksBoards

   ConfigurationUpload using ProgrammerUpload EEPROM dataFuses programmingCustom fusesMiniCore, MegaCore and MightyCoreBootloader programmingCustom bootloader

   Upload using Programmer
       To upload firmware using programmer you need to use program target instead of upload for  platformio  run
       --target command. For example, platformio run -t program.

       WARNING:
          Upload options like upload_port don't work as expected with platformio run -t program. You need to use
          upload_flags if you want to specify custom port or speed (see examples below).

       NOTE:
          List of avrdude supported programmers are accessible with avrdude -c ?

       Configuration for the programmers:

       • AVR ISP

            [env:myenv]
            platform = atmelavr
            framework = arduino
            upload_protocol = stk500v1
            ; each flag in a new line
            upload_flags =
                -P$UPLOAD_PORT

            ; edit this line with valid upload port
            upload_port = SERIAL_PORT_HERE

       • AVRISP mkII

            [env:myenv]
            platform = atmelavr
            framework = arduino
            upload_protocol = stk500v2
            ; each flag in a new line
            upload_flags =
                -Pusb

       • USBtinyISP

            [env:myenv]
            platform = atmelavr
            framework = arduino
            upload_protocol = usbtiny

       • ArduinoISP

            [env:myenv]
            platform = atmelavr
            framework = arduino
            upload_protocol = arduinoisp

       • USBasp

            [env:myenv]
            platform = atmelavr
            framework = arduino
            upload_protocol = usbasp
            ; each flag in a new line
            upload_flags =
                -Pusb

       • Parallel Programmer

            [env:myenv]
            platform = atmelavr
            framework = arduino
            upload_protocol = dapa
            ; each flag in a new line
            upload_flags =
                -F

       • Arduino as ISP

            [env:myenv]
            platform = atmelavr
            framework = arduino
            upload_protocol = stk500v1
            ; each flag in a new line
            upload_flags =
                -P$UPLOAD_PORT
                -b$UPLOAD_SPEED

            ; edit these lines
            upload_port = SERIAL_PORT_HERE
            upload_speed = 19200

       • Bus Pirate as ISP

            [env:myenv]
            platform = atmelavr
            framework = arduino
            upload_protocol = buspirate
            ; each flag in a new line
            upload_flags =
                -P$UPLOAD_PORT
                -b$UPLOAD_SPEED

            ; edit these lines
            upload_port = SERIAL_PORT_HERE
            upload_speed = 115200

   Upload EEPROM data
       To upload EEPROM data (from EEMEM directive)  you  need  to  use  uploadeep  target  instead  upload  for
       platformio run --target command.  For example, platformio run -t uploadeep.

   Fuses programming
       PlatformIO  has a built-in target named fuses for setting fuse bits. The default fuse bits are predefined
       in board manifest file in fuses section.  For example, fuses section for Arduino Uno board. To  set  fuse
       bits you need to use target fuses with platformio run --target command.

   Custom fuses
       Custom  fuse values and upload flags (based on upload protocol) should be specified in projectconf. lfuse
       and hfuse bits are mandatory, efuse is optional and not supported by all targets. An example  of  setting
       custom fuses for uno board:

          [env:custom_fuses]
          platform = atmelavr
          framework = arduino
          board = uno
          upload_protocol = stk500v1
          upload_speed = 19200
          board_fuses.lfuse = 0xAA
          board_fuses.hfuse = 0xBB
          board_fuses.efuse = 0xCC
          upload_flags =
              -PCOM15
              -b$UPLOAD_SPEED
              -e

   MiniCore, MegaCore and MightyCore
       MiniCore,  MegaCore  and  MightyCore  support dynamic fuses generation. Generated values are based on the
       next parameters:

                               ┌───────────┬──────────────────────────────┬───────────────┐
                               │Parameter  │ Description                  │ Default value │
                               ├───────────┼──────────────────────────────┼───────────────┤
                               │f_cpu      │ Specifies     the      clock │ 16000000L     │
                               │           │ frequencies  in  Hz. Used to │               │
                               │           │ determine  what   oscillator │               │
                               │           │ option  to choose. A capital │               │
                               │           │ L has to be added to the end │               │
                               │           │ of the frequency number.     │               │
                               ├───────────┼──────────────────────────────┼───────────────┤
                               │oscillator │ Specifies  which  oscillator │ external      │
                               │           │ is    used    internal    or │               │
                               │           │ external.           Internal │               │
                               │           │ oscillator only  works  with │               │
                               │           │ f_cpu  values  8000000L  and │               │
                               │           │ 1000000L                     │               │
                               ├───────────┼──────────────────────────────┼───────────────┤
                               │uart       │ Specifies the hardware  UART │ uart0         │
                               │           │ port used for serial upload. │               │
                               │           │ can be uart0,  uart1,  uart2 │               │
                               │           │ or  uart3  depending  on the │               │
                               │           │ target. Use no_bootloader if │               │
                               │           │ you're     not    using    a │               │
                               │           │ bootloader    for     serial │               │
                               │           │ upload.                      │               │
                               ├───────────┼──────────────────────────────┼───────────────┤
                               │bod        │ Specifies    the    hardware │ 2.7v          │
                               │           │ brown-out   detection.   Use │               │
                               │           │ disabled      to     disable │               │
                               │           │ brown-out detection.         │               │
                               ├───────────┼──────────────────────────────┼───────────────┤
                               │eesave     │ Specifies  if   the   EEPROM │ yes           │
                               │           │ memory  should  be  retained │               │
                               │           │ when   uploading   using   a │               │
                               │           │ programmer.    Use   no   to │               │
                               │           │ disable                      │               │
                               └───────────┴──────────────────────────────┴───────────────┘

       Valid BOD values:

                            ┌─────────────────────────────┬──────────────────┬───────────────┐
                            │ATmega8,   ATmega8535/16/32, │ AT90CAN32/64/128 │ Other targets │
                            │ATmega64/128                 │                  │               │
                            ├─────────────────────────────┼──────────────────┼───────────────┤
                            │4.0v                         │ 4.1v             │ 4.3v          │
                            ├─────────────────────────────┼──────────────────┼───────────────┤
                            │2.7v                         │ 4.0v             │ 2.7v          │
                            ├─────────────────────────────┼──────────────────┼───────────────┤
                            │disabled                     │ 3.9v             │ 1.8v          │
                            ├─────────────────────────────┼──────────────────┼───────────────┤
                            │                             │ 3.8v             │ disabled      │
                            ├─────────────────────────────┼──────────────────┼───────────────┤
                            │                             │ 2.7v             │               │
                            ├─────────────────────────────┼──────────────────┼───────────────┤
                            │                             │ 2.6v             │               │
                            ├─────────────────────────────┼──────────────────┼───────────────┤
                            │                             │ 2.5v             │               │
                            └─────────────────────────────┴──────────────────┴───────────────┘

                            │                             │ disabled         │               │
                            └─────────────────────────────┴──────────────────┴───────────────┘

       Hardware configuration example:

          [env:custom_fuses]
          platform = atmelavr
          framework = arduino
          board = ATmega32

          board_build.f_cpu = 1000000L
          board_hardware.uart = uart0
          board_hardware.oscillator = internal
          board_hardware.bod = 2.7v
          board_hardware.eesave = no

          upload_protocol = usbasp
          upload_flags =
            -Pusb

   Bootloader programming
       PlatformIO  has a built-in target named bootloader for flashing bootloaders. The default bootloader image
       and corresponding fuse bits are predefined in board manifest file in  bootloader  section,  for  example,
       Arduino  Uno.  To  upload bootloader image you need to use target bootloader with platformio run --target
       command.

   Custom bootloader
       Custom bootloader  and  corresponding  fuses  should  be  specified  in  projectconf.  If  lock_bits  and
       unlock_bits are not set then the default values 0x0F and 0x3F are used accordingly. An example of setting
       custom bootloader for uno board:

          [env:uno]
          platform = atmelavr
          framework = arduino
          board = uno

          board_bootloader.file = /path/to/custom/bootloader.hex
          board_bootloader.lfuse = 0xFF
          board_bootloader.hfuse = 0xDE
          board_bootloader.efuse = 0xFD
          board_bootloader.lock_bits = 0x0F
          board_bootloader.unlock_bits = 0x3F

       MiniCore, MegaCore and MightyCore have a wide variety of precompiled bootloaders.  Bootloader  binary  is
       dynamically selected according to the hardware parameters: f_cpu, oscillator, upload_speed:

                                      ┌──────────┬───────────────────┬──────────────┐
                                      │Frequency │ Oscillator        │ Upload Speed │
                                      ├──────────┼───────────────────┼──────────────┤
                                      │20000000L │ external          │ 115200       │
                                      ├──────────┼───────────────────┼──────────────┤
                                      │18432000L │ external          │ 115200       │
                                      ├──────────┼───────────────────┼──────────────┤
                                      │16000000L │ external          │ 115200       │
                                      ├──────────┼───────────────────┼──────────────┤
                                      │14745600L │ external          │ 115200       │
                                      ├──────────┼───────────────────┼──────────────┤
                                      │12000000L │ external          │ 57600        │
                                      ├──────────┼───────────────────┼──────────────┤
                                      │11059200L │ external          │ 115200       │
                                      ├──────────┼───────────────────┼──────────────┤
                                      │8000000L  │ external/internal │ 57600/38400  │
                                      ├──────────┼───────────────────┼──────────────┤
                                      │7372800L  │ external          │ 115200       │
                                      ├──────────┼───────────────────┼──────────────┤
                                      │3686400L  │ external          │ 115200       │
                                      ├──────────┼───────────────────┼──────────────┤
                                      │1843200L  │ external          │ 115200       │
                                      ├──────────┼───────────────────┼──────────────┤
                                      │1000000L  │ external/internal │ 9600         │
                                      └──────────┴───────────────────┴──────────────┘

   Examples
       Examples are listed from Atmel AVR development platform repository:

       • arduino-blinksimba-blinknative-blinkarduino-own-src_direngduino-magnetometerdigitstump-mousearduino-internal-libsarduino-external-libs

   Debugging
       piodebug - "1-click" solution for debugging with a zero configuration.

       • Tools & Debug ProbesOn-Board Debug Tools

   Tools & Debug Probes
       Supported  debugging  tools  are  listed  in "Debug" column. For more detailed information, please scroll
       table by horizontal.  You can  switch  between  debugging  debugging_tools  using  projectconf_debug_tool
       option in projectconf.

       WARNING:
          You  will  need  to  install  debug tool drivers depending on your system.  Please click on compatible
          debug tool below for the further instructions.

   On-Board Debug Tools
       Boards listed below have on-board debug probe and ARE READY for debugging!  You do not  need  to  use/buy
       external debug probe.

             ┌───────────────────────────────────────────┬───────────────┬───────────┬──────────┬────────┐
             │Name                                       │ MCU           │ Frequency │ Flash    │ RAM    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_ATmega128                   │ ATMEGA128     │ 16MHz     │ 127KB    │ 4KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_ATmega1280                  │ ATMEGA1280    │ 16MHz     │ 127KB    │ 8KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_ATmega1281                  │ ATMEGA1281    │ 16MHz     │ 127KB    │ 8KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_ATmega1284                  │ ATMEGA1284    │ 16MHz     │ 127KB    │ 16KB   │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_ATmega1284P                 │ ATMEGA1284P   │ 16MHz     │ 127KB    │ 16KB   │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_ATmega16                    │ ATMEGA16      │ 16MHz     │ 15.50KB  │ 1KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_ATmega164P                  │ ATMEGA164P    │ 16MHz     │ 15.50KB  │ 1KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_ATmega168                   │ ATMEGA168     │ 16MHz     │ 15.50KB  │ 1KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_ATmega168P                  │ ATMEGA168P    │ 16MHz     │ 15.50KB  │ 1KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_ATmega2560                  │ ATMEGA2560    │ 16MHz     │ 255KB    │ 8KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_ATmega324A                  │ ATMEGA324A    │ 16MHz     │ 31.50KB  │ 2KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_ATmega324P                  │ ATMEGA324P    │ 16MHz     │ 31.50KB  │ 2KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_ATmega324PA                 │ ATMEGA324PA   │ 16MHz     │ 31.50KB  │ 2KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_ATmega328                   │ ATMEGA328     │ 16MHz     │ 31.50KB  │ 2KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_ATmega328P                  │ ATMEGA328P    │ 16MHz     │ 31.50KB  │ 2KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_ATmega48                    │ ATMEGA48      │ 16MHz     │ 4KB      │ 512B   │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_ATmega644P                  │ ATMEGA644P    │ 16MHz     │ 63KB     │ 4KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_ATmega8                     │ ATMEGA8       │ 16MHz     │ 7.50KB   │ 1KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_ATmega88                    │ ATMEGA88      │ 16MHz     │ 7.50KB   │ 1KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_ATmega88P                   │ ATMEGA88P     │ 16MHz     │ 7.50KB   │ 1KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_ATmega48P                   │ ATMEGA48P     │ 16MHz     │ 4KB      │ 512B   │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_bluefruitmicro              │ ATMEGA32U4    │ 8MHz      │ 28KB     │ 2.50KB │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_circuitplay_classic         │ ATMEGA32U4    │ 8MHz      │ 28KB     │ 2.50KB │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_feather328p                 │ ATMEGA328P    │ 8MHz      │ 31.50KB  │ 2KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_feather32u4                 │ ATMEGA32U4    │ 8MHz      │ 28KB     │ 2.50KB │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_flora8                      │ ATMEGA32U4    │ 8MHz      │ 28KB     │ 2.50KB │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_gemma                       │ ATTINY85      │ 8MHz      │ 8KB      │ 512B   │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_itsybitsy32u4_3V            │ ATMEGA32U4    │ 8MHz      │ 28KB     │ 2.50KB │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_itsybitsy32u4_5V            │ ATMEGA32U4    │ 16MHz     │ 28KB     │ 2.50KB │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_metro                       │ ATMEGA328P    │ 16MHz     │ 31.50KB  │ 2KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_protrinket3ftdi             │ ATMEGA328P    │ 12MHz     │ 28KB     │ 2KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_protrinket3                 │ ATMEGA328P    │ 12MHz     │ 28KB     │ 2KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_protrinket5ftdi             │ ATMEGA328P    │ 16MHz     │ 28KB     │ 2KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_protrinket5                 │ ATMEGA328P    │ 16MHz     │ 28KB     │ 2KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_trinket3                    │ ATTINY85      │ 8MHz      │ 8KB      │ 512B   │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_trinket5                    │ ATTINY85      │ 16MHz     │ 8KB      │ 512B   │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_alorium_hinj                │ ATMEGA328P    │ 16MHz     │ 31.50KB  │ 2KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_alorium_sno                 │ ATMEGA328P    │ 16MHz     │ 31.50KB  │ 2KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_alorium_xlr8                │ ATMEGA328P    │ 16MHz     │ 31.50KB  │ 2KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_miniwireless                │ ATMEGA328P    │ 16MHz     │ 31.50KB  │ 2KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_arduboy                     │ ATMEGA32U4    │ 16MHz     │ 28KB     │ 2.50KB │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_arduboy_devkit              │ ATMEGA32U4    │ 16MHz     │ 28KB     │ 2.50KB │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_btatmega168                 │ ATMEGA168     │ 16MHz     │ 14KB     │ 1KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_btatmega328                 │ ATMEGA328P    │ 16MHz     │ 28KB     │ 2KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_diecimilaatmega168          │ ATMEGA168     │ 16MHz     │ 14KB     │ 1KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_diecimilaatmega328          │ ATMEGA328P    │ 16MHz     │ 30KB     │ 2KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_esplora                     │ ATMEGA32U4    │ 16MHz     │ 28KB     │ 2.50KB │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_ethernet                    │ ATMEGA328P    │ 16MHz     │ 31.50KB  │ 2KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_fio                         │ ATMEGA328P    │ 8MHz      │ 30KB     │ 2KB    │
             └───────────────────────────────────────────┴───────────────┴───────────┴──────────┴────────┘

             │board_atmelavr_chiwawa                     │ ATMEGA32U4    │ 16MHz     │ 28KB     │ 2.50KB │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_leonardo                    │ ATMEGA32U4    │ 16MHz     │ 28KB     │ 2.50KB │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_leonardoeth                 │ ATMEGA32U4    │ 16MHz     │ 28KB     │ 2.50KB │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_lilypadatmega168            │ ATMEGA168     │ 8MHz      │ 14KB     │ 1KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_lilypadatmega328            │ ATMEGA328P    │ 8MHz      │ 30KB     │ 2KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_LilyPadUSB                  │ ATMEGA32U4    │ 8MHz      │ 28KB     │ 2.50KB │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_megaADK                     │ ATMEGA2560    │ 16MHz     │ 248KB    │ 8KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_megaatmega1280              │ ATMEGA1280    │ 16MHz     │ 124KB    │ 8KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_megaatmega2560              │ ATMEGA2560    │ 16MHz     │ 248KB    │ 8KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_micro                       │ ATMEGA32U4    │ 16MHz     │ 28KB     │ 2.50KB │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_miniatmega168               │ ATMEGA168     │ 16MHz     │ 14KB     │ 1KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_miniatmega328               │ ATMEGA328P    │ 16MHz     │ 28KB     │ 2KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_atmegangatmega168           │ ATMEGA168     │ 16MHz     │ 14KB     │ 1KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_atmegangatmega8             │ ATMEGA8       │ 16MHz     │ 7KB      │ 1KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_nanoatmega168               │ ATMEGA168     │ 16MHz     │ 14KB     │ 1KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_nanoatmega328               │ ATMEGA328P    │ 16MHz     │ 30KB     │ 2KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_nanoatmega328new            │ ATMEGA328P    │ 16MHz     │ 30KB     │ 2KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_pro8MHzatmega168            │ ATMEGA168     │ 8MHz      │ 14KB     │ 1KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_pro16MHzatmega168           │ ATMEGA168     │ 16MHz     │ 14KB     │ 1KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_pro8MHzatmega328            │ ATMEGA328P    │ 8MHz      │ 30KB     │ 2KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_pro16MHzatmega328           │ ATMEGA328P    │ 16MHz     │ 30KB     │ 2KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_robotControl                │ ATMEGA32U4    │ 16MHz     │ 28KB     │ 2.50KB │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_robotMotor                  │ ATMEGA32U4    │ 16MHz     │ 28KB     │ 2.50KB │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_uno                         │ ATMEGA328P    │ 16MHz     │ 31.50KB  │ 2KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_yun                         │ ATMEGA32U4    │ 16MHz     │ 28KB     │ 2.50KB │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_yunmini                     │ ATMEGA32U4    │ 16MHz     │ 28KB     │ 2.50KB │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_zumbt328                    │ ATMEGA328P    │ 16MHz     │ 28KB     │ 2KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_raspduino                   │ ATMEGA328P    │ 16MHz     │ 30KB     │ 2KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_controllino_maxi            │ ATMEGA2560    │ 16MHz     │ 248KB    │ 8KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_controllino_maxi_automation │ ATMEGA2560    │ 16MHz     │ 248KB    │ 8KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_controllino_mega            │ ATMEGA2560    │ 16MHz     │ 248KB    │ 8KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_controllino_mini            │ ATMEGA328P    │ 16MHz     │ 31.50KB  │ 2KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_digispark-tiny              │ ATTINY85      │ 16MHz     │ 5.87KB   │ 512B   │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_engduinov3                  │ ATMEGA32U4    │ 8MHz      │ 28KB     │ 2.50KB │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_mayfly                      │ ATMEGA1284P   │ 8MHz      │ 127KB    │ 16KB   │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_fysetc_f6_13                │ ATMEGA2560    │ 16MHz     │ 252KB    │ 8KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_attiny13                    │ ATTINY13      │ 1MHz      │ 1KB      │ 64B    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_attiny13a                   │ ATTINY13A     │ 1MHz      │ 1KB      │ 64B    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_attiny2313                  │ ATTINY2313    │ 8MHz      │ 2KB      │ 128B   │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_attiny24                    │ ATTINY24      │ 8MHz      │ 2KB      │ 128B   │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_attiny25                    │ ATTINY25      │ 8MHz      │ 2KB      │ 128B   │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_attiny4313                  │ ATTINY4313    │ 8MHz      │ 4KB      │ 256B   │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_attiny44                    │ ATTINY44      │ 8MHz      │ 4KB      │ 256B   │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_attiny45                    │ ATTINY45      │ 8MHz      │ 4KB      │ 256B   │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_attiny84                    │ ATTINY84      │ 8MHz      │ 8KB      │ 512B   │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_attiny85                    │ ATTINY85      │ 8MHz      │ 8KB      │ 512B   │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_lightblue-bean              │ ATMEGA328P    │ 8MHz      │ 31.50KB  │ 2KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_lightblue-beanplus          │ ATMEGA328P    │ 16MHz     │ 31.50KB  │ 2KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_lightup                     │ ATMEGA32U4    │ 8MHz      │ 28KB     │ 2.50KB │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_one                         │ ATMEGA32U4    │ 16MHz     │ 28KB     │ 2.50KB │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_smart7688                   │ ATMEGA32U4    │ 8MHz      │ 28KB     │ 2.50KB │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_lora32u4II                  │ ATMEGA32U4    │ 8MHz      │ 28KB     │ 2.50KB │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_mightyhat                   │ ATMEGA328P    │ 16MHz     │ 31KB     │ 2KB    │
             └───────────────────────────────────────────┴───────────────┴───────────┴──────────┴────────┘

             │board_atmelavr_moteino                     │ ATMEGA328P    │ 16MHz     │ 31.50KB  │ 2KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_moteino8mhz                 │ ATMEGA328P    │ 8MHz      │ 31.50KB  │ 2KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_moteinomega                 │ ATMEGA1284P   │ 16MHz     │ 127KB    │ 16KB   │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_168pa16m                    │ ATMEGA168P    │ 16MHz     │ 15.50KB  │ 1KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_168pa8m                     │ ATMEGA168P    │ 8MHz      │ 15.50KB  │ 1KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_328p16m                     │ ATMEGA328P    │ 16MHz     │ 31.50KB  │ 2KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_328p8m                      │ ATMEGA328P    │ 8MHz      │ 31.50KB  │ 2KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_32u416m                     │ ATMEGA32U4    │ 16MHz     │ 28KB     │ 2.50KB │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_1284p16m                    │ ATMEGA1284P   │ 16MHz     │ 127KB    │ 16KB   │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_1284p8m                     │ ATMEGA1284P   │ 8MHz      │ 127KB    │ 16KB   │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_644pa16m                    │ ATMEGA644P    │ 16MHz     │ 63KB     │ 4KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_644pa8m                     │ ATMEGA644P    │ 8MHz      │ 63KB     │ 4KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_emonpi                      │ ATMEGA328P    │ 16MHz     │ 30KB     │ 2KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_prusa_mm_control            │ ATMEGA32U4    │ 16MHz     │ 28KB     │ 2.50KB │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_panStampAVR                 │ ATMEGA328P    │ 8MHz      │ 31.50KB  │ 2KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_a-star32U4                  │ ATMEGA32U4    │ 16MHz     │ 28KB     │ 2.50KB │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_prusa_rambo                 │ ATMEGA2560    │ 16MHz     │ 252KB    │ 8KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_quirkbot                    │ ATMEGA32U4    │ 8MHz      │ 28KB     │ 2.50KB │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_blend                       │ ATMEGA32U4    │ 16MHz     │ 28KB     │ 2.50KB │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_blendmicro16                │ ATMEGA32U4    │ 16MHz     │ 28KB     │ 2.50KB │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_blendmicro8                 │ ATMEGA32U4    │ 8MHz      │ 28KB     │ 2.50KB │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_reprap_rambo                │ ATMEGA2560    │ 16MHz     │ 252KB    │ 8KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_sodaq_galora                │ ATMEGA1284P   │ 8MHz      │ 127KB    │ 16KB   │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_sodaq_mbili                 │ ATMEGA1284P   │ 8MHz      │ 127KB    │ 16KB   │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_sodaq_moja                  │ ATMEGA328P    │ 8MHz      │ 31.50KB  │ 2KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_sodaq_ndogo                 │ ATMEGA1284P   │ 8MHz      │ 127KB    │ 16KB   │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_sodaq_tatu                  │ ATMEGA1284P   │ 8MHz      │ 127KB    │ 16KB   │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_sanguino_atmega1284p        │ ATMEGA1284P   │ 16MHz     │ 127KB    │ 16KB   │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_sanguino_atmega1284_8m      │ ATMEGA1284P   │ 8MHz      │ 127KB    │ 16KB   │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_sanguino_atmega644          │ ATMEGA644     │ 16MHz     │ 63KB     │ 4KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_sanguino_atmega644_8m       │ ATMEGA644     │ 8MHz      │ 63KB     │ 4KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_sanguino_atmega644p         │ ATMEGA644P    │ 16MHz     │ 63KB     │ 4KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_sanguino_atmega644p_8m      │ ATMEGA644P    │ 8MHz      │ 63KB     │ 4KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_seeeduino                   │ ATMEGA328P    │ 16MHz     │ 31.50KB  │ 2KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_sparkfun_satmega128rfa1     │ ATMEGA128RFA1 │ 16MHz     │ 16KB     │ 124KB  │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_sparkfun_digitalsandbox     │ ATMEGA328P    │ 8MHz      │ 31.50KB  │ 2KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_sparkfun_fiov3              │ ATMEGA32U4    │ 8MHz      │ 28KB     │ 2.50KB │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_sparkfun_makeymakey         │ ATMEGA32U4    │ 16MHz     │ 28KB     │ 2.50KB │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_sparkfun_megapro8MHz        │ ATMEGA2560    │ 8MHz      │ 252KB    │ 8KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_sparkfun_megapro16MHz       │ ATMEGA2560    │ 16MHz     │ 248KB    │ 8KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_sparkfun_megamini           │ ATMEGA2560    │ 8MHz      │ 252KB    │ 8KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_uview                       │ ATMEGA328P    │ 16MHz     │ 31.50KB  │ 2KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_sparkfun_promicro8          │ ATMEGA32U4    │ 8MHz      │ 28KB     │ 2.50KB │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_sparkfun_promicro16         │ ATMEGA32U4    │ 16MHz     │ 28KB     │ 2.50KB │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_sparkfun_qduinomini         │ ATMEGA32U4    │ 8MHz      │ 28KB     │ 2.50KB │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_sparkfun_redboard           │ ATMEGA328P    │ 16MHz     │ 31.50KB  │ 2KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_sparkfun_serial7seg         │ ATMEGA328P    │ 8MHz      │ 31.50KB  │ 2KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_sleepypi                    │ ATMEGA328P    │ 8MHz      │ 30KB     │ 2KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_whispernode                 │ ATMEGA328P    │ 16MHz     │ 31.50KB  │ 2KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_the_things_uno              │ ATMEGA32U4    │ 16MHz     │ 28KB     │ 2.50KB │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_tinyduino                   │ ATMEGA328P    │ 8MHz      │ 30KB     │ 2KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_tinylily                    │ ATMEGA328P    │ 8MHz      │ 30KB     │ 2KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_usbasp                      │ ATMEGA8       │ 12MHz     │ 8KB      │ 1KB    │
             └───────────────────────────────────────────┴───────────────┴───────────┴──────────┴────────┘

             │board_atmelavr_wildfirev2                  │ ATMEGA1284P   │ 16MHz     │ 120.00KB │ 16KB   │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_wildfirev3                  │ ATMEGA1284P   │ 16MHz     │ 127KB    │ 16KB   │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_ftduino                     │ ATMEGA32U4    │ 16MHz     │ 28KB     │ 2.50KB │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_bob3                        │ ATMEGA88      │ 8MHz      │ 8KB      │ 1KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_nibo2                       │ ATMEGA128     │ 16MHz     │ 128KB    │ 4KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_niboburger                  │ ATMEGA16      │ 15MHz     │ 16KB     │ 1KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_niboburger_1284             │ ATMEGA1284P   │ 20MHz     │ 128KB    │ 16KB   │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_nibobee                     │ ATMEGA16      │ 15MHz     │ 16KB     │ 1KB    │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_nibobee_1284                │ ATMEGA1284P   │ 20MHz     │ 128KB    │ 16KB   │
             ├───────────────────────────────────────────┼───────────────┼───────────┼──────────┼────────┤
             │board_atmelavr_ardhat                      │ ATMEGA328P    │ 16MHz     │ 31.50KB  │ 2KB    │
             └───────────────────────────────────────────┴───────────────┴───────────┴──────────┴────────┘

   Stable and upstream versions
       You  can switch between stable releases of Atmel AVR development platform and the latest upstream version
       using projectconf_env_platform option in projectconf as described below.

   Stable
          ; Latest stable version
          [env:latest_stable]
          platform = atmelavr
          board = ...

          ; Custom stable version
          [env:custom_stable]
          platform = atmelavr@x.y.z
          board = ...

   Upstream
          [env:upstream_develop]
          platform = https://github.com/platformio/platform-atmelavr.git
          board = ...

   Packages
                      ┌──────────────────────────────────┬───────────────────────────────────────┐
                      │Name                              │ Description                           │
                      ├──────────────────────────────────┼───────────────────────────────────────┤
                      │framework-arduino-avr             │ Arduino Wiring-based  Framework  (AVR │
                      │                                  │ Core)                                 │
                      ├──────────────────────────────────┼───────────────────────────────────────┤
                      │framework-arduino-avr-attiny      │ Arduino     Wiring-based    Framework │
                      │                                  │ (ATTiny Core)                         │
                      ├──────────────────────────────────┼───────────────────────────────────────┤
                      │framework-arduino-avr-bean        │ Arduino Wiring-based Framework  (Bean │
                      │                                  │ Core)                                 │
                      ├──────────────────────────────────┼───────────────────────────────────────┤
                      │framework-arduino-avr-core13      │ Arduino     Wiring-based    Framework │
                      │                                  │ (Core13)                              │
                      ├──────────────────────────────────┼───────────────────────────────────────┤
                      │framework-arduino-avr-digistump   │ Arduino    Wiring-based     Framework │
                      │                                  │ (Digistump Core)                      │
                      ├──────────────────────────────────┼───────────────────────────────────────┤
                      │framework-arduino-avr-dwenguino   │ Arduino     Wiring-based    Framework │
                      │                                  │ (Dwenguino Core)                      │
                      ├──────────────────────────────────┼───────────────────────────────────────┤
                      │framework-arduino-avr-majorcore   │ Arduino Wiring-based Framework (Major │
                      │                                  │ Core)                                 │
                      ├──────────────────────────────────┼───────────────────────────────────────┤
                      │framework-arduino-avr-megacore    │ Arduino     Wiring-based    Framework │
                      │                                  │ (MegaCore)                            │
                      ├──────────────────────────────────┼───────────────────────────────────────┤
                      │framework-arduino-avr-mightycore  │ Arduino    Wiring-based     Framework │
                      │                                  │ (MightyCore)                          │
                      ├──────────────────────────────────┼───────────────────────────────────────┤
                      │framework-arduino-avr-minicore    │ Arduino     Wiring-based    Framework │
                      │                                  │ (MiniCore)                            │
                      ├──────────────────────────────────┼───────────────────────────────────────┤
                      │framework-arduino-avr-nicai       │ Arduino Wiring-based Framework (Nicai │
                      │                                  │ Core)                                 │
                      ├──────────────────────────────────┼───────────────────────────────────────┤
                      │framework-arduino-avr-panstamp    │ Arduino     Wiring-based    Framework │
                      │                                  │ (Panstamp Core)                       │
                      ├──────────────────────────────────┼───────────────────────────────────────┤
                      │framework-arduino-avr-prusa_rambo │ Arduino Wiring-based Framework (Prusa │
                      │                                  │ Rambo Core)                           │
                      ├──────────────────────────────────┼───────────────────────────────────────┤
                      │framework-simba                   │ Simba Framework                       │
                      ├──────────────────────────────────┼───────────────────────────────────────┤
                      │tool-avrdude                      │ AVRDUDE                               │
                      ├──────────────────────────────────┼───────────────────────────────────────┤
                      │tool-micronucleus                 │ Micronucleus                          │
                      ├──────────────────────────────────┼───────────────────────────────────────┤
                      │tool-simavr                       │ simavr  is  a lean, mean and hackable │
                      │                                  │ AVR simulator                         │
                      ├──────────────────────────────────┼───────────────────────────────────────┤
                      │toolchain-atmelavr                │ avr-gcc                               │
                      └──────────────────────────────────┴───────────────────────────────────────┘

       WARNING:
          Linux Users:

              • Install "udev" rules faq_udev_rules

              • Raspberry Pi users, please read this article Enable serial port on Raspberry Pi.

          Windows Users:
              Please check that you have a correctly installed USB driver from board manufacturer

   Frameworks
                              ────────────────────────────────────────────────────────────
                               Name                Description
                              ────────────────────────────────────────────────────────────
                               framework_arduino   Arduino Wiring-based Framework allows
                                                   writing  cross-platform  software  to
                                                   control devices attached  to  a  wide
                                                   range of Arduino boards to create all
                                                   kinds of creative coding, interactive
                                                   objects,     spaces    or    physical
                                                   experiences.
                              ────────────────────────────────────────────────────────────
                               framework_simba     Simba is an RTOS and build framework.
                                                   It  aims to make embedded programming
                                                   easy and portable.
                              ┌──────────────────┬───────────────────────────────────────┐
                              │                  │                                       │
   Boards                     │                  │                                       │
       NOTE:                  │                  │                                       │
                              │                  │                                       │
--

AUTHOR

       PlatformIO

COPYRIGHT

       2014-present, PlatformIO