How to structure project with multiple boards with different tasks

I want to create a project that will use multiple micro controllers. One will handle some button inputs (let’s call it Slave), and send the info about pressed buttons to the other micro controller (call it Master.
It would be nice if I can set this up in one project, so I don’t need keep two windows of VSCode open.

So I want to have

src/
  mainMaster.cpp
  mainSlave.cpp
  otherFiles.h
  otherFiles.cpp

How do I need to configure my platformio.ini such that mainMaster.cpp will only be compiled and uploaded to the Master, and mainSlave.cpp will only be compiled and uploaded to the Slave?

Current platformio.ini:

[env:nanomaster]
platform = atmelavr
board = nanoatmega328new
framework = arduino
upload_protocol = arduino
upload_port = COM7
monitor_port = ${env:nanomaster.upload_port}
monitor_speed = 115200

[env:nanoslave]
platform = atmelavr
board = nanoatmega328new
framework = arduino
upload_protocol = arduino
upload_port = COM8
monitor_port = ${env:nanoslave.upload_port}
monitor_speed = 115200
2 Likes

See documentation for src_filter.

2 Likes

So like this?

; default src_filter
[env]
src_filter = +<*> -<.git/> -<.svn/> -<example/> -<examples/> -<test/> -<tests/>

[env:nanomaster]
platform = atmelavr
board = nanoatmega328new
framework = arduino
upload_protocol = arduino
upload_port = COM7
monitor_port = ${env:nanomaster.upload_port}
monitor_speed = 115200
src_filter = ${env.src_filter} -<mainSlave.cpp> ; exclude the slave cpp file

[env:nanoslave]
platform = atmelavr
board = nanoatmega328new
framework = arduino
upload_protocol = arduino
upload_port = COM8
monitor_port = ${env:nanoslave.upload_port}
monitor_speed = 115200
src_filter = ${env.src_filter} -<mainMaster.cpp> ; exclude the main cpp file

Exactly, that’s how it works for me too. Recreating your dummy project with mainSlave.cpp and mainMaster.cpp you can see that for the specific environments, only one of the main files is compiled in.

$ pio run
Processing nanomaster (platform: atmelavr; board: nanoatmega328new; framework: arduino)
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Verbose mode can be enabled via `-v, --verbose` option
CONFIGURATION: https://docs.platformio.org/page/boards/atmelavr/nanoatmega328new.html
PLATFORM: Atmel AVR 2.0.0 > Arduino Nano ATmega328 (New Bootloader)
HARDWARE: ATMEGA328P 16MHz, 2KB RAM, 30KB Flash
PACKAGES: 
 - framework-arduino-avr 5.0.0 
 - toolchain-atmelavr 1.50400.190710 (5.4.0)
LDF: Library Dependency Finder -> http://bit.ly/configure-pio-ldf
LDF Modes: Finder ~ chain, Compatibility ~ soft
Found 6 compatible libraries
Scanning dependencies...
No dependencies
Building in release mode
Compiling .pio/build/nanomaster/src/mainMaster.cpp.o
Archiving .pio/build/nanomaster/libFrameworkArduinoVariant.a
Compiling .pio/build/nanomaster/FrameworkArduino/CDC.cpp.o
Indexing .pio/build/nanomaster/libFrameworkArduinoVariant.a
Compiling .pio/build/nanomaster/FrameworkArduino/HardwareSerial.cpp.o
Compiling .pio/build/nanomaster/FrameworkArduino/HardwareSerial0.cpp.o
Compiling .pio/build/nanomaster/FrameworkArduino/HardwareSerial1.cpp.o
Compiling .pio/build/nanomaster/FrameworkArduino/HardwareSerial2.cpp.o
Compiling .pio/build/nanomaster/FrameworkArduino/HardwareSerial3.cpp.o
Compiling .pio/build/nanomaster/FrameworkArduino/IPAddress.cpp.o
Compiling .pio/build/nanomaster/FrameworkArduino/PluggableUSB.cpp.o
Compiling .pio/build/nanomaster/FrameworkArduino/Print.cpp.o
Compiling .pio/build/nanomaster/FrameworkArduino/Stream.cpp.o
Compiling .pio/build/nanomaster/FrameworkArduino/Tone.cpp.o
Compiling .pio/build/nanomaster/FrameworkArduino/USBCore.cpp.o
Compiling .pio/build/nanomaster/FrameworkArduino/WInterrupts.c.o
Compiling .pio/build/nanomaster/FrameworkArduino/WMath.cpp.o
Compiling .pio/build/nanomaster/FrameworkArduino/WString.cpp.o
Compiling .pio/build/nanomaster/FrameworkArduino/abi.cpp.o
Compiling .pio/build/nanomaster/FrameworkArduino/hooks.c.o
Compiling .pio/build/nanomaster/FrameworkArduino/main.cpp.o
Compiling .pio/build/nanomaster/FrameworkArduino/new.cpp.o
Compiling .pio/build/nanomaster/FrameworkArduino/wiring.c.o
Compiling .pio/build/nanomaster/FrameworkArduino/wiring_analog.c.o
Compiling .pio/build/nanomaster/FrameworkArduino/wiring_digital.c.o
Compiling .pio/build/nanomaster/FrameworkArduino/wiring_pulse.S.o
Compiling .pio/build/nanomaster/FrameworkArduino/wiring_pulse.c.o
Compiling .pio/build/nanomaster/FrameworkArduino/wiring_shift.c.o
Archiving .pio/build/nanomaster/libFrameworkArduino.a
Indexing .pio/build/nanomaster/libFrameworkArduino.a
Linking .pio/build/nanomaster/firmware.elf
Checking size .pio/build/nanomaster/firmware.elf
Building .pio/build/nanomaster/firmware.hex
Advanced Memory Usage is available via "PlatformIO Home > Project Inspect"
RAM:   [          ]   0.4% (used 9 bytes from 2048 bytes)
Flash: [          ]   1.4% (used 444 bytes from 30720 bytes)
============================================================================================ [SUCCESS] Took 1.49 seconds ============================================================================================

Processing nanoslave (platform: atmelavr; board: nanoatmega328new; framework: arduino)
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Verbose mode can be enabled via `-v, --verbose` option
CONFIGURATION: https://docs.platformio.org/page/boards/atmelavr/nanoatmega328new.html
PLATFORM: Atmel AVR 2.0.0 > Arduino Nano ATmega328 (New Bootloader)
HARDWARE: ATMEGA328P 16MHz, 2KB RAM, 30KB Flash
PACKAGES: 
 - framework-arduino-avr 5.0.0 
 - toolchain-atmelavr 1.50400.190710 (5.4.0)
LDF: Library Dependency Finder -> http://bit.ly/configure-pio-ldf
LDF Modes: Finder ~ chain, Compatibility ~ soft
Found 6 compatible libraries
Scanning dependencies...
No dependencies
Building in release mode
Compiling .pio/build/nanoslave/src/mainSlave.cpp.o
Archiving .pio/build/nanoslave/libFrameworkArduinoVariant.a
Indexing .pio/build/nanoslave/libFrameworkArduinoVariant.a
Compiling .pio/build/nanoslave/FrameworkArduino/CDC.cpp.o
Compiling .pio/build/nanoslave/FrameworkArduino/HardwareSerial.cpp.o
Compiling .pio/build/nanoslave/FrameworkArduino/HardwareSerial0.cpp.o
Compiling .pio/build/nanoslave/FrameworkArduino/HardwareSerial1.cpp.o
Compiling .pio/build/nanoslave/FrameworkArduino/HardwareSerial2.cpp.o
Compiling .pio/build/nanoslave/FrameworkArduino/HardwareSerial3.cpp.o
Compiling .pio/build/nanoslave/FrameworkArduino/IPAddress.cpp.o
Compiling .pio/build/nanoslave/FrameworkArduino/PluggableUSB.cpp.o
Compiling .pio/build/nanoslave/FrameworkArduino/Print.cpp.o
Compiling .pio/build/nanoslave/FrameworkArduino/Stream.cpp.o
Compiling .pio/build/nanoslave/FrameworkArduino/Tone.cpp.o
Compiling .pio/build/nanoslave/FrameworkArduino/USBCore.cpp.o
Compiling .pio/build/nanoslave/FrameworkArduino/WInterrupts.c.o
Compiling .pio/build/nanoslave/FrameworkArduino/WMath.cpp.o
Compiling .pio/build/nanoslave/FrameworkArduino/WString.cpp.o
Compiling .pio/build/nanoslave/FrameworkArduino/abi.cpp.o
Compiling .pio/build/nanoslave/FrameworkArduino/hooks.c.o
Compiling .pio/build/nanoslave/FrameworkArduino/main.cpp.o
Compiling .pio/build/nanoslave/FrameworkArduino/new.cpp.o
Compiling .pio/build/nanoslave/FrameworkArduino/wiring.c.o
Compiling .pio/build/nanoslave/FrameworkArduino/wiring_analog.c.o
Compiling .pio/build/nanoslave/FrameworkArduino/wiring_digital.c.o
Compiling .pio/build/nanoslave/FrameworkArduino/wiring_pulse.S.o
Compiling .pio/build/nanoslave/FrameworkArduino/wiring_pulse.c.o
Compiling .pio/build/nanoslave/FrameworkArduino/wiring_shift.c.o
Archiving .pio/build/nanoslave/libFrameworkArduino.a
Indexing .pio/build/nanoslave/libFrameworkArduino.a
Linking .pio/build/nanoslave/firmware.elf
Building .pio/build/nanoslave/firmware.hex
Checking size .pio/build/nanoslave/firmware.elf
Advanced Memory Usage is available via "PlatformIO Home > Project Inspect"
RAM:   [          ]   0.4% (used 9 bytes from 2048 bytes)
Flash: [          ]   1.4% (used 444 bytes from 30720 bytes)
============================================================================================ [SUCCESS] Took 1.29 seconds ============================================================================================

Environment    Status    Duration
-------------  --------  ------------
nanomaster     SUCCESS   00:00:01.491
nanoslave      SUCCESS   00:00:01.290
============================================================================================ 2 succeeded in 00:00:02.781 ============================================================================================