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.
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");
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.
//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
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]
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.
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)