Salve a tutti sto cercando di creare un termostato che rilevi la temperatura e successivamente la scriva su un file di un WebServer
Utilizzo un sensore TMP36 ed ho iniziato il mio progetto seguendo un manuale del APOGEO
Mi sono subito accorto che non è cosi semplice rilevare un valore costante ed e molto diverso da quello che rileva un termostato almento 5 - 7 gradi C
Allora inizialmente ho creato un ciclo for che rileva 10 temperature le sommava e ne faceva la media.
i valori cmq risulatavano molto sballati rispetto a quelli di un termostato ma le rilevazioni sono ovviamente più stabili.
Poi ho trovato una guida che spiegava come aumentare la precisione utilizzando il pin AREF tensione 3.3 Vdc
Ho allegato un immagine è lo schema di collegamento che ho utilizzato [ovviamente trovato in rete]
Io vorrei non fare la media dei file ma prendere il valore che si ripete più volte su dieci letture.
Quindi utilizzo un Array, come posso fare ?
Vi allego il codice
void setup() {
Serial.begin(BAUD_RATE);
analogReference(EXTERNAL);
}
void loop() {
float MyArray[10];
for(int contatore = 0; contatore < 10; contatore++){
int RIL=analogRead(TEMP_SENSOR_PIN);
float tempC = ((RIL * 0.0032 ) - 0.5) / 0.01;
MyArray[contatore] = tempC;
Serial.print("Lettura: ");
Serial.print(contatore);
Serial.print(" C: ");
Serial.println(MyArray[contatore]);
delay(5000);
}

agaruti:
Vi allego il codice
Il codice devi racchiuderlo nei tag code, vedi sezione 7 del regolamento, spiega bene come fare.
Altrimenti parte del codice può essere visualizzata male o mancare perchè interpretato come attributo del testo stesso.
nid69ita ti chiedo scusa ho sbagliato pulsante invece di ho cliccato su

uwefed grazie per la risposta;
Ho capito il concetto del AnalogReference a 3.3, chiedevo se il sistema di collegamento che ho utilizzato è corretto. Inoltre chiedevo suggerimenti per rilevare il valore più frequente all'interno di un array.
Adesso che uso analogReference a 3.3 le mie rilevazioni sono quai identiche a quelle effettuate da un termostato è molto più stabili rispetto a prima.
Ieri ad esempio il termostato rilevava 27.1 io 27.6
I valori sono anche molto più stabili tolte le prime 10-20 rilevazioni d'assestamento il valore è stato sempre 27.6 salvo qualche piccolo sbalzo esempio:
27.6 -> 27.6 -> 27.6 -> 26.5 -> 27.6 ecc ecc.....
Per eliminare questo piccolo sbalzo se io effettuo la media dei valori avro sempre una media diversa!!!
Perchè una volta sbalza a 26.5 l'altra a 26.1 o 25.5
Quindi ho pensato se io effettuo 10 rilevazioni e prendo la più frequente dovrei eliminare questi sbalzi.
Ho provato a guardare in rete e non sono riuscito a capire se esiste già una funzione ho devo creare io un ciclo che confronta i valori di un array?
Prova ad inserire tra le letture della media un piccolo ritardo:
delayMicroseconds(260);
Grazie cyberhs
Io ho impostato un delay a 5000 tra una lettura e l'altra, ma su 10 letture facilmente una è sballata
Non succede nulla ma non è professionale un prodotto che ha piccoli sbalzi
Immagina di guardare un termostato che ti segnala 25 gradi poi ti accorgi che ogni non so 20 secondi ti segna per un attimo un valore diverso.
Quindi ho pensato se eseguo mettiamo 10 letture e prendo il valore più frequente ho un valore sicuramente più stabile e se la temperatura varia riesco cmq a rilevare il cambiamento non immediatamente ma in una manciata di secondi.
Quello che chiedevo è se esiste già strumenti per operazioni su array o devo creare io un confronto tra i valori presenti nell'array?
Quando si fa una misura analogica, DEVI usare la media di tot letture (diciamo 10) e tra di esse meglio mettere un ritardo di 260μs, anche se ne basterebbe uno più piccolo.
Inoltre, alcuni consigliano di scartare la prima lettura, perciò un totale di 11 letture.
Nel tuo sketch non vedo usata questa tecnica (noise reduction).
Non è che riesci a girarmi un esempio te ne sarei grato
Grazie
P.S. un amico mi ha fornito un condensatore da inserire tra il pin analogico A0 e GND, mi ha detto che dovrebbe stabilizzare le letture di molto, poi mi ha comunque consigliato di fare le media come dici tu
Che ne pensi?
Pero' considera anche un'altra cosa ... stai parlando di differenze di decimi di grado, che possono avvenire effettivamente fra due letture diverse (convezione o flussi d'aria casuali, sbalzi ambientali, maggiore o minore irradiazione, piu un'altra caterva di possibili cause), per cui quegli "errori" potrebbero anche non essere errori 
Poi se la differenza e' parecchia, ma solo una lettura ogni tanto, potrebbe essere dovuto ad un disturbo esterno ... in genere, si usa un sistema a scarto ... se su 10 letture, una ha un valore che si scosta piu di "tot" da quella della media di tutte le altre, quella lettura viene scartata, se invece iniziano ad essere due o tre consecutive, allora e' una variazione reale e viene tenuta in considerazione ...
Ok Ragazzi così che ne dite
Faccio 10 rilevazioni tra una rilevazione e l'altra ho messo un delay di 2500 poi ordino l'array in ordine crescente e prendo il valore centrale
#include <SPI.h>
#include <Ethernet.h>
const unsigned int BAUD_RATE = 9600;
const unsigned int TEMP_SENSOR_PIN = A0;
const unsigned int PAUSE = 2500;
//Configure Interface Network
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xDE}; // Mac Address
IPAddress my_ip ( 192, 168, 0, 50); // Indirizzo Ip
IPAddress subnet ( 255, 255, 255, 0); // Subnet Mask
IPAddress gateway ( 192, 168, 0, 1); // Gateway
IPAddress dnServer ( 8, 8, 8, 8); // Dns Server
void setup() {
// put your setup code here, to run once:
Serial.begin(BAUD_RATE);
Ethernet.begin(mac, my_ip, subnet, gateway, dnServer);
delay(1000);
Serial.println("Arduino Network");
Serial.print("IP ADDRESS: ");
Serial.println(Ethernet.localIP());
Serial.print("SUBNET: ");
Serial.println(subnet);
Serial.print("GATEWAY: ");
Serial.println(gateway);
Serial.print("DNS: ");
Serial.println(dnServer);
analogReference(EXTERNAL);
}
void loop() {
int MyArray[10];
for(int contatore = 0; contatore < 10; contatore++){
int RIL=analogRead(TEMP_SENSOR_PIN);
MyArray[contatore] = RIL;
delay(PAUSE);
}
sort(MyArray,10);
float tempC = ((MyArray[5] * 0.0032 ) - 0.5) / 0.01;
Serial.print("Temperatura Gradi C: ");
Serial.println(tempC);
}
void sort(int a[], int size) {
for(int i=0; i<(size-1); i++) {
for(int o=0; o<(size-(i+1)); o++) {
if(a[o] > a[o+1]) {
int t = a[o];
a[o] = a[o+1];
a[o+1] = t;
}
}
}
}