Ciao a tutti! Ho un problema che non mi spiego...
dunque sto leggendo valori da una sonda NTC. Per la precisione leggo dieci valori e li salvo in un array e ogni dieci valori elimino i primi due più grandi e i primi due più piccoli per poi fare la media sui sei risultanti.
Ora quando rimuovo i più grandi ed i più piccoli li sostituisco con un valore fittizio (+ o - 10000) in modo che poi risultino 0 nella somma finale. Il tutto funziona se inizializzo un array che nel codice è commentato, ma smette quando leggo i valori da ntc.
int n = 0;
int i = 0;
void setup()
{
pinMode(n, INPUT);
Serial.begin(9600);
}
void loop()
{
int arraysala[10];// = {462, 462, 461, 462, 462, 461, 462 ,462, 462, 461};
int valore = analogRead(0);
Serial.print("valore letto ");
Serial.print(valore);
arraysala[i] = valore;
Serial.print(" array di posto ");
Serial.print(i);
Serial.print(" ci metto ");
Serial.println(arraysala[i]);
i = i+1;
if(i>9){
Serial.print("stampo l'array ");
for(int l = 0 ; l<10; l++){
Serial.print("in posizione ");
Serial.print(l);
Serial.print(" abbiamo ");
Serial.println(arraysala[l]);
}
int indmin = 0;
int indmax = 0;
int vmax = arraysala[0];
int vmin = arraysala[0];
for(int j = 1; j<=2; j++){
for(int k = 0; k<10; k++){
if(vmax <= arraysala[k] && arraysala[k] != 10000){
vmax = arraysala[k];
indmax = k;
}
}
Serial.print("max ");
Serial.println(indmax);
arraysala[indmax] = -10000;
}
for(int j = 1; j<=2; j++){
for(int k = 0; k<10; k++){
if(vmin >= arraysala[k] && arraysala[k] != -10000){
vmin = arraysala[k];
indmin = k;
}
}
Serial.print("min ");
Serial.println(indmin);
arraysala[indmin] = 10000;
}
i = 0;
float media = 0;
for(int l = 0 ; l<10; l++){
media = arraysala[l] + media;
}
media = media / 6;
Serial.print("media = ");
Serial.println(media);
}
delay(1000);
}
per semplicità vi posto anche lo strano (per me che non ho capito il problema) ouput:
valore letto 528 array di posto 0 ci metto 528
valore letto 528 array di posto 1 ci metto 528
valore letto 527 array di posto 2 ci metto 527
valore letto 528 array di posto 3 ci metto 528
valore letto 527 array di posto 4 ci metto 527
valore letto 527 array di posto 5 ci metto 527
valore letto 527 array di posto 6 ci metto 527
valore letto 527 array di posto 7 ci metto 527
valore letto 527 array di posto 8 ci metto 527
valore letto 527 array di posto 9 ci metto 527
stampo l'array in posizione 0 abbiamo 528
in posizione 1 abbiamo 528
in posizione 2 abbiamo 527
in posizione 3 abbiamo 528
in posizione 4 abbiamo 527
in posizione 5 abbiamo 527
in posizione 6 abbiamo 15
in posizione 7 abbiamo -16128
in posizione 8 abbiamo -30464
in posizione 9 abbiamo 527
max 3
max 1
min 8
min 8
media = -3912.83
ora mi pare evidente quale sia il problema. Nelle posizioni 6 7 e 8 restituisce dei valori che non ha mai preso in input e non so da dove li tiri fuori, visto che la stampa precedente sottolinea che tutto è andato a buon fine...suggerimenti?
Facendo la somma dei valori superi 32768 massimo supportato da un int, quindi sballa i conti.
Potresti usare un long per il vettore o sommare un valore più basso.
Ma non puoi sostituire zero'
Non credo sia quello il problema. Quello che non capisco è come mai in lettura in posizione 6 7 e 8 legge i valori 527, 527 e 527, li posiziona nell'array e poi, quando vado a vedere cosa c'è dentro l'array in quelle stesse posizioni mi ritorna 15, -16128 e -30464. Di conseguenza la media viene sballata, ma se nell'array ci fossero i valori che legge non ci sarebbero problemi. Non so se mi spiego!
---novità---
la lettura, se lasciata andare avanti, da sempre lo stesso problema, sempre nelle stesse posizioni dell'array! legge corretto, memorizza corretto, ritorna sbagliato!
---per PaoloP---
PaoloP:
Facendo la somma dei valori superi 32768 massimo supportato da un int, quindi sballa i conti.
Potresti usare un long per il vettore o sommare un valore più basso.
Ma non puoi sostituire zero'
non posso sostituire zero perchè è un valore che la sonda potrebbe restituire!
int n = 0;
int i = 0;
void setup()
{
pinMode(n, INPUT);
...
non puoi usare il pin D0 perché é usato dalla seriale.
analogRead() non ha bisogno del pinMode).
A me non si presenta il problema dei numeri negativi.
Il controllo dei 2 numeri piú grandi (piú piccoli) é errato. Non trova in modo ripetitivo i 2 numeri.
Devi inizializzare le variabili vmax e vmin con i valori min/ max possibili ovvereo con 0 e 1024 ogni volta che cerci un valore massino /minimo e non con il primo elemento del Array. Devi anche per il secondo giro eliminare il valore che prima avevi messo percui mettere 10000 per la ricerca del valore massimo
PaoloP:
Perchè inizializzi l'array a ogni inizio loop.
Vai a leggere in posizioni di memoria non ancora scritte.
Ho risolto con l'uso di Static, dopo averne scoperto l'esistenza!
uwefed:
poi
int n = 0;
int i = 0;
void setup()
{
pinMode(n, INPUT);
...
non puoi usare il pin D0 perché é usato dalla seriale.
analogRead() non ha bisogno del pinMode).
A me non si presenta il problema dei numeri negativi.
Il controllo dei 2 numeri piú grandi (piú piccoli) é errato. Non trova in modo ripetitivo i 2 numeri.
Devi inizializzare le variabili vmax e vmin con i valori min/ max possibili ovvereo con 0 e 1024 ogni volta che cerci un valore massino /minimo e non con il primo elemento del Array. Devi anche per il secondo giro eliminare il valore che prima avevi messo percui mettere 10000 per la ricerca del valore massimo