Media valori temperatura

Ho scritto uno sketch che rileva i valori della temperatura da un tmp36 e lo scrive su lcd, ma non riesco a fare la media, mi date una mano?
il programma deve sommare i valori e dividerli per il numero dei valori.

const int SensorPin = A0;
float sommaGradi = 0;
#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
Serial.begin(9600);
lcd.print("Creato da:");
lcd.setCursor(0,2);
lcd.print("Alessandro Riva");
delay(3000);

}

void loop() {
int sensorVal = analogRead(SensorPin);
lcd.clear();
float voltage = (sensorVal /1024.0) * 5.0;
float temperature = (voltage - .5) * 100;
for ( int i = 0; i<=9;i++);
{
sommaGradi =+ temperature;
delay(10);
}
sommaGradi= sommaGradi / 9;
Serial.print ("Gradi: ");
Serial.println(sommaGradi);
lcd.print("Temperatura:");
lcd.setCursor(0,2);
lcd.print(sommaGradi);
lcd.print(" Gradi");

delay(500);
}

Lo sketch legge una sola temperatura, la somma con se stessa 9 vole e poi divide per nove ottenndo la temperatura iniziale.
Se vuoi fare più letture devi mettere tutto nel ciclo for.

const int SensorPin = A0;
#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
  // set up the LCD's number of columns and rows: 
  lcd.begin(16, 2);
  Serial.begin(9600);
  lcd.print("Creato da:");
  lcd.setCursor(0,2);
  lcd.print("Alessandro Riva");
  delay(3000);


}

void loop() {
  float sommaGradi = 0;
  lcd.clear();
  for ( int i=0; i<=9; i++) 
  {
    int sensorVal = analogRead(SensorPin);
    float voltage = (sensorVal /1024.0) * 5.0;
    float temperature = (voltage - 0.5) * 100.0;
    sommaGradi =+ temperature;
    delay(10);
  }
  sommaGradi = sommaGradi / 9;
  Serial.print ("Gradi: ");
  Serial.println(sommaGradi);
  lcd.print("Temperatura:");
  lcd.setCursor(0,2);
  lcd.print(sommaGradi);
  lcd.print(" Gradi");
  delay(500);
}

inoltre dopo il for non ci vuole il ; a meno che non hai un solo comando dopo.

 for ( int i=0; i<=9; i++);
  {
   a++;
  }

il for ha un ciclo vuoto e a++ viene eseguito solo una volta.

Senza invece

 for ( int i=0; i<=9; i++)
  {
   a++;
  }

il ciclo è costituito da tutto quello che c'è tra le parentesi, a++ è eseguito 9 volte.

Ok, ho capito e ho risolto in questo modo:

//programma interamente creato e commentato da Alessandro Riva per Arduino
// www.alessandro-riva-elettronica.blogspot.com
int temperaturaMassima = 27;
const int SensorPin = A0; //variabile lettura sensore
float valori[10]; //array con i valori
int T_campionamento = 10; // tempo campionamento
float sommaGradi; //variabile somma
float mediaGradi; //variabile media
#include <LiquidCrystal.h> // includo la libreria del display lcd

LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //pin display LCD

void setup() {
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
Serial.begin(9600); //inizializzo la seriale
lcd.print("Creato da:");
lcd.setCursor(0,2);
lcd.print("Alessandro Riva");
delay(3000);
pinMode(13,OUTPUT);
digitalWrite(13,LOW);

}

void loop() {
int sensorVal = analogRead(SensorPin);

float voltage = (sensorVal /1024.0) * 5.0;
float temperature = (voltage - .5) * 100;
for ( int i = 0; i<=10;i++)
{
valori* = temperature;*

  • delay(T_campionamento);*
  • }*
  • sommaGradi = 0; // devi essere sicuro che il primo valore sia zero, altrimenti poi sballa tutto*
  • for(int i=0; i<10; i++) { //ciclo che somma i valori dell'array*
    _ sommaGradi = sommaGradi + valori*;_
    _
    }_
    _
    mediaGradi = sommaGradi / 10; //divido la somma dei valori per il loro numero (media)_
    _
    lcd.clear(); //pulisco lo schermo*_
    _ Serial.print ("Gradi: "); //scrivo sul display la parola "gradi"
    Serial.println(mediaGradi); //scrivo la temperatura sulla seriale_

    * lcd.print("Temperatura:"); //scrivo sul display la parola "temperatura"*
    * lcd.setCursor(0,2); //sposto il cursore sulla seconda linea*
    * lcd.print(mediaGradi); //scrivo la temperatura*
    * lcd.print(" Gradi"); // scrivo sul display la parola "gradi"*
    if (mediaGradi >temperaturaMassima)
    {
    * digitalWrite(13,HIGH);*
    }
    * else {*
    * digitalWrite(13,LOW);*
    }
    * delay(500);*
    }
    [/quote]

