Consigli x sonda ntc 10k arduino mega

Buonasera a tutti
Sto costruendo una centralina solare per la gestione dell acqua sanitaria, sto usando le sonde ntc 10k resistente fino a 200 gradi. Ho collegato sulle sonde 3,3 volt con le resistenze 10 k in pull up . Usandol alimentazione della porta usb funziona tutto correttamente ma appena uso un alimentatore esterno con un trasformatore a 9v le temperature aumentano.. Ho cambiato nello sketch il valore della resistenza da 10000 a 7000 e le temperature vengono lette corettamente .. Non avendo molta esperienza in materia mi sorge il dubbio che ho aggirato il problema senza risolverlo.. Cambiando il valore della resistenza nello sketch ( la rssitenza utilizzata e 10k) evito di utilizAre la porta aref che mi da problemi sul lcd tft touch.
Consigli?
Grazie

Non sono esperto, ma visto che non risponde nessuno... :slight_smile:
domande:

  1. anche il reference della analogRead() dice che il convertitore ADC ha come riferimento i 5V e non i 3,3V a meno che questo riferimento non venga cambiato come detto nel reference qui
    Tu usi i 3,3V ma nel codice hai usato la analogReference ? Hai collegato i 3,3V ad ARef come spiega qui ?

  2. la resistenza 10K di solito l'ho sempre vista negli schemi ma sempre con 5V e non i 3,3V, perchè hai usato i 3,3?

Il problema è quanto distanti sono le sonde da Arduino e come sono state collegate.

La tensione di alimentazione deve essere molto stabile e c'è da tenere in considerazione i disturbi che il cavo potrebbe raccogliere.

Una tensione bassa (3.3V) significa aumentare il rischio di disturbi.

Consiglio di usare un cavo schermato a due filli + schermo.

Oltre alla formula di linearizzazione della curva NTC, occorre campionare almeno 10 volte mediando la misura per ridurre l'errore.

Grazie per avermi risposto.
cambiando il valore della resistenza ho scollegato la porta aref dai 3.3 v.
ovviamente dallo sketch ho levato analogRefernce (external) perche mi da problemi sul touch del lcd ( ili 9341 librerie adalfruit)

<
#define THERMISTORNOMINAL 7000  // prima era a 10000

void SondaS1A() 
{
 int samples[NUMSAMPLES];
 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);
 }
 
 tft.setCursor(185,80); // Colocamos el cursor
 tft.setTextSize(3); // Especificamos el tamaño del texto
 tft.setTextColor(gomma); // Definimos el color del texto
 tft.println(ricordaTemperatura);
 
 // average all the samples out
 average = 0;
 for (i=0; i< NUMSAMPLES; i++) {
    average += samples[i];
 }
 average /= NUMSAMPLES;
 average = 1023 / average - 1;
 average = SERIESRESISTOR / average;
 
TempS1A = average / THERMISTORNOMINAL;     // (R/Ro)
TempS1A = log(TempS1A);                  // ln(R/Ro)
TempS1A /= BCOEFFICIENT;                   // 1/B * ln(R/Ro)
TempS1A += 1.0 / (TEMPERATURENOMINAL + 273.15); // + (1/To)
TempS1A = 1.0 /TempS1A;                 // Invert
TempS1A -= 273.15;                         // convert to C
>

Lasciando abilitata analReference oltre a non funzionare il monitor mi sballa le temperature, per qualche minuti legge correttamente e poi le temperature salgono oltre i 40 c a quando in realtà la temperatura e 22 c
Grazie

Il codice devi racchiuderlo nei tag code, vedi sezione 7 del regolamento, spiega bene come fare ( pulsante </> ).
Altrimenti parte del codice può essere visualizzata male o mancare perchè interpretato come attributo del testo stesso.
Infatti il tuo codice ad un certo punto diventa italico e si è perso un pezzo. Per favore edita il tuo post precedente e sistemalo come indicato. Grazie.

La curva di correzione NTC necessita di 3 valori:

R25 = resistenza NTC a 25°C (nominale ohm)
RS = resistenza serie (può essere 10k o meno ohm)
B25-85 = coefficiente beta (pendenza curva calcolata su 25°C e 85°C in °K)

Mediante questi valori si può calcolare con una certa approssimazione la temperatura mediante l'equazione semplificata di Steinhart-Hart.

Mi sembra che nel tuo sketch ci siano errori, ma è meglio se inserisci lo sketch completo.

Lo sketch completo sono piu di 2000 righe di comando posto la parte dove si riferisce alle ntc

#define THERMISTORPIN A13
#define THERMISTORPIN1 A14 
#define THERMISTORPIN2 A15         
#define THERMISTORNOMINAL 7000      
#define TEMPERATURENOMINAL 25   
#define NUMSAMPLES 5
#define BCOEFFICIENT 3950
#define SERIESRESISTOR 10000
float TempS1A = 0;
float TempS2A = 0;//
float TempS3A = 0;

moccioso: ... ti è già stato detto al post #4 ... in conformità al regolamento, punto 7, devi editare il tuo post di cui al post # (in basso a destra del post, bottone More -> Modify) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone fatto così: </>, tutto a sinistra).

Guglielmo

Si scusatemi ......

<
#define THERMISTORPIN A13
#define THERMISTORPIN1 A14 
#define THERMISTORPIN2 A15         
#define THERMISTORNOMINAL 7000      
#define TEMPERATURENOMINAL 25   
#define NUMSAMPLES 5
#define BCOEFFICIENT 3950
#define SERIESRESISTOR 10000
float TempS1A = 0;
float TempS2A = 0;//
float TempS3A = 0;

void SondaS1A() 
{
int samples[NUMSAMPLES];
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);
}

tft.setCursor(185,80); // Colocamos el cursor
tft.setTextSize(3); // Especificamos el tamaño del texto
tft.setTextColor(gomma); // Definimos el color del texto
tft.println(ricordaTemperatura);

// average all the samples out
average = 0;
for (i=0; i< NUMSAMPLES; i++) {
   average += samples[i];
}
average /= NUMSAMPLES;
average = 1023 / average - 1;
average = SERIESRESISTOR / average;

TempS1A = average / THERMISTORNOMINAL;     // (R/Ro)
TempS1A = log(TempS1A);                  // ln(R/Ro)
TempS1A /= BCOEFFICIENT;                   // 1/B * ln(R/Ro)
TempS1A += 1.0 / (TEMPERATURENOMINAL + 273.15); // + (1/To)
TempS1A = 1.0 /TempS1A;                 // Invert
TempS1A -= 273.15;                         // convert to C

? ? ? ? ... vedo che NON hai capito ...

  1. vai al tuo post #4, usa il bottone Modify (in basso a destra del post, bottone More -> Modify) e metti il tag CODE (... sono quelli che in edit inserisce il bottone fatto così: </>, tutto a sinistra) attorno al tuo codice :

[ CODE ]
... tuo codice
... tuo codice
... tuo codice
[ /CODE ]

  1. fai la stessa cosa si post qua sopra !!!

Guglielmo

P.S.: Io ho dovuto mettere uno spazio tra le parentesi quadre e il conenuto per non fare interpretare il tag, tu NON devi metterlo

Grazie per i consigli e scusami di nuovo per non avere capito come funziona il forum