Go Down

Topic: ottenere la media di valori letti tramite igrometro (Read 491 times) previous topic - next topic

Francois88

Jan 21, 2020, 07:41 pm Last Edit: Jan 21, 2020, 07:58 pm by Francois88
Buonasera ragazzi. Scusate se mi faccio sentire adesso dall'ultima conversazione inerente alla misura deli valori letti tramite igrometro.
Ad oggi sono riuscito a leggere i valori dell'igrometro e salvarli tramite array. I valori salvati vengono divisi per il numero totale dei rilievi cosi da ottenere la media.
Andiamo al problema:

Quello che vorrei realiazzare è un arrey con dieci valori letti ogni 6 minuti (o comunque da veriare in base alle circostanze), quindi 10 valori ogni ora e  la somma dei dici valodi dividela per 10.
Alla fine il ciclo deve ricominciare cosi da potere ottenere la nuova media della "seconda ora".




lo Sketch lo trovate di seguito

Code: [Select]

int igrostampa;  //variabile intera che misura il valore di umidità dell'igrometro e serve per la stampa
float valori[10];
float media = 0;



void setup() {

Serial.begin (9600);
  

for (int i = 0; i<10; i++){  //ciclo for per i 10 valori misurati dall'igrometro
valori [i] = analogRead (A0);
}
}



void loop() {
  
float media = 0; //inizializza il calcolo della media da 0
for (int i = 0; i<10; i++){  //leggi 10 valori tramite il ciclo for
    media = media + valori [i]; //la media è uguale alla media (che parte da 0) + 10 valori
  }
  media = media/10;  //la media è uguale alla media (cioè i 10 valori letti tramite ciclo for) /10
  Serial.print(" media: ");
  Serial.println(media); //stampa il risultato del calcolo media






}


Silente

Io ti darei un consiglio: come hai descritto puoi avere la media di un ora, soltanto alla fine di essa. Io ti consiglio, a livello generale, di crearti la media dell'ultima ora, usando un array in maniera circolare, cosí da avere una media sempre aggiornata.
Dove va un numero va una variabile, una funzione e/o  un test.
Per ottenere devi spiegare

Strumenti/Formattazione automatica fino alla morte!
Cristianesimo:bibbia='C':K&R

fabpolli

Si ma il problerma qual'è? Nel senso che il programma che hai messo fa quello che desideri, tolto che non lo fa ogni sei minuti e ch non azzera alla fine dell'ora, cosa non ti riesce? Leggere ogni 6 minuti? Azzerare l'array alla fine delle 10 letture?
@Silente, se usa un array circolare non ha la media ora per ora ma una media continua, non che sia errato, ma non è quelle che vuol fare l'utente o quantomeno non è quello che ha descritto a parole.

Datman

Hi,I'm Gianluca from Roma.I play&work with electronics since I was16(1984).
After 25yrs of maintenance on cameras&video mixers,since 2013myJob is HDTVstudios design.
Since Jan2015 IPlayWith Arduino:bit.ly/2F3LPWP
Thanks 4 a Karma if U like my answer

fabpolli

#4
Jan 22, 2020, 09:55 am Last Edit: Jan 22, 2020, 09:56 am by fabpolli
Si ma dell'ultima ora partendo dal tempo t attuale, lui vuole una media distinta (completamente distinta) per i valori dalle 08:00 alle 09:00 e tra 09:00 e 10:00 e così via.
Non ne capisco il motivo ma, essendo le sue specifiche, mi adeguo :)

Francois88

Esatto fabpolli.... Quello che manca nel programma è:
1...Deve eseguire la lettura ogni sei minuti
2...ogni dieci letture ne deve fare la media
3...deve ricominciare le successive dieci letture per la seconda media


E così via all'infinito...

fabpolli

#6
Jan 22, 2020, 11:49 am Last Edit: Jan 22, 2020, 11:52 am by fabpolli
La parte che calcola la media la hai, allora parti dal punto 1, il tuo programma tra une lettura ed un altra deve fare qualcosa? Se no puoi pensare di usare fa funzione delay() (anche se te lo sconsiglio), se si devi temporizzare mediante l'uso della funzione millis() per capire le basi con cui si usa millis() consiglio prima la lettura di QUESTO post esplicativo, dopo di che lo studio di come si usa la funzione millis(), prima QUI, poi QUI e QUI e QUI e tutti gli articoli che sono in QUESTA pagina ... alla fine il tutto dovrebbe essere più chiaro :)
Inizia a memorizzare le varie letture intervallate del tempo che vuoi (invece che il for che hai nel setup), quando arrivi a dieci calcoli la media e la stampi, poi azzeri il contatore delle letture effettuate e tutto ricomincia da capo.
Ti consiglio caldamente l'approccio con millis(), anche se più difficile all'inizio, tanto poi ti accorgerai che tra una lettura e la successiva vorrai fare qualcosa, e se hai usato la funzione delay() non potrai far nulla e dovrai buttare tutto e riscrivere la logica del programma da zero. Uomo avvisato mezzo salvato ;)

