Question about tabs.

I've done some research on tabs but just wanted to get confirmation that I was understanding it correctly before I made a mess.

I am about to make my first largeish program and want to split it up to make it easier to debug etc.

So if I split it over several tabs/.ino files the IDE will concentrate it into a single file when compiled.

It starts with the main file, same as the folder name, then adds other file alphabetically. So i need to make sure all my includes and global variables need to be in the first file, setup could be in the second one and loop in the third etc.etc.

Is the above correct and is there anything else I need to be aware of?

I just don't want to spend the next week writing code to find out it will never work because of how it is laid out.

Thanks.

That is the "Arduino Way". IMHO, it's brain-dead. I prefer to develop truly modular software. It can be done in the Arudino IDE. See Reply #3 Here.

i have an esp32 application composed of the following files

-rw-rw-r--+ 1 lenovo None 12342 May  9 06:28 Koala.ino
-rw-rw-r--+ 1 lenovo None  1615 May  8 14:46 file.cpp
-rw-rw-r--+ 1 lenovo None   127 May  8 14:44 file.h
-rw-rw-r--+ 1 lenovo None   385 May  5 14:56 koala.h
-rw-rw-r--+ 1 lenovo None  8558 May  8 14:44 menu.cpp
-rw-rw-r--+ 1 lenovo None  2333 May  8 10:41 menu.h
-rw-rw-r--+ 1 lenovo None  2945 May  8 10:59 menus.cpp
-rw-rw-r--+ 1 lenovo None    66 Mar 30 13:27 menus.h
-rw-rw-r--+ 1 lenovo None  6455 May  8 14:45 pcRead.cpp
-rw-rw-r--+ 1 lenovo None    65 Apr 16 17:03 pcRead.h
-rw-rw-r--+ 1 lenovo None  6486 May  8 11:03 server.cpp
-rw-rw-r--+ 1 lenovo None    92 May  4 15:20 server.h
-rw-rw-r--+ 1 lenovo None  1541 Apr 10 12:06 utils.cpp
-rw-rw-r--+ 1 lenovo None    79 Apr 10 10:40 utils.h
-rw-rw-r--+ 1 lenovo None  2041 May  8 14:47 vars.cpp
-rw-rw-r--+ 1 lenovo None   921 May  8 14:43 vars.h

this is a list of the files in the build diretory

arduino_build_965504/
arduino_build_965504/build.options.json
arduino_build_965504/core
arduino_build_965504/core/base64.cpp.d
arduino_build_965504/core/base64.cpp.o
arduino_build_965504/core/cbuf.cpp.d
arduino_build_965504/core/cbuf.cpp.o
arduino_build_965504/core/core.a
arduino_build_965504/core/Esp.cpp.d
arduino_build_965504/core/Esp.cpp.o
arduino_build_965504/core/esp32-hal-adc.c.d
arduino_build_965504/core/esp32-hal-adc.c.o
arduino_build_965504/core/esp32-hal-bt.c.d
arduino_build_965504/core/esp32-hal-bt.c.o
arduino_build_965504/core/esp32-hal-cpu.c.d
arduino_build_965504/core/esp32-hal-cpu.c.o
arduino_build_965504/core/esp32-hal-dac.c.d
arduino_build_965504/core/esp32-hal-dac.c.o
arduino_build_965504/core/esp32-hal-gpio.c.d
arduino_build_965504/core/esp32-hal-gpio.c.o
arduino_build_965504/core/esp32-hal-i2c.c.d
arduino_build_965504/core/esp32-hal-i2c.c.o
arduino_build_965504/core/esp32-hal-ledc.c.d
arduino_build_965504/core/esp32-hal-ledc.c.o
arduino_build_965504/core/esp32-hal-matrix.c.d
arduino_build_965504/core/esp32-hal-matrix.c.o
arduino_build_965504/core/esp32-hal-misc.c.d
arduino_build_965504/core/esp32-hal-misc.c.o
arduino_build_965504/core/esp32-hal-psram.c.d
arduino_build_965504/core/esp32-hal-psram.c.o
arduino_build_965504/core/esp32-hal-rmt.c.d
arduino_build_965504/core/esp32-hal-rmt.c.o
arduino_build_965504/core/esp32-hal-sigmadelta.c.d
arduino_build_965504/core/esp32-hal-sigmadelta.c.o
arduino_build_965504/core/esp32-hal-spi.c.d
arduino_build_965504/core/esp32-hal-spi.c.o
arduino_build_965504/core/esp32-hal-time.c.d
arduino_build_965504/core/esp32-hal-time.c.o
arduino_build_965504/core/esp32-hal-timer.c.d
arduino_build_965504/core/esp32-hal-timer.c.o
arduino_build_965504/core/esp32-hal-touch.c.d
arduino_build_965504/core/esp32-hal-touch.c.o
arduino_build_965504/core/esp32-hal-uart.c.d
arduino_build_965504/core/esp32-hal-uart.c.o
arduino_build_965504/core/FunctionalInterrupt.cpp.d
arduino_build_965504/core/FunctionalInterrupt.cpp.o
arduino_build_965504/core/HardwareSerial.cpp.d
arduino_build_965504/core/HardwareSerial.cpp.o
arduino_build_965504/core/IPAddress.cpp.d
arduino_build_965504/core/IPAddress.cpp.o
arduino_build_965504/core/IPv6Address.cpp.d
arduino_build_965504/core/IPv6Address.cpp.o
arduino_build_965504/core/libb64
arduino_build_965504/core/libb64/cdecode.c.d
arduino_build_965504/core/libb64/cdecode.c.o
arduino_build_965504/core/libb64/cencode.c.d
arduino_build_965504/core/libb64/cencode.c.o
arduino_build_965504/core/main.cpp.d
arduino_build_965504/core/main.cpp.o
arduino_build_965504/core/MD5Builder.cpp.d
arduino_build_965504/core/MD5Builder.cpp.o
arduino_build_965504/core/Print.cpp.d
arduino_build_965504/core/Print.cpp.o
arduino_build_965504/core/stdlib_noniso.c.d
arduino_build_965504/core/stdlib_noniso.c.o
arduino_build_965504/core/Stream.cpp.d
arduino_build_965504/core/Stream.cpp.o
arduino_build_965504/core/StreamString.cpp.d
arduino_build_965504/core/StreamString.cpp.o
arduino_build_965504/core/wiring_pulse.c.d
arduino_build_965504/core/wiring_pulse.c.o
arduino_build_965504/core/wiring_shift.c.d
arduino_build_965504/core/wiring_shift.c.o
arduino_build_965504/core/WMath.cpp.d
arduino_build_965504/core/WMath.cpp.o
arduino_build_965504/core/WString.cpp.d
arduino_build_965504/core/WString.cpp.o
arduino_build_965504/includes.cache
arduino_build_965504/Koala.ino.bin
arduino_build_965504/Koala.ino.elf
arduino_build_965504/Koala.ino.partitions.bin
arduino_build_965504/libraries
arduino_build_965504/libraries/Esp-oled-ssd1306
arduino_build_965504/libraries/Esp-oled-ssd1306/OLEDDisplay.cpp.d
arduino_build_965504/libraries/Esp-oled-ssd1306/OLEDDisplay.cpp.o
arduino_build_965504/libraries/Esp-oled-ssd1306/OLEDDisplayUi.cpp.d
arduino_build_965504/libraries/Esp-oled-ssd1306/OLEDDisplayUi.cpp.o
arduino_build_965504/libraries/FS
arduino_build_965504/libraries/FS/FS.cpp.d
arduino_build_965504/libraries/FS/FS.cpp.o
arduino_build_965504/libraries/FS/vfs_api.cpp.d
arduino_build_965504/libraries/FS/vfs_api.cpp.o
arduino_build_965504/libraries/SPIFFS
arduino_build_965504/libraries/SPIFFS/SPIFFS.cpp.d
arduino_build_965504/libraries/SPIFFS/SPIFFS.cpp.o
arduino_build_965504/libraries/WiFi
arduino_build_965504/libraries/WiFi/ETH.cpp.d
arduino_build_965504/libraries/WiFi/ETH.cpp.o
arduino_build_965504/libraries/WiFi/WiFi.cpp.d
arduino_build_965504/libraries/WiFi/WiFi.cpp.o
arduino_build_965504/libraries/WiFi/WiFiAP.cpp.d
arduino_build_965504/libraries/WiFi/WiFiAP.cpp.o
arduino_build_965504/libraries/WiFi/WiFiClient.cpp.d
arduino_build_965504/libraries/WiFi/WiFiClient.cpp.o
arduino_build_965504/libraries/WiFi/WiFiGeneric.cpp.d
arduino_build_965504/libraries/WiFi/WiFiGeneric.cpp.o
arduino_build_965504/libraries/WiFi/WiFiMulti.cpp.d
arduino_build_965504/libraries/WiFi/WiFiMulti.cpp.o
arduino_build_965504/libraries/WiFi/WiFiScan.cpp.d
arduino_build_965504/libraries/WiFi/WiFiScan.cpp.o
arduino_build_965504/libraries/WiFi/WiFiServer.cpp.d
arduino_build_965504/libraries/WiFi/WiFiServer.cpp.o
arduino_build_965504/libraries/WiFi/WiFiSTA.cpp.d
arduino_build_965504/libraries/WiFi/WiFiSTA.cpp.o
arduino_build_965504/libraries/WiFi/WiFiUdp.cpp.d
arduino_build_965504/libraries/WiFi/WiFiUdp.cpp.o
arduino_build_965504/libraries/Wire
arduino_build_965504/libraries/Wire/Wire.cpp.d
arduino_build_965504/libraries/Wire/Wire.cpp.o
arduino_build_965504/preproc
arduino_build_965504/preproc/ctags_target_for_gcc_minus_e.cpp
arduino_build_965504/sketch
arduino_build_965504/sketch/file.cpp
arduino_build_965504/sketch/file.cpp.d
arduino_build_965504/sketch/file.cpp.o
arduino_build_965504/sketch/file.h
arduino_build_965504/sketch/koala.h
arduino_build_965504/sketch/Koala.ino.cpp
arduino_build_965504/sketch/Koala.ino.cpp.d
arduino_build_965504/sketch/Koala.ino.cpp.o
arduino_build_965504/sketch/menu.cpp
arduino_build_965504/sketch/menu.cpp.d
arduino_build_965504/sketch/menu.cpp.o
arduino_build_965504/sketch/menu.h
arduino_build_965504/sketch/menus.cpp
arduino_build_965504/sketch/menus.cpp.d
arduino_build_965504/sketch/menus.cpp.o
arduino_build_965504/sketch/menus.h
arduino_build_965504/sketch/pcRead.cpp
arduino_build_965504/sketch/pcRead.cpp.d
arduino_build_965504/sketch/pcRead.cpp.o
arduino_build_965504/sketch/pcRead.h
arduino_build_965504/sketch/server.cpp
arduino_build_965504/sketch/server.cpp.d
arduino_build_965504/sketch/server.cpp.o
arduino_build_965504/sketch/server.h
arduino_build_965504/sketch/Sim
arduino_build_965504/sketch/Sim/Arduino.h
arduino_build_965504/sketch/Sim/page.cpp
arduino_build_965504/sketch/Sim/page.h
arduino_build_965504/sketch/Sim/serverWeb.cpp
arduino_build_965504/sketch/Sim/vars.cpp
arduino_build_965504/sketch/Sim/vars.h
arduino_build_965504/sketch/utils.cpp
arduino_build_965504/sketch/utils.cpp.d
arduino_build_965504/sketch/utils.cpp.o
arduino_build_965504/sketch/utils.h
arduino_build_965504/sketch/vars.cpp
arduino_build_965504/sketch/vars.cpp.d
arduino_build_965504/sketch/vars.cpp.o
arduino_build_965504/sketch/vars.h