Per il codice dei usare il tag code e non il tag quote perchè fa scomparire alcuni simboli, ad esempio il vettore valori nel ciclo for.
Leggi i punti 7, 8 e 9 --> [REGOLAMENTO] Come usare questa sezione del forum - Italiano - Arduino Forum
Col tasto modify puoi rieditare i tuoi post e cambiare i tag.

Comunque se non metti l'analogRead all'interno di un ciclo avrai solo una lettura per loop. E' inutile che ne fai la media.

PaoloP:
Comunque se non metti l'analogRead all'interno di un ciclo avrai solo una lettura per loop. E' inutile che ne fai la media.

Sì, il secondo codice è sostanzialmente uguale al primo.

PaoloP:
Per il codice dei usare il tag code e non il tag quote perchè fa scomparire alcuni simboli, ad esempio il vettore valori nel ciclo for.

Ho usato la funzione "copia per il forum nell'ide"
Il codice l'ho corretto così e adesso funziona, prima registrava sempre gli stessi valori.

//programma interamente creato e commentato da Alessandro Riva per Arduino
// www.alessandro-riva-elettronica.blogspot.com
int temperaturaMassima = 27;
const int NRLETTURE = 12; // numero letture
const int SensorPin = A0; //variabile lettura sensore
float valori[NRLETTURE]; //array con i valori
int T_campionamento = 80; // tempo campionamento
float sommaGradi; //variabile somma
float mediaGradi; //variabile media
#include <LiquidCrystal.h> // includo la libreria del display lcd

LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //pin display LCD

void setup() {
  // set up the LCD's number of columns and rows: 
  lcd.begin(16, 2);
  Serial.begin(9600); //inizializzo la seriale
  lcd.print("Creato da:");
  lcd.setCursor(0,2);
  lcd.print("Alessandro Riva");
  delay(3000);
  pinMode(13,OUTPUT);
  digitalWrite(13,LOW);
 

}

void loop() {
  
  for ( int i = 0; i<=NRLETTURE;i++)
  {
    int sensorVal = analogRead(SensorPin);
 
  float voltage = (sensorVal /1024.0) * 5.0;
  float temperature = (voltage - .5) * 100;
    valori[i] = temperature;
    delay(T_campionamento);
  }
   sommaGradi = 0; // devi essere sicuro che il primo valore sia zero, altrimenti poi sballa tutto
  for(int i=0; i<NRLETTURE; i++) { //ciclo che somma i valori dell'array
    sommaGradi = sommaGradi + valori[i];
  }
     mediaGradi = sommaGradi / NRLETTURE; //divido la somma dei valori per il loro numero (media)
      lcd.clear(); //pulisco lo schermo
  Serial.print ("Gradi: "); //scrivo sul display la parola "gradi"
  Serial.println(mediaGradi); //scrivo la temperatura sulla seriale
  lcd.print("Temperatura:"); //scrivo sul display la parola "temperatura"
  lcd.setCursor(0,2); //sposto il cursore sulla seconda linea
  lcd.print(mediaGradi); //scrivo la temperatura
  lcd.print(" Gradi"); // scrivo sul display la parola "gradi"
if (mediaGradi >temperaturaMassima)
{
  digitalWrite(13,HIGH);
  Serial.println("Temperatura raggiunta!!!!");
}
  else {
   digitalWrite(13,LOW);
}

  delay(500);
}

alex27riva:
Ho usato la funzione "copia per il forum nell'ide"

Che è meglio non usare. Crei infatti dei blocchi lunghissimi. Col tag code invece viene messo in un'area di testo che puoi scorrere con le maniglie laterali.

PS:
Nel tuo codice fai 2 cicli for, nel primo leggi i dati e memorizzi i valori in un array, nel secondo fai la media. Perché non fai tutto in un unico for? Risparmi tempo ed eviti di usare un vettore.

leo72:
PS:
Nel tuo codice fai 2 cicli for, nel primo leggi i dati e memorizzi i valori in un array, nel secondo fai la media. Perché non fai tutto in un unico for?

Si, è vero posso mettere tutto dentro un solo ciclo.

leo72:
Risparmi tempo ed eviti di usare un vettore.

Cos'è un vettore?

array=vettore  =>   int arr[4];    // da 0-3
perciò ha 4 elementi che possono contenere valori interi  ->  arr[0], arr[1], arr[2], arr[3]

nel tuo codice è la variabile "valori"
Non è una unica "cella" per memorizzare un valore, ma più "celle" delle stesso tipo, che indirizzi tramite un unico nome ma indice diverso (da 0 a n-1)

ok, grazie ho capito.

Vettore = array
Matrice = array multidimensionale