Librerie personali VS code Arduino

Salve a tutti, spero di essere nella sezione giusta. Ho appena installato l'esenzione Arduino della Microsoft su VS code.
Quello che volevo fare era di poter usare le librerie che mi ero costruito e che avevo salvato nella cartella .../Arduino/libraries . Nel file c_cpp_properties.json sotto la voce includePath ho aggiunto tra virgolette l'indirizzo delle librerie. Nel codice quando scrivo #include< compare nel menu dell'auto completamento il nome della libreria. Una volta aggiunta la libreria, quando vado a richiamare la classe, nel menu di auto completamento compare tutte le definizioni della classe.
Pero quando vado a compilare il file mi da il seguente errore:

No such file or directory.

Dipende da come è scritta la classe?

Di quale estensione stai parlando esattamente?
Perché ce ne sono almeno 2, platformio e un'altra di cui non ricordo il nome esatto.

Con quest'ultima non è necessario fare nulla (usa i path di Arduino IDE) mentre con platformio puoi usare un path locale a livello di progetto mettendo le librerie nella cartella lib oppure configurare il percorso nel file platformio.ini

Una terza opzione è usare Arduino CLI

Io sto usando questa estensione: Arduino for vs code della microsoft.

Questa estensione usa la stessa toolchain di Arduino IDE, infatti è un requisito che sia installato oppre in alternativa puoi usare Arduino CLI.

Quindi se la tua libreria va bene con l'IDE classico, dovrebbe funzionare senza problemi.

Chiedo scusa se non mi sono più collegato al forum. In questo periodi ho abbandonato l'estensione Arduino for vs code della microsoft e mi sono concentrato sull'esenzione platformio. Però il mio problema rimangono sempre le librerie, nel senso io ho creato tempo fa questa libreria:
file .h

#pragma once

#ifndef MBUTTON.h
#define	MBUTTON.h

#if defined(ARDUINO) && ARDUINO>=100
	#include "arduino.h"
#else
	#include "WProgram.h"
#endif // defined(ARDUINO) && ARDUINO>=100

#include <stddef.h>

typedef void(*funRelease)(long long tmp_pressButton);
typedef void(*funPress)();

class mButton
{
private:
	int pin;	//Pin relativo al pulsante
	int oldState;
	int state;

	long long dbTime = 25;	//Tempo di debounce
	long long time = 0;
	long long timePress = 0;

	bool pulUp = 0;
	bool chekPress = 0;
	bool pressed = 0;

	funRelease buttonRelease;
	funPress buttonPress;
	funPress buttonChange;

public:
	bool begin(int btPin, long long btDbTime = 25, bool btPulUp = 0, funRelease funButtonRelease = NULL, funPress funButtonPress = NULL, funPress funButtonChange = NULL);
	void checkStateButton();
	bool isPressed() { return pressed; };
};
#endif // !MBUTTON.h

file .cpp

#include "MY_BUTTON.h"

bool mButton::begin	(int btPin, long long btDbTime = 25, bool btPulUp = 0, funRelease funButtonRelease = NULL, funPress funButtonPress = NULL, funPress funButtonChange = NULL){

	oldState = (btPulUp == 1) ? 1 : 0;
	state = oldState;
	pin = btPin;
	dbTime = btDbTime;
	buttonChange = funButtonChange;
	buttonPress = funButtonPress;
	buttonRelease = funButtonRelease;
	pulUp = btPulUp;


	if (buttonChange == NULL && buttonPress == NULL && buttonRelease == NULL) {

		return false;
	}
	chekPress = false;

	pinMode(pin, (pulUp == 1) ? INPUT_PULLUP : INPUT);

	return true;

}

void mButton::checkStateButton() {

		if (!chekPress) {
			state = digitalRead(pin);
			delay(50);
			if (state != oldState) {
				time = millis();
				chekPress = !chekPress;
			}

		}

		if (chekPress) {
			if ((millis() - time) > dbTime) {
				state = digitalRead(pin);
				delay(50);
				if (oldState != state) {

					if (buttonChange != NULL) buttonChange();

					if (state == !pulUp) {
						timePress = millis();
						pressed = 1;
						if (buttonPress != NULL) buttonPress();
					}

					if ((state == pulUp) && (buttonPress != NULL)) {
						pressed = 0;
						buttonRelease((long long)(millis() - timePress));
					}
					oldState = state;
				}
				chekPress = false;
			}
		}
}

ho copiato la libreria dentro la cartella include del Mio progetto, però quando arrivo a verificarlo mi da il seguente risultato:

> Executing task in folder Orologio: C:\Users\marco\.platformio\penv\Scripts\platformio.exe run <

Processing uno (platform: atmelavr; board: uno; framework: arduino)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Verbose mode can be enabled via `-v, --verbose` option
CONFIGURATION: https://docs.platformio.org/page/boards/atmelavr/uno.html
PLATFORM: Atmel AVR (4.0.0) > Arduino Uno
HARDWARE: ATMEGA328P 16MHz, 2KB RAM, 31.50KB Flash
DEBUG: Current (avr-stub) On-board (avr-stub, simavr)
PACKAGES:
 - framework-arduino-avr @ 5.1.0
 - toolchain-atmelavr @ 1.70300.191015 (7.3.0)
LDF: Library Dependency Finder -> https://bit.ly/configure-pio-ldf
LDF Modes: Finder ~ chain, Compatibility ~ soft
Found 5 compatible libraries
Scanning dependencies...
No dependencies
Building in release mode
Linking .pio\build\uno\firmware.elf
C:\Users\marco\AppData\Local\Temp\ccwHqMkF.ltrans0.ltrans.o: In function `main':
<artificial>:(.text.startup+0x14a): undefined reference to `mButton::begin(int, long long, bool, void (*)(long long), void (*)(), void (*)())'
<artificial>:(.text.startup+0x1c4): undefined reference to `mButton::checkStateButton()'
collect2.exe: error: ld returned 1 exit status
*** [.pio\build\uno\firmware.elf] Error 1
====================================================================== [FAILED] Took 1.02 seconds ======================================================================
Il processo del terminale "C:\Users\marco\.platformio\penv\Scripts\platformio.exe 'run'" è stato terminato. Codice di uscita: 1.

Terminale verrà riutilizzato dalle attività, premere un tasto qualsiasi per chiuderlo.

e non capisco l'errore

Posso spiegarti l'errore ma non so se ti è utile a trovare dov'è il problema.

<artificial>:(.text.startup+0x14a): undefined reference to `mButton::begin(int, long long, bool, void (*)(long long), void (*)(), void (*)())'
<artificial>:(.text.startup+0x1c4): undefined reference to `mButton::checkStateButton()'
collect2.exe: error: ld returned 1 exit status

Il compilatore si ferma nella fase di collegamento dei moduli.o.
Il comando avr-ld è il linker, il quale ha il compito di risolvere i collegamenti ai simboli presenti nei vari moduli .o .
Quando avr-ld termina con successo genera dai moduli .o un file .elf (firmware.elf).

Più di questo non so dirti non uso quella piattaforma di sviluppo.
Ciao.

Devi metterla all'interno della cartella lib

Avevo provato anche a copiare la libreria qui, e non so come mai non mi aveva funzionato. Adesso come per magia funziona tutto.
Grazie Mille di tutte le risposte che ho avuto.
nel file .h ho dovuto rimuovere la parte di precompilazione:

#ifndef MBUTTON.h
#define	MBUTTON.h

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.