Valore salvato in una int non viene ritenuto

Salve, la mia intenzione è quella di comparare due variabili int (btot, bcompare); se diverse bcompare prende il valore di btot ed eseguo un'azione; se uguali non faccio alcunche. Purtoppo sembra che bcompare non acquisisca il valore di btot, restando a 0, e quindi quest'azione viene ripetuta al''infinito. dove sbaglio?

int anemometro = A0;   // ingresso analogico (A0) per lettura anemometro
int velocita;          // variabile a cui ci si riferirà per la velocità del vento in m/s
const char vchar = 'v'; // variabile per comparazione velocità vento
int foto1 = 2;         // fotosensore 1 collegato al PIN 2
int foto2 = 3;         // fotosensore 2 collegato al PIN 3
int foto3 = 4;         // fotosensore 3 collegato al PIN 4
int foto4 = 5;         // fotosensore 4 collegato al PIN 5
int foto5 = 6;         // fotosensore 5 collegato al PIN 6
const int b1 = 1;      // valore del fotosensore 1 per determinare posizione
const int b2 = 2;      // valore del fotosensore 2 per determinare posizione
const int b3 = 4;      // valore del fotosensore 3 per determinare posizione
const int b4 = 8;      // valore del fotosensore 4 per determinare posizione
const int b5 = 16;     // valore del fotosensore 5 per determinare posizione
int btot;              // variabile che descrive la somma delle variabili b1..b5
int bcompare;          // variabile per comparazione stato fotosensori
int velcompare;        // variabile per determinazione valore velocità inviato serialmente
const char bchar = 'b'; // variabile per determinazione valore posizione inviato serialmente
char Ready;            // variabile di ritorno dal VBE2010 per determinare il riconoscimento del tipo di valore da inviare (posizione o velocità)

void setup() {
  Serial.begin(9600);    // inizializzazione porta seriale nativa USB
  int btot = 0;          // definizione valore iniziale della variabile "btot"
  int bcompare = 0;      // definizione valore iniziale della variabile "bcompare"
  int velocita = 0;      // definizione valore iniziale della variabile "velocita"
  int velcompare = 0;    // definizione valore iniziale della variabile "velcompare"
  pinMode(foto1, INPUT); // definizione del modo del PIN 2
  pinMode(foto2, INPUT); // definizione del modo del PIN 3
  pinMode(foto3, INPUT); // definizione del modo del PIN 4
  pinMode(foto4, INPUT); // definizione del modo del PIN 5
  pinMode(foto5, INPUT); // definizione del modo del PIN 6

}

void loop() {
  if (digitalRead(foto1) == HIGH) { // verifica stato PIN 2; se alto somma il valore che la variabile "btot" ha in quel momento al valore di "b1" restituendo un "btot" modificato.
    btot += b1;
  }
  if (digitalRead(foto2) == HIGH) { // verifica stato PIN 3; se alto somma il valore che la variabile "btot" ha in quel momento al valore di "b2" restituendo un "btot" modificato.
    btot += b2;
  }
  if (digitalRead(foto3) == HIGH) { // verifica stato PIN 4; se alto somma il valore che la variabile "btot" ha in quel momento al valore di "b3" restituendo un "btot" modificato.
    btot += b3;
  }
  if (digitalRead(foto4) == HIGH) { // verifica stato PIN 5; se alto somma il valore che la variabile "btot" ha in quel momento al valore di "b4" restituendo un "btot" modificato.
    btot += b4;
  }
  if (digitalRead(foto5) == HIGH) { // verifica stato PIN 6; se alto somma il valore che la variabile "btot" ha in quel momento al valore di "b5" restituendo un "btot" modificato.
    btot += b5;
  }
  if (btot != bcompare) {         // comparazione variabili "btot" e "bcompare"; se diverse si eseguirà quanto segue:
    bcompare = btot;              //  salvataggio valore di "btot" in "bcompare" e
    Ready = '0';                  //  azzeramento variabile "Ready" e
    Serial.print(bchar);          //  invio del carattere determinate il valore della posizione e
    if (Serial.available()) {      //  verifica transito dati in ingresso nella porta seriale USB e
      Ready = Serial.read();        //  acquisizione dei dati in transito nella porta seriale USB e
      if (Ready == 'k') {           //  verifica che i dati in transito per la porta seriale USB siano la conferma di riconoscimento da parte del VBE2010 del valore da inviare e
        Serial.print(bcompare);   //  invio, tramite seriale USB, del valore di "bcompare" al VBE2010 e
        btot = 0;                 //  azzeramento di "btot" in preparazione al nuovo ciclo.
      }
    }
  }

  analogRead(anemometro);                  // lettura valore rilevato nell'ingresso analogico A0 collegato all'anemometro.
  velocita = map(anemometro, 0, 1023, 0, 1023); // utilizzo funzione "map" per linearizzazione da valore ingresso analogico a velocità vento in m/s.
  if (velocita != velcompare) {              // comparazione variabili "velocita" e "velcompare"; se diverse si eseguirà quanto segue:
    velcompare = velocita;                   //  salvataggio valore di "velocita" in "velcompare" e
    Ready = '0';                             //  azzeramento variabile "Ready" e
    Serial.print(vchar);                     //  invio del carattere determinate il valore della velocità e
    if (Serial.available()) {                 //  verifica transito dati in ingresso nella porta seriale USB e
      Ready = Serial.read();                   //  acquisizione dei dati in transito nella porta seriale USB e
      if (Ready == 'k') {                      //  verifica che i dati in transito per la porta seriale USB siano la conferma di riconoscimento da parte del VBE2010 del valore da inviare e
        Serial.print(velcompare);              //  invio, tramite porta USB, del valore "velcompare".
      }
    }
  }
}

