Arduino IDE vs PlatformIO

Hol@

Cuando empecé con Arduino me ceñí al Arduino IDE. Me parecía muy intuitivo y sencillo, pero cuando ya hice un proyecto un poco más grande, vi que se quedaba muy corto, por lo que me pasé al VSMicro sobre Visual Studio 2017 y seguí usándolo cada vez que necesitaba algún código grande, ya que tampoco variaba la filosofía del Arduino IDE.
Desde hace unos meses VSMicro ya ha dejado de ser gratuito para uso particular y evaluando el coste anual y el uso que le doy, he decidido, que por el momento no voy a invertir en él.

Como tengo en mente otro proyecto, no muy grande, pero sí con cierta complejidad, he buscado alternativas y la que más me ha convencido es platformIO sobre VScode. Y ya le voy cogiendo el caire y me parece incluso mejor que el vsMicro ya que no depende, directamente, del Arduino IDE.

Claro, platformIO es, digamos, más “C++” que los otros, por lo que cosas que, intuyo, hace el IDE automáticamente ahora hay que hacerlas a mano, como por ejemplo incluir #include <Arduino.h> o los #includes cuando se usan varios archivos y aquí es donde está mi duda.
Hace tiempo que no hago nada en C++ “puro” por lo que lo he buscado por la red, o tal vez no he sabido buscarlo (tanto en español como en inglés)

Como sólo estoy de pruebas y no tengo nada en concreto voy a poner un ejemplo:

En el archivo main.cpp tengo:

#include <Arduino.h>
#include <Wire.h>              // Library for I2C communication
#include <LiquidCrystal_I2C.h> // Library for LCD

LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 16, 2); //Instancia a la liberia del display

#include <display_funct.h> //La he puesto aquí para que ya esté declarado "lcd"

//Variables globales
int example = 10;
String hola ="Hola mundo";

void setup{
Serial.begin(9600);
}

void loop(){
only_example(); //Sólo llama a la función para prueba
}

y en otro archivo quiero tener las funciones que manejen las acciones sobre el display:
Archivo display_funct.h

// Uso extern para que coja las variable globales del otro archivo, esto en el Arduino IDE no era 
necesario
extern String hola;
extern example;

void only_example(){
//Un cambio de variable sólo para ver si funcionan las globales
int work=example;

}
void print_in_LCD(Sring any_text){
any_text = hola; // Chorrada. Sólo es para ilustrar
lc.setCursor(0.0);
lcd.print(any_text);
}

pero lo único que consigo es un error de que el lcd no está en este ámbito.

Cuando desactivo la función print_in_LCD copila y funciona, lo que quiere decir que estoy haciendo bien con las variables, pero algo me pasa con la definición de la clase.
Ni que decir tiene que si pongo la función en el main.cpp funciona perfectamente.

He probado con el #include <display_funct.h> en varios sitios.

Estoy seguro que es una cosa trivial, pero no doy con ella.

Muchas gracias por adelantado.

Hola de nuevo

Me contesto a mi mismo, porque después de seguir dándole vueltas, parece que es alguna "pájara" que le da al IntelliSense del VScode.

Como le estaba haciendo caso al Intellisense que era el que marcaba los errores que comentaba, no se me ocurrió compilar. Le di a compilar y compiló correctamente, por lo que debia de ser un falso error de intellisense.

Intenté reconstruir la cache de Intellisense de plarformIO pero seguia dando el problema.

Al final lo he solventado de la siguiente manera:

  • Me he asegurado que todos lo nombres de la ruta y de los archivos del proyecto no tienen símbolos no válidos como ñ ,espacios, tildes, etc (no los suelo poner, pero por si acaso). Incluso he eliminado el "_" que tenía en el "display_funct.h" renombrado a "displayfunct.h") (por si acaso)
  • Me he ido a la carpeta de mi proyecto y he borrado la carpeta ".vscode" para reiniciar la configuración (ojo que si alguna conifiguración no es defalult se perderá)

Al abrir de nuevo VScode, ha regenerado la carpeta con las opciones por defecto y ya no da el error.

Un saludo a tod@s