Quello che vedete a seguire è il codice con cui sto smanettando per rilevare la temperatura in due punti e mostrarla su un display. Funziona bene anche dopo aver sostituito il delay con il millis tuttavia ho notato un effetto che non mi è del tutto chiaro.
Come vedete il codice ora esegue 50 letture ed il valore T rilevato è molto prossimo a quello rilevato con altro termometro.
Inizialmente facevo fare 10 letture e mi veniva fuori un T più alto di due gradi circa.
Vorrei comprendere il motivo...
Altro effetto che non mi spiego è che aumentando le letture a 200...il codice sembra bloccarsi e non visualizza più nulla....
Vorrei anche qui capire il perchè.
Grazie anticipato a chi avrà la pazienza di leggere e rispondere.
const int NRLETTURE = 50; // numero letture
const int NRLETTURE2 = 50;
const int SensorPin = A0; //variabile lettura sensore
const int SensorPin2 = A1; // seconda variabileb sensore due
float valori[NRLETTURE]; //array con i valori
float valori2[NRLETTURE2];
float sommaGradi; //variabile somma
float mediaGradi; //variabile media
float sommaGradi2;
float mediaGradi2;
#include <LiquidCrystal.h> // include la libreria del display lcd
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //pin display LCD
long previousMillis = 0; // prova millis
long interval = 1000; // prova millis
void setup()
{
lcd.begin(16, 2); // set up the LCD's number of columns and rows:
Serial.begin(9600); //inizializzo la seriale
lcd.print("Created by: ");
lcd.setCursor(0,2);
lcd.print("ppregeo");
}
void loop()
{
unsigned long currentMillis = millis();
if (currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
for(int i = 0; i<=NRLETTURE;i++)
{
int sensorVal = analogRead(SensorPin);
//float voltage = (sensorVal /1024.0) * 5.0; // per TMP36
//float temperature = (voltage - .5) * 100;
float temperature = (sensorVal * 4.88)/10; // per LM35
valori[i] = temperature;
// delay(T_campionamento); // delay funzionante
}
analogRead(SensorPin);
sommaGradi = 0; // il primo valore deve essere sia zero, altrimenti poi sballa tutto
for(int i = 0; i<=NRLETTURE; i++) //ciclo che somma i valori dell'array
{
sommaGradi = sommaGradi + valori[i]; //sommaGradi2 = sommaGradi2 + valori[i];
}
mediaGradi = sommaGradi / NRLETTURE; //media valori
for(int i = 0; i<=NRLETTURE2;i++)
{
int sensorVal2 = analogRead(SensorPin2);
//float voltage2 = (sensorVal2 /1024.0) * 5.0;
//float temperature2 = (voltage2 - .5) * 100;
float temperature2 = (sensorVal2 * 4.88)/10;
valori2[i] = temperature2;
}
analogRead(SensorPin2);
sommaGradi2 = 0;
for(int i = 0; i<=NRLETTURE2; i++) //ciclo che somma i valori dell'array
{
sommaGradi2 = sommaGradi2 + valori2[i];
}
mediaGradi2 = sommaGradi2 / NRLETTURE2; //divido la somma dei valori per il loro numero (media)
lcd.clear(); //pulire lo schermo
Serial.print ("Temp In: "); //scrive sul display la parola "gradi"
Serial.println (mediaGradi);
Serial.print ("Temp Out: ");
Serial.println (mediaGradi2);
Serial.print ("diff: ");
Serial.println (mediaGradi-mediaGradi2);
Serial.println ("---------------------------");
lcd.print("In ");
lcd.print(mediaGradi); //scrivo la temperatura
lcd.print(" d ");
lcd.print(mediaGradi-mediaGradi2);
lcd.setCursor(0,2);
lcd.print("Out ");
lcd.print(mediaGradi2);
}
}