Array e millis come funzionano insieme?

pure a me

....okkio...potresti pentirti😁

lo so Guglielmo , ci ho provato e riprovato.
Allego il codice che uso come "muletto" . Così magari verificate cosa sto pasticciando

int valori[480];   //definisco un array da 480
int somma = 0;     //variabile per somma vaori
float media = 0;   //variabile per media


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

void loop() {

  for (int i = 0; i < 480; i++) { //avevo inserito qui if tempo // ma sballa tutto.
    valori[i] = 1 ;  //al momento assegno a i il valore uno , poi lo sostituirò con la variabile ricavata in altra funzione
    delay (50);
  }
  somma = 0;

  for (int i = 0; i < 480; i++) {
    somma = somma + valori[i];  //ottengo la media
  }
  Serial.print("somma= ");
  Serial.println(somma);

  media = somma / 480;
  Serial.print("media= ");
  Serial.println(media);

}

Se vuoi usare una logica non bloccante il for non lo puoi usare.
Il loop() è già un ciclo che si ripete all'infinito, devi fare tutto col loop().
Una cosa simile, partendo dall'esempio che aveva messo guglielmo qualche post fa:

#define PERIODO_ACQ    180

unsigned long lastMillisAcq = 0;

long valore = 0;
float media = 0.0;

int i = 0;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:

  if ( millis() - lastMillisAcq > PERIODO_ACQ ) {
     lastMillisAcq = millis();

     valore += 6; // accumuli le letture dei valori
     i++; // incrementi il contatore
     Serial.println(i);
  }

  if (i >= 480) {
    media = valore / 480;
    Serial.print("media: ");
    Serial.println(media);
  }

}

E' da sistemare, ma può essere un punto di partenza.

Fantastico punto di partenza! Grazie , ogni volta che sento di voler abbandonare Arduino ,
trovo tra voi un salvagente.

valore=+6; 6 sarebbe ?

il + va prima dell'=... è la forma "abbreviata" di

valore = valore + 6;

ok, ma 6?

Un valore a caso... nel tuo esempio usavi 1, io ho usato 6...
Ovviamente devi leggere il valore del tuo sensore

Ah ok !
Tra oggi e domani (cioè stanotte) ci smanetto sopra.

Grazie e buona serata !

Claudio

FUNZIONA
(si, ho letto il punto del regolamento che dice che scrivere in maiuscolo equivale ad urlare ; ma è quello che sto facendo :relaxed:)

Seriamente , sono gasatissimo. Oramai era diventato un vero e proprio cruccio , per me.
Grazie a tutti , con una menzione particolare a fratt , che mi ha indirizzato come avevo necessità.
Ora come ora l'ho testato al volo sullo sketch muletto (mi sto creando degli esempi che archivio come tali per il futuro e per imparare).
Vi allego il sopracitato con le descrizioni "personali" ; perché? credo sia il minimo , per riconoscenza e per i posteri.

#define PERIODO_ACQ    180
unsigned long lastMillisAcq = 0;
long valore = 0;    //variabile contatore
float media = 0.0;  //variabile calcolo media contatore
int watt = 1;       //adesso è impostato a 1 ma sarà watt nel progetto completo
int i = 0;          //variabile di incremento che forse sarà uguale a watt , devo verificare

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

void loop() {

  if ( millis() - lastMillisAcq > PERIODO_ACQ ) {
    lastMillisAcq = millis();
    valore += watt;         // accumulo le letture
    i++;                    // incremento il contatore , sommo i valori
    Serial.println(i);      //tengo traccia delle letture in tempo reale
  }

  if (i >= 480) {            //se e soprattutto quando i è uguale e maggiore di 480
    media = valore / 480;    //posso calcolare il valore medio
    Serial.print("media: "); //scrivo
    Serial.println(media);   //scrivo
    delay(1000);             //piccola pausa
  }
  if (i >= 480) {            //se e soprattutto quando i è uguale e maggiore di 480
    i = 0;                   //riporto a zero i valori , pronto per un nuovo ciclo
    valore = 0;              //riporto a zero i valori , pronto per un nuovo ciclo
  }
}

Grazie.

Claudio

Perdona eh, ma è dal post #12 che ti ho detto che dovevi usare questa forma (confronta e vedrai) ...

... possibile che ti hanno dovuto imboccare proprio la "pappa fatta" ? ... non era difficile e ti avevo ben detto come dovevi fare ... bastava lavorarci un po' su invece di arrendersi subito ... :roll_eyes:

Guglielmo

Non posso certamente negare l'evidenza, però io mica lo sapevo che si poteva fare : valore+=watt e soprattutto i++ fuori dalle parentesi del for.
Non puoi immaginare cosa ho provato a mettere in quelle parentesi :smirk:.
insistevo col ciclo for e tutte le mie ricerche si basavano sugli Array...adesso sono pure capace di leggere l'indice di un vettore :grimacing:. e scriverlo !

... beh, quella è sintassi del 'C' e ... avremo detto migliaia di volte che su Arduino, con i soli copia/incolla NON si va molto avanti e che quindi ... almeno le BASI del 'C' tocca studiarle! Al punto 16.1 del REGOLAMENTO ci sono anche una serie di link ed un ottimo libro ... :roll_eyes:

Guglielmo

Hai ragione. La tentazione del copia/incolla è molto forte... comprato ora il libro di citato, arriverà domani :wink:. Grazie della dritta. Buona domenica.

Claudio

L'ultimo IF lo puoi inglobare nel precedente

#define PERIODO_ACQ    180
unsigned long lastMillisAcq = 0;
long valore = 0;    //variabile contatore
float media = 0.0;  //variabile calcolo media contatore
int watt = 1;       //adesso è impostato a 1 ma sarà watt nel progetto completo
int i = 0;          //variabile di incremento che forse sarà uguale a watt , devo verificare

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

void loop() {

  if ( millis() - lastMillisAcq > PERIODO_ACQ ) {
    lastMillisAcq = millis();
    valore += watt;         // accumulo le letture
    i++;                    // incremento il contatore , sommo i valori
    Serial.println(i);      //tengo traccia delle letture in tempo reale
  }

  if (i >= 480) {            //se e soprattutto quando i è uguale e maggiore di 480
    media = valore / 480;    //posso calcolare il valore medio
    Serial.print("media: "); //scrivo
    Serial.println(media);   //scrivo
    delay(1000);             //piccola pausa
    i = 0;                   //riporto a zero i valori , pronto per un nuovo ciclo
    valore = 0;              //riporto a zero i valori , pronto per un nuovo ciclo
  }
}
1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.