Go Down

Topic: Passare variabile da void Setup a void loop (Read 3836 times) previous topic - next topic

antonellotilotta

Ciao a tutti
sto modificando il programma della lezione 03 del libro contenuto nel kit di Arduino.
in Void setup () ho letto una sonda termica e memorizzato il valore nella variabile
tempAmb.
Infatti, se stampo sulla seriale il valore di tempAmb trovo la temperatua ambientale.
Questa temperatura mi serve come parametro di confronto per evenutale variazione di tempertatura, quindi in
void loop()
viene continuamente confrontata con la temperatura letta al momento.
La temperatura rilevata in void loop() è memorizzata nella variabile float temperatura.

Il problema è che il valore della variabile tempAmb  non passa da void setup()  a void (loop), infatti se provo ad usarla ottengo l'errore di variabile non dichiarata.

Come posso portare in void loop() il contenuto di una variabile usata in void setup()?

GRAZIE
Antonello

leo72

Devi usare le cosiddette variabili globali, ossia variabili definite al di fuori di loop() e di setup(), prima di quest'ultimo.
In questo modo lo "spazio di visibilità" delle variabili si allarga a tutto lo sketch e la variabile puoi usarla in ogni punto del programma.

Esempio:


Code: [Select]
int a = 0;

void setup() {
  a++; //adesso "a" vale 1
}

void loop() {
  a++; //ad ogni ciclo "a" verrà incrementata
  subroutine(); //chiamo una subroutine
}

void subroutine() {
  a++; //anche qui posso incrementare "a"
}

antonellotilotta

Nel tuo esempio,
dichiari a all'inizio = 0
in setup() usi a++ (quindi vale 1)
in loop() incrementi ulteriormente a con a++  (quindi ora vale 2)
Sei passato dalla dichiarazione di a in setup e poi in loop, e da loop volendo a subrutine.

Nel mio caso
Code: [Select]

const int sensorPin = A0; //input sensore temp

void setup() {

Serial.begin(9600); // apre la seriale a 9600
for(int pinNumber=2; pinNumber<5; pinNumber++){
pinMode(pinNumber, OUTPUT); //inizializzo pin2-4 in OUT per i 3  led
digitalWrite(pinNumber, LOW); // metto tutti i led a Zero spenti
}
delay (250); // stabilizzazione

int sensorRif = analogRead(sensorPin); // leggo sensore e lo metto in sensorRif
float voltageRif = (sensorRif/1024.0) * 5.0;
float tempAmb = (voltageRif - .5) * 100; //converto volt in C e metto la temperatura letta in tempAmb
Serial.print ("Sensore all'inizio: ");
Serial.print (sensorRif);
Serial.print (" Temperatura ambientale: ");
Serial.println(tempAmb); //stampo per controllo


Se in loop chiamo tempAmb ottengo errore di variabile nn dichiarata...

pippo72

ciao
Chiedo scusa a Leo se mi intrometto...
@ antonellotoilotta: Hai letto e compreso l'esempio che ti ha fatto Leo, ma non lo hai implementato.

Quote
dichiari a all'inizio = 0
in setup() usi a++ (quindi vale 1)
in loop() incrementi ulteriormente a con a+
...


Devi dichiarare la variabile tempAmb PRIMA del void setup per poi usarla in qualsiasi parte del codice.

es:
Code: [Select]
float tempAmb = 0.0  //<==== QUI LA DICHIARI
const int sensorPin = A0; //input sensore temp

void setup() {

Serial.begin(9600); // apre la seriale a 9600
for(int pinNumber=2; pinNumber<5; pinNumber++){
pinMode(pinNumber, OUTPUT); //inizializzo pin2-4 in OUT per i 3  led
digitalWrite(pinNumber, LOW); // metto tutti i led a Zero spenti
}
delay (250); // stabilizzazione

int sensorRif = analogRead(sensorPin); // leggo sensore e lo metto in sensorRif
float voltageRif = (sensorRif/1024.0) * 5.0;
tempAmb = (voltageRif - .5) * 100; //QUI IL float NON SERVE.
Serial.print ("Sensore all'inizio: ");
Serial.print (sensorRif);
Serial.print (" Temperatura ambientale: ");
Serial.println(tempAmb); //stampo per controllo


ciao
pippo72

leo72

Hai letto l'esempio che ti ho fatto e cosa ti ho scritto?  :smiley-roll-sweat:
Devi dichiarare la variabile PRIMA del setup, altrimenti il compilatore NON interpreta la variabile come globale. Tutto quello che dichiari all'interno di una funzione diventa "locale" ed è visibile solo in quella funzione. Tu infatti tempAmb l'hai dichiarata all'interno di setup() e dal loop() NON puoi richiamarla.

Cambia così:

Code: [Select]
float tempAmb;

void setup() {

Serial.begin(9600); // apre la seriale a 9600
 .....
 tempAmb = (voltageRif - .5) * 100; //converto volt in C e metto la temperatura letta in tempAmb
 .....
}


Come vedi, all'interno di setup() non c'è più la dichiarazione di tempAmb ma solo un'assegnazione.

leo72


Sei passato dalla dichiarazione di a in setup e poi in loop, e da loop volendo a subrutine.

assegnazione

antonellotilotta

Leo72 e Pippo72
vi ho postato il listato che mi da il problema, non corretto... :-)
Comuqnue
Ho dichiarato tempAmb = 0 prima di setup(), quindi variabile globale...
In setup() la uso e mi ritorna la temperatura corretta.
Quando la chiamo in loop() ha valore 0, cioè lo stesso della dichiarazione iniziale, tant'è che se all'inizio le do un valore 10, in setup() leggo la tempertatura corretta, in loop() leggo 10.

Code: [Select]

// 03
const int sensorPin = A0; //input sensore temp
// const float baselineTemp = 25;
float tempAmb = 10.00;

void setup() {

Serial.begin(9600); // apre la seriale a 9600
for(int pinNumber=2; pinNumber<5; pinNumber++){ //inizializzo pin2-4 OUT per il led
pinMode(pinNumber, OUTPUT);
digitalWrite(pinNumber, LOW); // metto led a Zero, spenti
}
delay (250); // stabilizzazione termica

int sensorRif = analogRead(sensorPin); // converte la lettura adc in tensione
float voltageRif = (sensorRif/1024.0) * 5.0; // converto volt in gradi C
float tempAmb = (voltageRif - .5) * 100; // fisso temp di riferimento ambientale
Serial.print ("Sensore all'inizio: ");
Serial.print (sensorRif);
Serial.print (" Temperatura ambientale: ");
Serial.println(tempAmb); //VALORE CORRETTO

}

void loop() {

int sensorVal = analogRead(sensorPin);
Serial.print ("Sensore: ");
Serial.print (sensorVal);
// converte la lettura adc in tensione
float voltage = (sensorVal/1024.0) * 5.0;
Serial.print(", Volts: ");
Serial.print(voltage);
Serial.print(", Gradi: ");
// converto volt in gradi C
float temperature = (voltage - .5) * 100;
Serial.print(temperature);
Serial.print(", Riferimento: ");
Serial.println(tempAmb);
if(temperature < tempAmb){
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
} else if(temperature >=  + 2 &&
   temperature < tempAmb + 4){
    digitalWrite(2, HIGH);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
} else if(temperature >= tempAmb + 4 &&
temperature < tempAmb + 6) {
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
} else if(temperature >= tempAmb + 6) {
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
    }
delay(500);

}



leo72

Scusa eh... ma nel setup hai DICHIARATO un'altra volta tempAmb.

Code: [Select]

float tempAmb = 10.00;

void setup() {
...
float tempAmb = (voltageRif - .5) * 100; // fisso temp di riferimento ambientale
...
}

void loop() {


Non è ciò che ti ho detto io. Tu devi dichiarare la variabile SOLO una volta. Prima del setup.
Poi devi fare solo ASSEGNAZIONI. Se dichiari un'altra variabile tempAmb dentro a setup() questa "nasconde" la variabile globale e tu in setup() usi la variabile locale. Ovvio che in loop() tu veda il valore della dichiarazione della variabile globale. :smiley-roll-blue:

antonellotilotta

Abbi pazienza Leo72, non ho una grande esperienza di programmazione.....
Mentre mi scrivevi la risposta, di cui ti ringrazio, mi sono accorto che avevo ridichiarato una seconda volta tempAmb. E' stato sufficiente togliere float per vedere funzionare tutto come volevo.

Grazie ancora.

Antonello

uwefed


Abbi pazienza Leo72, non ho una grande esperienza di programmazione.....
Mentre mi scrivevi la risposta, di cui ti ringrazio, mi sono accorto che avevo ridichiarato una seconda volta tempAmb. E' stato sufficiente togliere float per vedere funzionare tutto come volevo.

Grazie ancora.

Antonello

Sí quello é la soluzione.
Se dichiari una variabile fuori dalle funzioni (Variable globale) e dichiari un altra volta dentro una funzione la seconda diventa una variabile locale che non corrisponde a quella globale. Usando la variaile dentro la funzione userai la versione locale e non quella globale. La variabile globale é valida in tutte le altre funzioni.

Ciao Uwe

Go Up