nid69ita

#7
Jan 22, 2020, 12:02 pm Last Edit: Jan 22, 2020, 12:04 pm by nid69ita
Scusate, ma avete visto che nel programma postato la lettura analogRead(A0)  è SOLO nella setup?
@Francois88 ma sai che la setup() viene eseguita SOLO 1 volta all'accensione di Arduino ?
Poi nella loop()  fai la media SEMPRE degli stessi 10 valori, visto che NON leggi più l'igrometro ??
my name is IGOR, not AIGOR

nid69ita

#8
Jan 22, 2020, 12:09 pm Last Edit: Jan 22, 2020, 12:09 pm by nid69ita
Cerca di seguire quello che ti consiglia @fabpolli al post n.6
Cerca di usare millis(), tieni conto che la loop() è già un ciclo infinito, quindi metti una variabile contatore in generale, tra le variabili in alto (globali), sarà lei a dover tenere il conteggio da 0 a 9 (o da 1 a 10)

Poi ma variabile media, è inutile dichiararla 2 volte, questa nella loop()
float media = 0; //inizializza il calcolo della media da 0
NON inizializza solo ma la dichiara di nuovo,  metti solo     media=0;
my name is IGOR, not AIGOR

fabpolli

#9
Jan 22, 2020, 12:10 pm Last Edit: Jan 22, 2020, 12:11 pm by fabpolli
Lo visto con chiarezza, infatti ho indicato all'OP un possibile modo di procedere nel post precedente, e ho il forte dubbio che lo stesso OP stia chiedendo una stesura del programma che probabilmente ha difficolta o non sa fare, ma questo per me è escluso (e anche per il regolamento)
[EDIT] in contemporanea con il secondo post di @nid69ita

Francois88

Ottimo fabpolli..... Ora ci lavoro e poi riscrivo


Ora sistemo l analogRead
Grazie a tutti

nid69ita

#11
Jan 22, 2020, 02:01 pm Last Edit: Jan 22, 2020, 02:06 pm by nid69ita
analisi:
- dichiari variabile globale Contatore
- azzeri Contatore in setup()
- la loop() è già una ciclo infinito, quindi usando millis() fai qualcosa solo se sono passati 6 minuti (360 secondi ovvero 360000L millisecondi), per questa cosa vedi esempio blinkwithoutdelay e/o i link forniti prima.
ogni 6 minuti quindi cosa fai ? leggi con analogread(A0), scrivi il valore nel vettore(Contatore) e aumenti Contatore.
Se contatore è arrivato a 10, allora devi fare la media e stamparla. E azzeri Contatore.

Consiglio. Prima fai accendi/spegni ogni 6 secondi il led della Arduino Uno, usando millis().  Fai digitalWrite(LED_BUILTIN,! digitalRead(LED_BUILTIN));  (accende/spegne)
Farlo poi ogni 6 minuti è banale e poi aggiungere altro quando passano 6 minuti è step successivo.
my name is IGOR, not AIGOR

Francois88

ciao ragazzi.....ho scritto lo sketch come da vostro consiglio. Leggo i dieci valori dell'igrometro ogni 6 secondi (poi saranno ogni sei minuti una volta appurato che funzioni tutto).
Qui sotto un pezzo di programma:

Piccolo problema. Ogni valore misurato dal sensore viene stampato due volte. Ad esempio il valore numero zero viene stampato due volte in tempi millesimali diversi.
Inoltre la media a fine ciclo non è correta.
Potete darmi una mano
Grazie.


Code: [Select]

int media = 0;
int start = 0;
int valori [9] ;
int umrterr [9];

void setup() {
 Serial.begin (9600);
 start = millis();
 
 valori [9] = analogRead (A0);

 
}



void loop() {
if(millis()- start == 6000  ){
      valori [0] = analogRead (A0) ;
      umrterr [0] = map (valori[0],0, 1023, 100, 0 );
      Serial.print(" valore0: ");                                                                                                                           
      Serial.print(valori [0]);                                                                                                                           
      Serial.print(" umidità0%: ");                                                                                                                           
      Serial.println(umrterr[0]);                                                                                                                           

}


if(millis()- start == 12000){
      valori [1] = analogRead (A0) ;
      umrterr [1] = map (valori[1],0, 1023, 100, 0 );
      Serial.print(" valore1: ");                                                                                                                           
      Serial.print(valori [1]);
      Serial.print(" umidità1%: ");                                                                                                                           
      Serial.println(umrterr[1]);
}


if(millis()- start == 18000){
      valori [2] = analogRead (A0) ;
      umrterr [2] = map (valori[2],0, 1023, 100, 0 );
      Serial.print(" valore2: ");                                                                                                                           
      Serial.print(valori [2]);
      Serial.print(" umidità2%: ");                                                                                                                           
      Serial.println(umrterr[2]);
}


if(millis()- start == 24000){
      valori [3] = analogRead (A0) ;
      umrterr [3] = map (valori[3],0, 1023, 100, 0 );
      Serial.print(" valore3: ");                                                                                                                           
      Serial.print(valori [3]);
      Serial.print(" umidità3%: ");                                                                                                                           
      Serial.println(umrterr[3]);
}



if(millis()- start == 30000){
      valori [4] = analogRead (A0) ;
      umrterr [4] = map (valori[4],0, 1023, 100, 0 );
      Serial.print(" valore4: ");                                                                                                                           
      Serial.print(valori [4]);
      Serial.print(" umidità4%: ");                                                                                                                           
      Serial.println(umrterr[4]);
}



if(millis()- start == 36000){
      valori [5] = analogRead (A0) ;
      umrterr [5] = map (valori[5],0, 1023, 100, 0 );
      Serial.print(" valore5: ");                                                                                                                           
      Serial.print(valori [5]);
      Serial.print(" umidità5%: ");                                                                                                                           
      Serial.println(umrterr[5]);
}



if(millis()- start == 42000){
      valori [6] = analogRead (A0) ;
      umrterr [6] = map (valori[6],0, 1023, 100, 0 );
      Serial.print(" valore6: ");                                                                                                                           
      Serial.print(valori [6]);
      Serial.print(" umidità6%: ");                                                                                                                           
      Serial.println(umrterr[6]);
}



if(millis()- start == 48000){
      valori [7] = analogRead (A0) ;
      umrterr [7] = map (valori[7],0, 1023, 100, 0 );
      Serial.print(" valore7: ");                                                                                                                           
      Serial.print(valori [7]);
      Serial.print(" umidità7%: ");                                                                                                                           
      Serial.println(umrterr[7]);
}


if(millis()- start == 54000){
      valori [8] = analogRead (A0) ;
      umrterr [8] = map (valori[8],0, 1023, 100, 0 );
      Serial.print(" valore8: ");                                                                                                                           
      Serial.print(valori [8]);
      Serial.print(" umidità8%: ");                                                                                                                           
      Serial.println(umrterr[8]);
}



if(millis()- start == 60000){
      valori [9] = analogRead (A0) ;
      umrterr [9] = map (valori[9],0, 1023, 100, 0 );
      Serial.print(" valore9: ");                                                                                                                           
      Serial.print(valori [9]);
      Serial.print(" umidità9%: ");                                                                                                                           
      Serial.println(umrterr[9]);









float media = 0;
media =  valori [0] + valori [1] + valori [2] + valori[3] + valori [4] + valori [5] + valori [6] + valori [7] + valori [8] + valori [9];
media = media/10;
      Serial.print("                               media: ");                                                                                                                           
      Serial.println(media);
start = millis();
}
}

Datman

if(millis()- start == 6000  )
Questo if, così come gli altri, sono veri per un millisecondo intero!
Hi,I'm Gianluca from Roma.I play&work with electronics since I was16(1984).
After 25yrs of maintenance on cameras&video mixers,since 2013myJob is HDTVstudios design.
Since Jan2015 IPlayWith Arduino:bit.ly/2F3LPWP
Thanks 4 a Karma if U like my answer

Datman

Fai diversamente:
Code: [Select]
unsigned long valori[10];
byte indice=0;

  // loop():

if (millis()-start>5999)
  {
  start=millis();
  analogRead(A0);
  valori[indice]=analogRead(A0)*100/1023+0.5;
  ...
  if(indice==9)
    {
    media=0;
    for(byte x=0; x<10; x++)
      {media+=valori[x];}
    media=media/10+0.5;   
    indice+=1;
    if(indice>9) indice=0;
    }
  }
Hi,I'm Gianluca from Roma.I play&work with electronics since I was16(1984).
After 25yrs of maintenance on cameras&video mixers,since 2013myJob is HDTVstudios design.
Since Jan2015 IPlayWith Arduino:bit.ly/2F3LPWP
Thanks 4 a Karma if U like my answer

Go Up