Pages: [1]   Go Down
Author Topic: Richiamare variabile da una libreria  (Read 1241 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 37
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 
Logged

0
Offline Offline
Shannon Member
****
Karma: 130
Posts: 10465
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Newbie
*
Karma: 0
Posts: 37
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
Quote
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....

Quote
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  smiley
Logged

0
Offline Offline
Shannon Member
****
Karma: 130
Posts: 10465
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

ivrea (to)
Online Online
Faraday Member
**
Karma: 86
Posts: 4843
miaaao ^-^
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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();
Logged

my name is IGOR, not AIGOR

Offline Offline
Newbie
*
Karma: 0
Posts: 37
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

ivrea (to)
Online Online
Faraday Member
**
Karma: 86
Posts: 4843
miaaao ^-^
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.

Code:
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.
« Last Edit: January 26, 2013, 10:49:26 am by nid69ita » Logged

my name is IGOR, not AIGOR

Offline Offline
Newbie
*
Karma: 0
Posts: 37
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.

Quote
#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
Quote
#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
Quote
#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 smiley
Logged

0
Offline Offline
Faraday Member
**
Karma: 31
Posts: 2908
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
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.  smiley-razz

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:"

Code:
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.
Logged

AvrDudeQui front end per avrdude https://gitorious.org/avrdudequi/pages/Home

ivrea (to)
Online Online
Faraday Member
**
Karma: 86
Posts: 4843
miaaao ^-^
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.

Logged

my name is IGOR, not AIGOR

Pages: [1]   Go Up
Jump to: