condividere variabile tra più fogli

Ciao a tutti,
sto tentando di creare un simil-sismografo con arduino. Vista la complessità e sopratutto lunghezza del codice ho suddiviso il tutto in diversi fogli che si occupano di calibrazione, elaborazione dei dati raccolti e raccolta dei dati separatamente.
Adesso però stò facendo un aggiornamento ed avrei bisogno di far sì che una variabile dal foglio principale possa essere letta anche dal foglio che si occupa della registrazione del sisma.

Quello che ho tentato di fare inizialmente è di dichiarare la variabile prima del void setup(), il che funziona perfettamente nel solito foglio, ma quando sposto il codice dall'altra parte il valore della variabile viene considerato 0, come se non l'avessi mai impostata.

Cercando online ho trovato la soluzione di mettere global davanti alla dichiarazione della variabile, ma non funziona. Dove stò sbagliando?

La variabile è una buleana, attualmente la stò dichiarando così: bool calibrato = false;
precedentemente avevo provato con global bool calibrato = false;

Praticamente quello che devo fare è alleggerire il ciclo loop per consultare il codice più velocemente, quindi ho tentato di spostare alcune azioni in un void separato da richiamare dal loop. Il funzionamento consiste in una funzione if che verifica se calibrato = false e nel caso avvia una serie di procedure.

Codice precedente:

if (calibrato == false) {
  calibrato = true;
  [...]
}

Codice che vorrei avere:

calcheck();

(Dove in calcheck è racchiuso il codice precedente)

Codice che vorrei evitare perché non ottimizzato al massimo:

if (calibrato == false) {
  calcheck();
}

Spostando il codice in una funzione separata (appunto calcheck()), la variabile mantiene il valore impostato (true), ma una volta terminato il void il valore si resetta e torna a false. Come posso risolvere?

Non è che per caso quella variabile la dichiari su tutti i fogli?
Le variabili globali dovrebbero essere GLOBALI a prescindere dai file che usi per scrivere il codice, se però su ogni foglio la dichiari di nuovo allora la duplici e crei un bel pasticcio.
Per fogli intendi file separati giusto?

No la variabile viene dichiarata una volta sola nel foglio principale.
Si per fogli intendo file separati.
Lascio in allegato il progetto se potesse essere utile per capire meglio il problema

calibrazione.ino (5.4 KB)

elaborazione.ino (3.82 KB)

registrazione.ino (4.99 KB)

Sismografo.ino (10.7 KB)

ciao...hai visto che nel file "registrazione" c'è quella variabile e la metti, se passato un certo tempo, a false !?...prova a commentare quella riga e vedi cosa succede.

calibrato la trovo usata solo su Sismografo.ino e su registrazione.ino dove viene solo messa a false.

Quindi non c'è proprio il caso che segnali sui sorgenti.
Non viene mai usata sui "fogli" esterni se non sull'unica assegnazione a false.

maubarzi:
calibrato la trovo usata solo su Sismografo.ino e su registrazione.ino dove viene solo messa a false.

Quindi non c'è proprio il caso che segnali sui sorgenti.
Non viene mai usata sui "fogli" esterni se non sull'unica assegnazione a false.

Si scusa, mi ero dimenticato di aver modificato il codice per farlo funzionare.

Nei file che ho allegato il loop comincia così:

if (calibrato == false) {
  calibrato = true;
  digitalWrite(LEDverde, LOW);
  digitalWrite(LEDrosso, HIGH);
  calsetup();
  digitalWrite(LEDrosso, LOW);
  digitalWrite(LEDverde, LOW);
  }
  
  if (digitalRead(CAL) == HIGH) {
    calibrato = false; //Se il tasto CAL viene premuto si procede alla calibrazione immediata
  }

  timecheck();
  availablecheck();
  maxregmincheck();

In realtà deve cominciare così:

  calcheck();
  timecheck();
  availablecheck();
  maxregmincheck();

E nel foglio elaborazione viene aggiunto questo:

void calcheck() {
if (calibrato == false) {
  calibrato = true;
  digitalWrite(LEDverde, LOW);
  digitalWrite(LEDrosso, HIGH);
  calsetup();
  digitalWrite(LEDrosso, LOW);
  digitalWrite(LEDverde, LOW);
  }
  
  if (digitalRead(CAL) == HIGH) {
    calibrato = false; //Se il tasto CAL viene premuto si procede alla calibrazione immediata
  }

  timecheck();
  availablecheck();
  maxregmincheck();
}

ORSO2001:
ciao...hai visto che nel file "registrazione" c'è quella variabile e la metti, se passato un certo tempo, a false !?...prova a commentare quella riga e vedi cosa succede.

Il problema non è li, quella parte del codice è già collaudata e funziona correttamente. Prima avevo inserito dei Serial.print sparsi qua e la per capire quale parte veniva eseguita e quale no.

ho dato uno sguardo al programma
per quello che ho visto quello che descrivi NON dovrebbe accadere
sicuro dell’anti-rimbalzo del pulsante di calibrazione?
EDIT, una non chiara cosa

void calcheck() {
if (calibrato == false) {
  calibrato = true;
  digitalWrite(LEDverde, LOW);
  digitalWrite(LEDrosso, HIGH);
  calsetup();
  digitalWrite(LEDrosso, LOW);
  digitalWrite(LEDverde, LOW);
  }
  
  if (digitalRead(CAL) == HIGH) {
    calibrato = false; //Se il tasto CAL viene premuto si procede alla calibrazione immediata
  }

  timecheck();
  availablecheck();
  maxregmincheck();
}

perchè il check del tasto di calibrazione non lo fai PRIMA del check della variabile calibrato?
così facendo se premi il tasto di calibrazione questa avverrà al PROSSIMO giro di loop, non in questo
che differenza c’è tra la variabile “calibrato” e la variabile “calfine”? dalla descrizione sembrano avere lo stesso scopo…

I "fogli", in realtà, è come se fossero uno di seguito all'altro in un foglio solo.

Se una variabile è dichiarata fuori da una funzione (setup, loop e qualunque altra), è una variabile globale. Se non trovi il valore che ti aspetti è perché viene modificato da qualche parte!

Standardoil:
ho dato uno sguardo al programma
per quello che ho visto quello che descrivi NON dovrebbe accadere
sicuro dell'anti-rimbalzo del pulsante di calibrazione?
EDIT, una non chiara cosa

void calcheck() {

if (calibrato == false) {
  calibrato = true;
  digitalWrite(LEDverde, LOW);
  digitalWrite(LEDrosso, HIGH);
  calsetup();
  digitalWrite(LEDrosso, LOW);
  digitalWrite(LEDverde, LOW);
  }
 
  if (digitalRead(CAL) == HIGH) {
    calibrato = false; //Se il tasto CAL viene premuto si procede alla calibrazione immediata
  }

timecheck();
  availablecheck();
  maxregmincheck();
}



perchè il check del tasto di calibrazione non lo fai PRIMA del check della variabile calibrato?
così facendo se premi il tasto di calibrazione questa avverrà al PROSSIMO giro di loop, non in questo
che differenza c'è tra la variabile "calibrato" e la variabile "calfine"? dalla descrizione sembrano avere lo stesso scopo.........

La variabile calibrato viene utilizzata per determinare se la calibrazione è stata effettuata.
calfine invece viene utilizzata perché il void di calibrazione dovrebbe essere un loop, ma non potendo inserire due loop() ho creato un void normale con un ciclo while che prende come riferimento la variabile calfine (il void in questione è calloop() nel foglio calibrazione)

Ho tentato di cambiare il nome del void dal calcheck() a calibrationcheck() e adesso funziona tutto correttamente.

Non era un duplicato nel mio codice, può darsi che nella libreria usata sia presente una funzione chiamata calcheck() che abbia dato noia?

prova a fare una chiamata a calcheck() che non dovrebbe più esistere. Se si compila allora esiste ancora da qualche altra parte e non è la tua.

non credo sia possibile, in sede di compilazione avrebbe dato un messaggio del tipo:
redefinition of 'void calcheck(...'
e non avrebbe compilato

Dipende da come è strutturato il codice, non ho ancora approfondito a tal punto il linguaggio su arduino, ma se sono implementate logiche ad oggetti potrebbe semplicemente andare in override.
Se hai già verificato allora mi taccio e prendo atto.

Usare parole italiane è sempre un buon modo per evitare di usare parole "proibite"! Un francese non avrebbe dubbi se scriverle in francese... :slight_smile:

calcheck() non viene utilizzata dalle librerie. A questo punto mi arrendo nella ricerca di una causa e mi limito ad utilizzare il calibrationcheck()

Quindi ora ti funziona tutto? A prescindere dal file in cui metti le varie parti?
Se non è così posta il codice effettivamente bacato perchè l'altra volta avevi messo uno senza il problema e quindi è difficile indagare.