Richiamare variabile da una libreria

Ciao a tutti ho un problema vorrei sapere se fosse possibile richiamare una variabile sul software di Arduino prendendola da un ciclo creato in una libreria da me formulata.

In pratica ho creato una libreria che mi calcoli tre valori tra di loro e il risultato me lo scrive su un altra variabile al interno della mia libreria. poi nel mio ciclo loop del Arduino richiamo tutto il ciclo void della libreria e lui fa partire il programma poi nel mio software di Arduino avrei bisogno di richiamare tal variabile per farla interagire con altri componenti del programma..

E' possibile far tutto ciò? e se si come posso fare?

Grazie mille a tutti buona giornata

prima di tutti stiamo parlando di classi e non di librerie.
Le vere librerie C (quelle arduino sono classi) hanno tutte le variabili in comune col "programma principale"

Le classi invece sono piccoli mondi a se. Una variabile (o un metodo) può essere dichiarato public per essere in condivisione con il "programma principale", semplicemente facendo "valore = nomeclasse.nomevariabile".
Però è una cattiva abitudine, in teoria si usano sempre dei metodi (funzioni) getter e setter, ovvero "nomeclasse.setNomeVaribaile(valore)" (setter, ovvero per impostare un valore) e "valore = nomeclasse.getNomeVariabile()" (getter, per ottenere il valore).
il motivo per cui si fa ciò è semplice; se attingi direttamente da una variabile essa può non essere aggiornata, avere una gestione particolare etc... usando un getter puoi, nel momento in il valore è richiesto, eseguire altre porzioni di codice interne alla classe, per esempio un "update()" che aggiorna il valore da restituire in base a dei dati analizzati

Ciao lesto innanzitutto grazie mille per la risposta e i tuoi chiarimenti sul caso. Vorrei analizzare più specificamente il metodo (funzioni) getter e setter, possiamo fare un esempio pratico ad esempio io ho una variabile su un ciclo for nella mia classe nella libreria di nome r che viene aggiornata subito sotto negli eventi dovrei mettere il sistema setter ad esempio:

for (r = 255; r > 0; r--) {
nomeclasse.setNomeVaribaile(valore);
delay(FADESPEED);
rossorandom = r;

la mia classe si chiama pippo, e in set nome variabile e valore cosa dovrei inserire? la mia variabile e r.

e poi nel mio programma principale dovrei inserire il getter in questa maniera....

void loop()
{
valore = nomeclasse.getNomeVariabile();
}

su gatNomeVariabile cosa dovrei inserire? poi la mia variabile r la dovrò far visualizzare sul serial monitor! come posso effettuare tutto ciò?

Grazie mille e buona Serata :slight_smile:

no, non capisco, spiega bene cosa vorresti fare, forse a te serve una funzione con valore (o valiri) di ritorno, cosa molto più semplice

Rimanendo al tuo primo post, una variabile all'interno della libreria o dell'oggetto, ne puoi far vedere il valore usando una funzione.
La funzione ritornerà quel valore.

int MiaFunz()
{ return(miavarinterna); // miavarinterna del tipo del ritorno della funzione
}

nel programma principale userai tale funzione:
x=MiaFunz();
se "appartiene" ad un oggetto:
x=miooggetto.MiaFunz();

io voglio leggere sul mio serial.begin di arduino il valore r calcolato nella mia classe nel ciclo for... il ciclo for mi calcola un valore diverso ad ogi 25millisecondi e me lo stampa su una variabile di nome r, io questa variabile r la devo visualizzare su serial.monitor di arduino.

Non sei molto chiaro. Il ciclo for è dentro alla tua classe? Quindi la variabile r è dentro alla tua classe?

Se la variabile è già dentro alla classe, insieme al ciclo for, allora non devi fare nessun set.
Devi solo creare un metodo per far vedere quella variabile all'esterno.

class Pippo
{  private:
    int r;
  public:
    Pippo( )  // costruttore
    { ...
    }
    
    int ReadVar()
    { return r;
    };
};

nella loop()
... con un oggetto objPippo di tipo Pippo
x=objPippo.ReadVar();
...

Ma dalle cose che scrivi mi sembra chiaro che non ci hai spiegato la cosa che vuoi fare oppure stai cercando di fare una cosa che non è logica per la programmazione. Secondo me se hai un codice completo è meglio se lo posti tutto
Ad esempio non mi è chiaro come vuoi usare questo ciclo for e quale variabile vuoi 'far vedere' nel loop.

ook cercherò di esser il più chiaro possibile vi posto anche i mie file di programmazione per risolvere questo quesito.

Allora io nel mio software .cpp ho ricreato questo software per far calcolare al arduino dei valori per visualizzarli sul mio diodo led RGB, in pratica faccio fare 6 cicli for che tramite tre variabili diverse(r,g,b) calcolino dei valori analoghi e casuali per un ciclo casuale. io queste tre variabili numeriche devo visualizzarle sul sistema principale per dar poi la funzione analogWrite(rosso, r); dato che la classe in libreria dovrebbe continuare a calcolare io in ogni momento che desidero vedere il mio colore diverso basterebbe soltanto dargli un comando di tipo analogWrite e la variabile che ogni volta sara sempre diversa

questi sono i codici cpp.

#include "RGB.h"

#define FADESPEED 1 // DEFINIRE LA VELOCITA DI CAMBIAMENTO COLORE LAMPADA IN mS
#define REDPIN 5
#define GREENPIN 6
#define BLUEPIN 3
int r, g, b; // VARIABILI INTERNE r,g,b;
int rossorandom;
int verderandom;
int blurandom;

void RGB::ledrosso (void){ // INIZIO FUNZIONE DI CICLI VOID SETUP

pinMode(REDPIN, OUTPUT);
}

void RGB::ledverde (void){

pinMode(GREENPIN, OUTPUT);
}

void RGB::ledblu (void){

pinMode(BLUEPIN, OUTPUT);
}
// FINE FUNZIONE DI CICLI VOID SETUP

void RGB::cambio_colori(void){ // INIZIO CODICE DI CICLO PER CAMBIO COLORE

// fade from blue to violet
for (r = 0; r < 256; r++) {
delay(FADESPEED);
rossorandom = r;
blurandom = b;
verderandom = g;

}
// fade from violet to red
for (b = 255; b > 0; b--) {
delay(FADESPEED);
rossorandom = r;
blurandom = b;
verderandom = g;
}
// fade from red to yellow
for (g = 0; g < 256; g++) {
delay(FADESPEED);
rossorandom = r;
blurandom = b;
verderandom = g;
}
// fade from yellow to green
for (r = 255; r > 0; r--) {
delay(FADESPEED);
rossorandom = r;
blurandom = b;
verderandom = g;
}
// fade from green to teal
for (b = 0; b < 256; b++) {
delay(FADESPEED);
rossorandom = r;
blurandom = b;
verderandom = g;
}
// fade from teal to blue
for (g = 255; g > 0; g--) {
delay(FADESPEED);
rossorandom = r;
blurandom = b;
verderandom = g;
}

il file .h

#ifndef RGB_h
#define RGB_h
#include "Arduino.h"

class RGB
{

public:

void ledrosso (void);
void ledverde (void);
void ledblu (void);
void cambio_colori(void);
void variabili_colori(void);
byte REDPIN;
byte GREENPIN;
byte BLUEPIN;
int rossorandom;
int verderandom;
int blurandom;

};
#endif

ed in fine il file arduino

#include <RGB.h>
RGB rgb;

void setup()
{
rgb.ledrosso();
rgb.ledverde();
rgb.ledblu();

}

void loop()
{
rgb.cambio_colori();
analogWrite(REDPIN, rossorandom);
analogWrite(GREENPIN, verderandom);
analogWrite(BLUEPIN, blurandom);
}

perqualsiasi chiarimento chiedetemi pure grazie mille a tutti e buona domenica :slight_smile:

ook cercherò di esser il più chiaro possibile vi posto anche i mie file di programmazione per risolvere questo quesito.

Non ci sei riuscito minimamente. :stuck_out_tongue:

Le classi servono per accorpare insieme variabili (dati ) e funzioni metodo che operano su i dati. I dati non dovrebbero essere accedibili nello stesso modo in cui accedi alle funzioni, per questo le variabili interne vengono dichiarate "private:". "private:" e una sottosezione simile a "public:" l'altra è "protect:"

class RGB
{
// le variabili e funzioni dichiarate qui sono da considerare private e quindi da usare solo ad uso e consumo della classe o oggetto 
      
public:
   
       void ledrosso (void);
      void ledverde (void);
      void ledblu (void);
      void cambio_colori(void);
      void variabili_colori(void);
      byte REDPIN;
      byte GREENPIN;
      byte BLUEPIN;
      int rossorandom;
      int verderandom;
      int blurandom;

private:
// le variabili e funzioni dichiarate qui sono da considerare private e quindi da usare solo ad uso e consumo della classe o oggetto 

protect:
// le variabili dichiarate sono accessibili solo da classi che ereditano questa.      
};

Come ti hanno fatto notare manca il costruttore che normalmente è dichiarato publico e serve per inizializzare le variabili membro dell'oggetto.
Da una classe si crea una istanza di classe, detta oggetto, questo si usa come se fosse una variabile di tipo standard (quasi)

In mancanza di un costruttore il conpilatore ne inserisce uno automaticamente, diversamente sarebbe impossibile creare istanza di classe.

int rossorandom, ecc sono variabli glogali e variabili membro publiche di classe RGB.

Ad una variabile publica membro di classe si accede tramite l'operatore "." come si fa con le funzioni, per accedervi però prima si deve creare istanza di classe, cioè oggetto. Quindi nel tuo caso accedi a rossorandom di oggetto con rgb.rossorandom. r,g,b invece sono variabili globali non appartenenti a classi o oggetti e sono visibili da tutto il codice.

Tuttavia quando si usa dividere il codice in moduli C, cioè in più file, la variabile globale è visibile sono all'interno del modulo in cui è stata dichiarata.
Per renderla visibile anche ad altri moduli bisogna farlo presente al compilatore C, che c'è una variabile dichiarata esternamente a questo modulo che vogliamo usare. Si risolve dichiarando extern int rossorandom nel file .cpp dove c'è il setup() e loop(), stessa cosa per r,g,b. extern int r;

Ora, prenditi tempo per rispondere, perchè io ci ho messo 10 minuti abbondanti per scrivere ste quattro righe, che però risultano molto più comprensibili delle tue.

Ciao.

Ora mi è chiaro. Stai cercando di fare una cosa senza senso.
A parte il problema della visibilità delle variabili interne alla classe, che come ti ho detto puoi anche risolvere con delle funzioni membro della classe che le esportano (esempio che ti ho postato MiaFunz).
Ogni computer esegue una istruzione alla volta. Quando viene eseguita la tua funzione cambio_colori, non puoi pretendere che Arduino esegua ANCHE le analogwrite(). Cioè all'interno dei vari cicli for tu cambi i valori delle variabili, ma mica queste vengono sparate al led, se non usi li dentro una analogwrite()

// fade from blue to violet
for (r = 0; r < 256; r++)
{ delay(FADESPEED);
rossorandom = r;
blurandom = b;
verderandom = g;
analogWrite(REDPIN, rossorandom);
analogWrite(GREENPIN, verderandom);
analogWrite(BLUEPIN, blurandom);
}

e perciò le variabili con nome lungo servono a poco, tanto vale usare le sole variabili r,g,b
Nella loop perciò richiami solo la cambio_colori()

La classe in questione dovrebbe servirti solo per "nascondere" a chi la usa i numeri dei pin che hai deciso.