seems that is compiles each source and library file separately into a .o, links them into a .elf file which is then converted to a .hex (not shown) for downloading to the target board

I wouldn't know where to start with splitting a program into different files with different extensions. Was just hopeing to use tabs at that seemed fairly straight forward.

GForce2010:
setup could be in the second one and loop in the third etc.etc.

It sounds like you're already aware, but just to be sure, you don't need to place the functions in any specific order. The Arduino IDE automatically generates function prototypes for all functions in .ino files that don't have a manually added prototype. These prototypes are inserted (in an intelligent manner) at the top of the first tab. This means you can organize your functions in any order you like.

GForce2010:
Is the above correct

Yes. You got it exactly right.

GForce2010:
is there anything else I need to be aware of?

Nope.

GForce2010:
Was just hopeing to use tabs at that seemed fairly straight forward.

That's perfectly fine. I do know how to use .h, .cpp, etc. files in sketches, but I almost never do it because I find the automated function prototype generation feature very convenient, and this is only done for .ino files.

Splitting the sketch into tabs makes navigation through the code of a large sketch much faster than scrolling through thousands of lines in a single file.

I just don't want to spend the next week writing code to find out it will never work because of how it is laid out.

Creep up on the solution rather than trying to implement it all at once.

I have a data logging sketch that I decided to add a browser based interface to so I added a couple of functions to it but the browser functions started to get more numerous and complicated so I added a new tab, named it webFunctions.ino, copied the browser functions to it and just went on programming. The new .ino file is compiled along with the main one and everything just works