[risolto] variabile che non si aggiorna

salve,
nello sketch che segue la variabile lastRadio, una "byte" che fa da semplice contatore non si aggiorna :0
se la faccio incrementare all'interno del loop, fuori dal "if (ricevitore)" funziona, ma dentro all'if rimane sempre a zero.
non riesco a spiegarmi il motivo
quando ricevitore() è true entra nell'if, esegue correttamente tutto il codice tranne l'incremento della variabile.
come prima ipotesi ho pensato alla ram esaurita, ma freeMemory() mi segnala 570 byte di memoria libera, che è più di un quarto del totale, quindi credo non sia quello il problema.
cosa mi sfugge??

#include <SPI.h>
#include <digitalWriteFast.h>
#include "iBoardRF24.h"
#include <Ethernet.h>
#include <HttpClient.h>
#include <Xively.h>

#include <MemoryFree.h>

////////////////////RF24//////////////////////////
iBoardRF24 radio(3,8,5,6,7,2);  //ce,csn,mosi,miso,sck,irq

const uint64_t pipes[1] = { 
  0xB1B2B3B401LL };
char receivePayload[31];

////////////////////XIVELY//////////////////////////
byte mac[] = { 
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
char xivelyKey[] = "QvWc2WkWnwSmgiTB5d3TYMHmEbQJff7A1I0U9WDLGuIsGSqa";

char UmidId[] = "Umidita";
char TempId[] = "Temperatura";
char VentId[] = "Vento";
char DirezId[] = "Direzione";
char PressId[] = "Pressione";
char PioggId[] = "Pioggia";

XivelyDatastream datastreams[] = {
  XivelyDatastream(TempId, strlen(TempId), DATASTREAM_FLOAT),
  XivelyDatastream(UmidId, strlen(UmidId), DATASTREAM_FLOAT),

  XivelyDatastream(VentId, strlen(VentId), DATASTREAM_FLOAT),
  XivelyDatastream(DirezId, strlen(DirezId), DATASTREAM_FLOAT),
  XivelyDatastream(PressId, strlen(PressId), DATASTREAM_FLOAT),
  XivelyDatastream(PioggId, strlen(PioggId), DATASTREAM_FLOAT),
};

XivelyFeed feed(906360956, datastreams, 6 /* number of datastreams */);
EthernetClient client;
XivelyClient xivelyclient(client);
///////////////////////////////////////////////////


void setup( ) {  
  Serial.begin(9600);

  radio.begin();
  radio.setDataRate(RF24_250KBPS);
  radio.setPALevel(RF24_PA_MAX);
  radio.setChannel(37);
  radio.enableDynamicPayloads();
  radio.setRetries(15,15);
  radio.setCRCLength(RF24_CRC_16);

  radio.openWritingPipe(pipes[0]);
  radio.openReadingPipe(1,pipes[1]);

  while (Ethernet.begin(mac) != 1) {
    Serial.println("Error getting IP address via DHCP, trying again...");
    delay(300);
  } 
  Serial.println("base meteo");

  radio.startListening();
}

byte len, pipe = 0;

char lastReceivePayload[10];
unsigned long lastMillisPayload;
float Temperatura, Umidita, Pioggia = 0;
int Pressione, Vento, Direzione, i = 0;  
char tmp[10];


boolean check = true;
byte lastRadio = 0; 
//   lastRadio=millis();


void loop( ) { 

  Serial.println(lastRadio);

  if ( ricevitore() ) {
    Serial.print("freeM=");
    Serial.println(freeMemory());

    ++lastRadio;

    check = false;
    Serial.println(receivePayload);

    switch ( receivePayload[0] ) {
      //////////////////
    case 'T':

      for ( i=2; i< sizeof(receivePayload); i++) {
        tmp[i-2] = receivePayload[i];
      }
      Temperatura = atof(tmp);
      Serial.print("Temp:");      
      Serial.println(Temperatura);
      datastreams[0].setFloat(Temperatura); 
      break;
      //////////////////
    case 'P':
      for ( i=2; i< sizeof(receivePayload); i++) {
        tmp[i-2] = receivePayload[i];
      }
      Pressione = atof(tmp);
      Serial.print("Pres:\t");      
      Serial.println(Pressione);
      break;
      //////////////////
    case 'U':
      for ( i=2; i< sizeof(receivePayload); i++) {
        tmp[i-2] = receivePayload[i];
      }
      Umidita = atof(tmp);
      Serial.print("Umid:\t");      
      Serial.println(Umidita);
      datastreams[1].setFloat(Umidita); 
      break;
      //////////////////
    case 'A':
      for ( i=2; i< sizeof(receivePayload); i++) {
        tmp[i-2] = receivePayload[i];
      }
      Pioggia = atof(tmp);
      Serial.print("Piog:\t");      
      Serial.println(Pioggia);
      break;
      //////////////////
    case 'V':
      for ( i=2; i< sizeof(receivePayload); i++) {
        tmp[i-2] = receivePayload[i];
      }
      Vento = atof(tmp);
      Serial.print("Vento:\t");      
      Serial.println(Vento);
      break;

      //////////////////
    case 'D':
      for ( i=2; i< sizeof(receivePayload); i++) {
        tmp[i-2] = receivePayload[i];
      }
      Direzione = atof(tmp);
      Serial.print("Direz:\t");      
      Serial.println(Direzione);
      break;
    }  
  }


  //  Serial.println(check);
  //  unsigned long time = millis();

  //  if   ( time > lastRadio + 5000)    {
  if   ( lastRadio > 5)    {
    //    lastRadio = 0;
    //    Serial.print(time);    
    Serial.print(" xxxxxxxx\t");    
    //    Serial.println(lastRadio);
    if (  !check ) {   
      check = true;
      //  Ethernet.begin(mac);
      Serial.print("Upload:\t");
      int ret = xivelyclient.put(feed, xivelyKey);
      Serial.println(ret);
      client.stop();
      radio.startListening(); 
      delay (5);
    } 
  }
}

Non credo c'entri, ma prova a cambiare questo:

++lastRadio;

in questo

lastRadio++;

E per verificare metti anche una println() prima e dopo:

Serial.println(lastRadio);
lastRadio++;
Serial.println(lastRadio);

grazie nid, avevo già provato tutte le sintassi possibili senza notare differenze.
però mettendo i due print che mi hai consigliato ho scoperto che in realtà la variabile si incrementa, ma al loop successivo tornava a zero.
allora mi è venuto in mente di spostare la dichiarazione della variabile PRIMA del setup() e...... così funziona!
ma perchè?
ad ogni loop viene eseguito anche il codice che si trova tra setup() e loop()? io ero convinto di no.

Ric ...
... te lo volevo scrivere ... quel codice, messo così ... "nun se poteva guarda'" XD XD XD

Ma che modo di programmare è spargendo le dichiarazioni di variabili a destra e a sinistra ???

Un po' d'ordine ... che caspita ... XD XD XD

Guglielmo

P.S. : L'IDE ha il brutto vizio di riorganizzare le cose e ... non oso immaginare dove aveva messo quelle variabili ... :wink:

Di solito le variabili globali è meglio metterle tutte all'inizio, per leggibilità.
Però, almeno in C++ (in teoria), le puoi anche dichiarare dove le hai messe tu e dovrebbero essere comunque globali. Strano le abbia viste come se fossero "locali"

Nid ... trascuri ...

gpb01:
P.S. : L'IDE ha il brutto vizio di riorganizzare le cose e ... non oso immaginare dove aveva messo quelle variabili ... :wink:

Guglielmo

in effetti il disordine non manca :P, ma sono ancora in fase di test (taglio e cucio come capita), una volta finito avrei ripulito e riordinato tutto, anche a me da il mal di testa leggere il codice in quel modo.
la cosa strana è che in quel punto ho dichiarato anche altre variabili che non hanno dato nessun problema.
vabbè, ad ogni modo ho imparato che l'ordine non è solo una questione estetica :smiley:
grazie a tutti