presentazione e programma temp logger

Saluto tutti, è da circa 3 mesi che possiedo uno starter kit di arduino uno, e grazie alla guida di Massimo Banzi ed il playground sono riuscito a scrivere la mia prima applicazione per Arduino. Premetto non possiedo pressochè nessuna nozione di elettronica, ne di programmazione informatica escludendo quello che ho studiato sul c64 circa 20 anni fa. Quindi incollo qui il mio codice sperando che sia d'aiuto a qualche neofita come me, e per quelli più esperti per eventualmente migliorare qualche strafalcione che inevitabilmente ho fatto. Il tutto è prendendo esempio dal playground l'esempio sui thermistor :

/*
Lettura sonde e riporto su seriale in particolare n° 2 sonde una Hoval NTC con 2000 kohm a 25 c°
l'altra Vaillant con 2700 kohm a 25 PTC.

schema di collegamento per ogni sonda

GND----------R4,7k--------------|--------------- sonda
| |
analog read a0,a5 |
|
3,3 volts---------------------------------------|

per ogni sonda si procede alla assegnazione dei valori in c° tramite tabella di riferimento

in particolare le seguenti :

*/

include <avr/pgmspace.h>;

const int temphoval[] PROGMEM={49,50,51,52,53,54,55,55,56,57,57,58,59,60,61,62,63,63,64,65,66,67,68,69,70,71,72,73,74,74,75,76,77,77,78,79,80,81,82,83,83,84,85,86,86,87,88,89,89,90};
const int tempvail[]PROGMEM={49,49,49,50,50,50,51,51,51,52,52,52,53,53,53,54,54,54,55,55,55,55,55,56,56,56,56,57,57,57,57,58,58,59,59,60,60,60,60,61,61,61,62,62,63,63,64,64,64,64,65,65,66,66,66,67,68,68,69,69,70,70,71,71,72,72,72,73,73,73,74,74,75,76,76,76,77,78,79,79,80,81,82,83,84,84,85,85,86,87,88,89,90};

int temp1= 0;
int temp2= 0;
int nrlettura = 0;
int rit = 1000;

void setup() {
Serial.begin(9600);
Serial.println("");
Serial.println("");
Serial.println("");
Serial.println("");
Serial.println("");
Serial.println("");
Serial.println("*************************************************** TEMPERATURE LOGGER **********************************************");
Serial.println("
");
Serial.println("
CONFIGURAZIONE Nr 2 SONDE ");
Serial.println("
");
Serial.println("
*********************************************************************************************************************");
Serial.print("Lettura ogni Ms...................: ");
Serial.print(rit, DEC);
Serial.println("");
Serial.println("");
}

void loop() {

nrlettura=nrlettura ++ ;
//trattamento rilievo prima sonda hovalA0

int sensorValue1 = analogRead(A0);
if ((sensorValue1 >= 402) && (sensorValue1 <= 451)) {// controllo dei valori se in scala di lettura
temp1=sensorValue1-452;
temp1= abs(temp1) ; //estraggo il valore assoluto
temp1 = pgm_read_word(&temphoval[temp1]);}
else
temp1 = 0;

//trattamento rilievo seconda sonda vaillant A5

int sensorValue2 = analogRead(A5);
if ((sensorValue2 >= 560) && (sensorValue2 <= 652)) {// controllo dei valori se in scala di lettura
temp2 = sensorValue2-559;
temp2 = pgm_read_word(&tempvail[temp2]); }
else
temp2 = 0;

//prepara la stampa su seriale
//stampa seriale prima sonda

Serial.print("| ");
Serial.print(nrlettura, DEC);
Serial.print("\t");
Serial.print(" |");

Serial.print("|");
Serial.print("\t");
Serial.print("vol Ohm ");
Serial.print(sensorValue1, DEC);
Serial.print("\t");
Serial.print("|");
Serial.print(" c ");
Serial.print(temp1, DEC);
Serial.print("\t");

//stampa seriale prima sonda
Serial.print("|");
Serial.print("\t");
Serial.print("vol Ohm ");
Serial.print(sensorValue2, DEC);
Serial.print("\t");
Serial.print("|");
Serial.print(" c " );
Serial.print(temp2, DEC);
Serial.print("\t");
Serial.print("\t");
Serial.print("|");

Serial.println();

delay (rit);
}

al netto di perfezionare la tabella di conversione, di entrambi le sonde, ora provando il circuito in varie condizioni mi sono accorto che si hanno valori che sballano anche di 10 c°. Ad esempio alimentando arduino con l'usb del macbook ho stilato la tabella verificandola con l'eeepc ho ottenuto valori sballati anche di 5-10 c° (valori di campionamento in rapporto della temp c°) il tutto avendo come riferimento un termometro digitale testo 625. Può essere dato dalla modifica dei valori di alimentazione ?

Come potrei aggirare il problema ?

Ciao..

Come potrei aggirare il problema ?

Anche symon ha i gli stessi problemi di imprecisione, allora a quanto sembra il problema è da imputare alla tensione di alimentazione inferiore a 5.00 volts.

http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1293381455

Ciao.

Controllando le opzione disponibili, e mettendo come opzione l'alimentazione tramite un alimentatore stabilizzato, rimane utilizzare la tensione di riferimento interna.

Però anche cosi mettendo delle resistenze tra il 3,3 volt per abbassarlo fino ad 1,1 tutto il sistema rimane sensibile alle variazioni della tensione di alimentazione, mi sa che se ne esce cercando di centrare il range delle sonde sfruttando quasi tutti i 1024 campionamenti dell'analogico per il range di temperature in modo da abbassare il più possibile l'errore.

Bene ora si deve capire come fare il tutto....

buon anno

Ho inserito il voltage reference all'inizio delle letture

analogReference(EXTERNAL) ed ho collegato il + 3,3 sul pin AREF

cosi dovrei risolvere ?

Però anche cosi mettendo delle resistenze tra il 3,3 volt per abbassarlo fino ad 1,1 tutto il

Gli 1,1V di riferimento interno sono prodotti internamente dal controller e sono stabili. non serve fare partitori.
I 3,3V vengono prodotti nel UNO e MEGA 2560 con uno stabilizzatore e sui altri Arduino dal FT232.
Ciao Uwe

bene se il 3,3 è stabilizzata non dovrei avere di nessun genere a leggere le stesse campionature sugli analogread alle stesse temperature, devo mettere a posto la tabella di corrispondenza