Ciao a tutti, sto sperimentando un Termistore NTC su arduino seguendo questo collegamento
Anche se la resistenza a terra l'ho messa da 3.3K, visto che in alcuni esempi l'ho vista da addirittura 1K
Soltanto che sorgono 2 problemi:
-La temperatura a 25° vine rilevata correttamente, mentre salendo o scendendo si comporta inversamente.La resistenza è inversamente proporzionale alla temperatura, mentre secondo i calcoli eseguiti dal codice è il contrario, quindi rffreddando la sonda mi segna un aumento di temperatura.
-Dopo qualche min di funzionamento la breadboard ha cominciato ad emettere del fumo
Penso che si tratti della resistenza di pull down, in quanto l'altra circuiteria che monta è pluritestata e non ha mai dato problemi...Possibile che sia a causa di una resistenza troppo bassa tra +5 e gnd?
Ah, domandina:esiste una formula generale che, data il valore del termistore,della resistenza di pull down,il coeff beta e il valore in lettura mi resituisca la temperatura?
Il funzionamento del termistore varia in base a come lo colleghi. Se lo metti fra VCC ed il nodo che unisce il pin e la R di pull-down, hai un comportamento, se lo metti fra GND ed il nodo, con l'altra R che fa da pull-up, ne hai uno opposto. Nel link che hai messo montano il termistore fra GND ed il nodo mentre tu hai messo uno schema di collegamento con l'NTC fra il nodo e VCC.
Il codice deve essere diverso perché diverso è il comportamento.
L'NTC è un componente che vede decrescere la sua resistenza all'aumentare della temperatura, quindi il valore letto sul pin è l'equivalente del partitore fatto con R2 come resistenza fissa e (3.3 nel tuo caso) e R1 come resistenza variabile (che è il termistore).
La formula è
Vout = (R2/(R1+R2))*Vin
Nel caso di Vin = 5V, se hai R2 a 3300 ohm, e mettiamo R1 a 10K, hai una Vout di 1,24V
Se R1 diventa 1K, hai una Vout di 3,84V
La lettura tenderà quindi ad aumentare man mano che la temperatura sale,
lo schema ed i valori che hai indicato giustificano il comportamento del tuo sistema ma NON il fumo, probabilmente hai involontariamente creato un corto tra le piste della bread, ed il fumo è stato generato dalla sua plastica e non dai componenti che stai usando.
Il valore della resistenza per creare un partitore resistivo insieme al NTC / PTC si sceglie in funzione alla resistenza del NTC/PTC alla temperatura media di misura.
Per esempio se fai un termostato a 37 °C scegli la resistenza uguale alla resistenza del NTC/PTC a 37°C.
Ok, ho modificato il circuito come nell'esempio mettendo un resistore da 6.8K in Pull up al posto della 3.3K di down.
Ho adattato i valori del sorgente con il 6800Ohm della nuova resistenza, ma il risultato è sballato e di parecchio.
float Vin = 5.0; // [V] Tensión alimentación del divisor
float Rfija = 6800; // [ohm] Resistencia fija del divisor
float R25 = 10000; // [ohm] Valor de NTC a 25ºC
float Beta = 3950.0; // [K] Parámetro Beta de NTC
float T0 = 293.15; // [K] Temperatura de referencia en Kelvin
float Vout = 0.0; // [V] Variable para almacenar Vout
float Rntc = 0.0; // [ohm] Variable para NTC en ohmnios
float TempK = 0.0; // [K] Temperatura salida en Kelvin
float TempC = 0.0; // [ºC] Temperatura salida en Celsius
Vout=(Vin/1024)*(analogRead(54));
Rntc=(Vout*Rfija)/(Vin-Vout);
TempK=Beta/(log(Rntc/R25)+(Beta/T0));
TempC=TempK-293,15;
Serial.println(TempC);
Il valore in analogRead si aggira intorno ai 600 a temperatura ambiente, il che porta a una Temperatura in Kelvin< 293.15 ed una temperatura in celsius< 0
// which analog pin to connect
#define THERMISTORPIN A0
// resistance at 25 degrees C
#define THERMISTORNOMINAL 10000
// temp. for nominal resistance (almost always 25 C)
#define TEMPERATURENOMINAL 25
// how many samples to take and average, more takes longer
// but is more 'smooth'
#define NUMSAMPLES 5
// The beta coefficient of the thermistor (usually 3000-4000)
#define BCOEFFICIENT 3950
// the value of the 'other' resistor
#define SERIESRESISTOR 10000
int samples[NUMSAMPLES];
void setup(void) {
Serial.begin(9600);
analogReference(EXTERNAL);
}
void loop(void) {
uint8_t i;
float average;
// take N samples in a row, with a slight delay
for (i=0; i< NUMSAMPLES; i++) {
samples[i] = analogRead(THERMISTORPIN);
delay(10);
}
// average all the samples out
average = 0;
for (i=0; i< NUMSAMPLES; i++) {
average += samples[i];
}
average /= NUMSAMPLES;
Serial.print("Average analog reading ");
Serial.println(average);
// convert the value to resistance
average = 1023 / average - 1;
average = SERIESRESISTOR / average;
Serial.print("Thermistor resistance ");
Serial.println(average);
float steinhart;
steinhart = average / THERMISTORNOMINAL; // (R/Ro)
steinhart = log(steinhart); // ln(R/Ro)
steinhart /= BCOEFFICIENT; // 1/B * ln(R/Ro)
steinhart += 1.0 / (TEMPERATURENOMINAL + 273.15); // + (1/To)
steinhart = 1.0 / steinhart; // Invert
steinhart -= 273.15; // convert to C
Serial.print("Temperature ");
Serial.print(steinhart);
Serial.println(" *C");
delay(1000);
}
Devi adattare i valori dei #define.
Attenzione perché quello sketch usa il riferimento di tensione esterno.
Devi ponticellare i 3V3 con Aref e alimentare il termistore con i 3V3 e non con i 5v.
Funziona, grazie 1000!
Avrei bisogni di 2 ulteriori chierimenti:
-Se dovessi aggiungere un altra sonda basta che mi colleghi in parallelo a quella già esistente(utilizzando un altro piedino per l'input, ovviamente) o c'è bisogno di tirare un ulteriore linea con resistenza per la pull up?
-Paragonando i risultati ottenuti dall'NTC con quelli di un termometro digitale vedo che man mano che ci si scosta dai 25° ottengo una differenza di valori rilevati non indifferente(circa 3 gradi a -20 o +60).Dite che è un errore del termometro,della sonda, o il coeff Beta che non è esattamente 3950?
Attenzione perché quello sketch usa il riferimento di tensione esterno.
Devi ponticellare i 3V3 con Aref e alimentare il termistore con i 3V3 e non con i 5v.
Mi sto cimentando anch'io nell'uso del termistore ma la parte qui sopra non la capisco. Sono agli inizi e con scarse nozioni di elettronica.
qualcuno saprebbe spiegarmi meglio questo passaggio?
Per poter leggere una tensione l'ADC ha bisogno di un termine di paragone. Normalmente si basa sull'alimentazione a 5V del micro stesso, ma spesso è necessario un riferimento più preciso.
Si può quindi utilizzare il riferimento interno a 1.1V oppure un riferimento esterno variabile tra 0V e 5V.
Nello sketch precedente c'è l'istruzione
analogReference(EXTERNAL);
che dice all'ADC di Arduino di utilizzare il riferimento esterno per il calcolo delle tensioni.
A questo punto è necessario fornire all'Arduino tale riferimento.
La cosa più semplice quindi è prelevare 3.3V (da usare come riferimento) e immetterli nel pin AREF. In pratica non fai altro che unire con un cavetto (ponticellare) i due pin: 3V3 e AREF.
Naturalmente per poter dare valori corretti anche il termistore dovrà essere alimentato con la stessa tensione di 3V3. Altrimenti avresti un riferimento a 3V3 e l'alimentazione del termistore a 5V. I calcoli risulterebbero errati.
Se vuoi alimentare il termistore a 5V, elimina il collegamento con Aref e commenta o cancella la riga
Altra domandina:se dovessi usare un filo lungo per collegare la sonda(qualche decina di metri) penso che la resistenza del filo non sia trascurabile per una misurazione accurata.
Mi basta misurare la resistenza del filo che userò e aggiungerla ai 10K di riferimento dell'NTC a 25°C?
non ha importanza, visto che il valore è fisso, il tuo riferimento di partenza è la lettura che fai con una temperatura di riferimento CERTA, ti serve quindi un termometro abbastanza preciso.
Perchè non avrebbe importanza? Il cavo non si comporterebbe come un resistore in serie all'ntc?
Se a 25° l'ntc ha una resistenza di 10K ai suoi capi, collegandogli una coppia di fili ai loro capi non avrò una resistenza 10K+resistenza del filo?