nel setup NON devi mettere di nuovo int. Altrimenti le ricrei li con stesso nome ma altra variabile.
Quindi in setup metti solo bcompare=0; senza quegli int

Buongiorno nid69ita, grazie per la risposta...quindi "l'intoppo" è che ho dichiarato alcune int come varabili globali e poi reinserendo le stesse int in setup è come se avessi creato 2 variabili, globale e locale (?) con lo stesso "nome" e l'arduino "preferisce" gestire quella locale che ad ogni ciclo si resetta!? Appena possibile modifico e provo. Scusatemi se chiedo doppie conferme ma questo è il primo codice che scrivo in assoluto ed ho ancora molto da imparare.

Le variabili locali dentro alla setup() nascono e muoiono li dentro. Dentro alla setup() quando ti riferisci alla bcompare è quella locale che tu azzeri.

Nella loop() la bcompare che viene vista è solo quella globale. Però non viene azzerata. Non sono sicuro sia questo il problema, ma intanto l'azzeramento sarebbe da correggere nella setup() togliendo quelle int.

ok chiaro; correggo e faccio sapere. per il momento grazie della spiegazione.

Le variabili globali vengono azzerate in automatico, anche se per "sicurezza" e chiarezza dello sketch puoi forzare l'azzeramento.

Ma quei fotosensori quando diventano high per quanto tempo lo fanno ? Mi pare che non hai dei delay() nella loop, potrebbe essere che btot arrivi a sfondare il valore max (int=2 byte -32768 +32767).

Aggiungere anche una print di bcompare, per verificare se quel pezzo viene eseguito

if (btot != bcompare) {         // comparazione variabili "btot" e "bcompare"; se diverse si eseguirà quanto segue:
    bcompare = btot; 
    Serial.println(bcompare);

I fotosensori funzionano da encoder per capire la posizione di un oggetto; quindi saranno HIGH o LOW , diciamo, permanentemente e non con variazione continua. Nel mio ragionamento alla fine di if(btot != bcompare) ho inserito btot = 0; in modo da resettare, appunto, la variabile...dovrebbe essere così giusto?

if (btot != bcompare) {         
    bcompare = btot;              
    Ready = '0';                  
    Serial.print(bchar);          
    if (Serial.available()) {     
      Ready = Serial.read();        
      if (Ready == 'k') {            
        Serial.print(bcompare);  
       [b] btot = 0;[/b]

ORSO2001: la mia intenzione è quella di comparare due variabili int (btot, bcompare); se diverse bcompare prende il valore di btot ed eseguo un'azione; se uguali non faccio alcunche. Purtoppo sembra che bcompare non acquisisca il valore di btot,

La tua frase ha quel "sembra" che non mi piace. Quello che devi fare è inserire una stampa (per essere sicuro) di bcompare dopo che le hai assegnato btot. Come ti ho suggerito sopra. Altrimenti se non c'e' certezza che passa da li... difficile andare avanti. Non avendo il tuo hw non posso fare prove. Devi mettere dei Serial.print nel programma per capire lo stato delle variabile (cosa contengono) in certi punti.

Inoltre, almeno per me, non è chiaro cosa non fa secondo te. Spedendo 'k' non stampa ?

Poi, la parte anemometro, non serve per ora vero ? Perchè questa map non ha nessun senso: velocita = map(anemometro, 0, 1023, 0, 1023);

prima di tutto grazie per la pazienza e per la disponibilità; ho risolto il mio mistero. Il problema sta all'interno del primo "if" dove vado subito a far equivalere btot con bcompare annullando le seguenti "if" (per l'invio seriale). Hi risolto scorporando la seconda e terza "if" ed includendo una condizione; in pratica sono passato da:

  if (btot != bcompare) {        
    bcompare = btot;             
    Ready = '0';                  
    Serial.print(bchar);          
    if (Serial.available()) {    
      Ready = Serial.read();     
      if (Ready == 'k') {        
        Serial.print(bcompare);  
        btot = 0;                
      }
    }
  }

a:

  if (btot != bcompare && transizione != 1) {         /
    bcompare = btot;             
    Ready = '0';                  
    Serial.println(bchar);          
    transizione = 1;
  }
  if (transizione == 1 && Serial.available()) {   
    Ready = Serial.read();      
    if (Ready == 'k') {         
      Serial.println(bcompare);   
      transizione = 0;

    }
  }
  btot = 0;

sicuramente si può scrivere meglio di così e adesso mi ci metto. giusto per info il "map" che faccio uguale (0,1023,0,1023) è perchè ancora non conosco la conversione dello strumento che andrò a leggere; K invece è la conferma di ricezione di una delle due variabili char che poi autorizza all'invio del valore relativo. grazie ancora

Sai usare i vettori/array ? Senza incasinare troppo, inizia a cambiare il numero a quelle variabili fotoX e bX falli partire da 0 invece che da 1 e poi ne riparliamo.