Sensore di temperatura collegato con 10m di filo

Ho usato LM36 per monitorare la temperatura di un termosifone, massimo 50 - 60 gradi e dopo un po' di tempo il sensore non ha funzionato piu'. A qusto punto ho il dubbio che esistano in giro chip con specifiche fuori dei datasheet.

PaoloP:
Mi è arrivato poco fa l'ultimo ordine: all'interno un DS18B20 e un LM35DZ.
Avevo già un termistore NTC 503. Domani li monto tutti e tre affiancati su una bread board e faccio un confronto.

Ecco qui:
Ho sulla breadboard un Dallas 18b20, un LM35DZ e un termistore 50K.
ho monitorato anche la temperatura interna del 328 (ma l'ho calibrata sulla media degli altri, quindi non fa testo)

Questo è quello che mi ha stampato:

Dallas: 22.12 C
Termistor: 23.44 C
LM35: 21.48 C
Internal Temperature: 22.7 C

Dallas: 22.12 C
Termistor: 23.44 C
LM35: 21.48 C
Internal Temperature: 22.7 C

Dallas: 22.12 C
Termistor: 23.44 C
LM35: 21.48 C
Internal Temperature: 22.7 C

Questo lo sketch:

#include <OneWire.h>
#include <DallasTemperature.h>

#define SENSORLM35 A0
#define THERMISTORPIN A1         
#define THERMISTORNOMINAL 50000      
#define TEMPERATURENOMINAL 25   
#define NUMSAMPLES 5
#define BCOEFFICIENT 3950
#define SERIESRESISTOR 8500    
int samples[NUMSAMPLES];

#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress insideThermometer;

void setup(void)
{
  Serial.begin(9600);
  Serial.println("Dallas Temperature IC Control Library Demo");
  // locate devices on the bus
  Serial.print("Locating devices...");
  sensors.begin();
  Serial.print("Found ");
  Serial.print(sensors.getDeviceCount(), DEC);
  Serial.println(" devices.");
  // report parasite power requirements
  Serial.print("Parasite power is: "); 

  if (sensors.isParasitePowerMode())
    Serial.println("ON");
  else
    Serial.println("OFF");

  if (!sensors.getAddress(insideThermometer, 0))
    Serial.println("Unable to find address for Device 0"); 

  Serial.print("Device 0 Address: ");
  printAddress(insideThermometer);
  Serial.println();
  sensors.setResolution(insideThermometer, 12);
  Serial.print("Device 0 Resolution: ");
  Serial.println(sensors.getResolution(insideThermometer), DEC); 
  Serial.println();
}

void loop (void){
  analogReference(DEFAULT);
  Dallas();
  Termistor();
  LM35();
  InternalTemp();
  Serial.println();
  delay(3000);
}

// function to print the temperature for a device
void printTemperature(DeviceAddress deviceAddress)
{
  float tempC = sensors.getTempC(deviceAddress);
  Serial.print("Dallas: ");
  Serial.print(tempC);
  Serial.println(" C");
}

void Dallas(void)
{ 
  sensors.requestTemperatures(); // Send the command to get temperatures
  printTemperature(insideThermometer); // Use a simple function to print out the data
}

// function to print a device address
void printAddress(DeviceAddress deviceAddress)
{
  for (uint8_t i = 0; i < 8; i++)
  {
    if (deviceAddress[i] < 16) Serial.print("0");
    Serial.print(deviceAddress[i], HEX);
  }
}

void Termistor(void) {
  uint8_t i;
  float average;
  float temp;

  // 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);

  temp = temperature(average);
  Serial.print("Termistor: "); 
  Serial.print(temp);
  Serial.println(" C");
}

float temperature (float reading)
{
  // convert the value to resistance
  reading = 1023 / reading - 1;
  reading = SERIESRESISTOR / reading;
  //  Serial.print("Thermistor resistance "); 
  //  Serial.println(reading);

  float steinhart;
  steinhart = reading / 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
  return steinhart;
}

void InternalTemp()
{
  Serial.print("Internal Temperature: ");
  Serial.print(GetTemp(),1);
  Serial.println(" C");
}

double GetTemp(void)
{
  unsigned int wADC;
  double t;

  // The internal temperature has to be used
  // with the internal reference of 1.1V.
  // Channel 8 can not be selected with
  // the analogRead function yet.

  // Set the internal reference and mux.
  ADMUX = (_BV(REFS1) | _BV(REFS0) | _BV(MUX3));
  ADCSRA |= _BV(ADEN);  // enable the ADC
  delay(20);            // wait for voltages to become stable.
  ADCSRA |= _BV(ADSC);  // Start the ADC
  // Detect end-of-conversion
  while (bit_is_set(ADCSRA,ADSC));
  // Reading register "ADCW" takes care of how to read ADCL and ADCH.
  wADC = ADCW;
  // The offset of 324.31 could be wrong. It is just an indication.
  t = (wADC - 333.31 ) / 1.22;
  // The returned temperature is in degrees Celcius.
  return (t);
}

void LM35()                     // run over and over again
{
  analogRead(SENSORLM35); 
  //getting the voltage reading from the temperature sensor
  int reading = analogRead(SENSORLM35);  
  float voltage = reading * 5.0;
  voltage /= 1024.0; 
  float temperatureC = (voltage - 0) * 100 ;
  Serial.print("LM35: "); 
  Serial.print(temperatureC); 
  Serial.println(" C");
}

Ho unito più codici trovati in giro senza armonizzare costanti e stile di codifica.

EDIT: Si, a casa mia, senza riscaldamento acceso, ci sono al momento 21 °C :grin:
I Love Sardinia!! :*

Ottimo Paolo, ora sappiamo che questi sensori non sono una truffa ma funzionano :smiley:
Scherzi a parte, stiamo cercando solo di risolvere il problema di Alberto, mentre tu hai solo dato risposta a qs, mi pare, che aveva fatto una prova simile ottenendo risultati strani.
Se vuoi essere utile a questo Topic dovresti usare il solo LM35, configurarlo come da famosa Fig. 8 e poi ripetere le prove alle varie temperature, ma usando il mio umilissimo sketch che si limita a rilevare i valori decimali senza alcuna conversione, ed eseguendo le rilevazioni come da mie indicazioni, così creo un file parallelo per te e vediamo come procede.
Se non ti va di fare queste prove sappi che altro non serve, quindi non te la prendere, però vista la problematica sollevata da qs e la tua dimostrazione si potrebbe aprire un altro Topic per fare altre verifiche.
Ah, Alberto ha avuto un piccolo problema personale che gli ha impedito di fare altre prove, ricominceremo quando sarà rientrato a Torino, credo, ecco perché se a te andasse di "prendere il suo posto" sarebbe cosa eccellente! :wink:

Ok. Vado a comprare una vaschetta per creare cubetti di ghiaccio. Al momento non ne sono fornito.

Ma non vale la pena, penso, Albero usava i bicchieri di carta, a meno che non ti serva comunque... invece sincerati di avere le 4 R che ti servono: dovrebbero essere 2 da 200 ohm e 2 da 2000 ohm, tutte all'1%; in alternativa replichi proprio la situazione di Alberto ed usi 2 da 220 e 2 da 2k2 al 5%; ricorda anche di prendere 10 mt di cavo twisted; riguardo il terminale del sensore lui ha usato la bread, se per te è uguale sarebbe decisamente meglio realizzare un microscopico PCB su millefori, col sensore sporgente in orizzontale su uno dei 4 lati, così sarà comodo sia per la prova ghiaccio che per quella coprporea.

ma strani... non più di tanto... però ho notato che tra sensori di diverse tipologie che dovrebbero essere tarati e sicuri eccetera ci sono gradi di differenza... il test di paolo lo conferma ulteriormente.
L'idea sui test di Michele non l'ho accantonata: ho anche tagliato i miei 10 metri di filo per vedere se ci sono differenze sulle lunghe distanze solo che sono "depresso" e "smotivato": questi sensori sono "belli" nel momento che tu li metti su e non serve correggere nulla... e già in configurazione tipica direi che la cosa non è confermata... in configurazione figura 8 ci sono (a memoria) 6-7 gradi di differenza e comunque diversi da quanto indicherebbe il datasheet... se ho da mettermi a tararli col ghiacchio tanto vale che compro una ntc qualsiasi.
Volevo però chiedere lumi a Michele: sul datasheet figura 8 si indica Tambiet +10 e 0.10Volt per grado... quel Tambient + 10 significa che io avrei da misurare 10 gradi più di quello che è? in pratica se ho una stanza da 20gradi misuro 30? Si però allora perchè il range è a -5 e non a -10?

Allora, a questa cosa io ho dato una mia interpretazione e mi sto basando su quella, la prova contraria l'avremo SOLO a fine test.
Io interpreto che quei partitori "sfasano" la lettura standard, in base alla quale dovresti avere 0mV a 0°C; in base a ciò che scrivono il campo di misura parte da -5°C che però sono indicati (lo spiegano per capire come si arriva ai mV) con uno sfasamento di +10°C.
In pratica, TEORICAMENTE dovremmo avere 0mV quando la T ambiente è -5°C, DI FATTO abbiamo + 10°C, quindi 100mV a -5°C e quindi 0°C dovrebbero corrispondere a circa 150mV. Ora il ragionamento fila con le prove di Alberto, anche se c'è una sfasatura media di circa 2°C (quindi 20mV), però il riferimento che abbiamo è un termostato ambiente che ha già dimostrato di dare ±1-2°C, quindi i conti potrebbero tornare, però abbiamo il dubbio sul tipo di misura fatta da Alb a 0°C, ecco perché se vi metteste a replicare anche Voi due le stesse prove con lo stesso metodo e circuito, potremmo fare un lavoro quasi scientifico. Ma in aggiunta a quanto fatto da Alberto Voi dovreste:
1 - misurare OGNI VOLTA che fate una rilevazione ANCHE la tensione di alimentazione
2 - disporre di un termometro ambiente trasportabile e sufficientemente preciso (o almeno lineare)
Un errore grave che si fa è non tener conto della tensione di alimentazione, per noi ormai è tardi (dovremmo ricominciare daccapo!) usare l'INTERNAL a 1,1V, ma se volete possiamo farlo con noi tre, avendo così un riferimento certo; invece con DEFAULT il riferimento NON è 5V bensì la tensione di alimentazione, allora voi capite che 5/1024 non è uguale a 4,45/1024 o a 5,12/1024, per cui ogni step dell'ADC assume un valore diverso e bisogna tenerne conto, altrimenti si esce pazzi mentre il povero sensore sta facendo il suo lavoro come si deve.
Io sono a vostra disposizione, se avete dubbi chiedete e quando volete iniziamo.

Ciao a tutti scusate ma mia lunga assenza ma non ho avuto internet per via di un problema. Allora ho comprato la batteria da 9 volt per avere i 5vat sul sensore,ho collegato la batteria ad arduino con il polo + sul vim e il polo - su massa, mi avete chiesto di misurare la corrente sui pin dell'arduino ed è4.98volt poi lo misurata sui pin del sensore ed ho la stessa misura che ho riportato prima cioè 4.48.
che dite le devo prendere le misurazione con il ghiaccio e sotto l'ascella??
la situazione è sempre la stessa non ho cambiato niente ho sempre le stesse R e non ho la millefori.

Ma una batteria da 9V non ti durerà niente! e comunque la misura fatta indica una perdita di circa 0,5V, quindi a questo punto ciò che diventa importante è la misura della tensione di alimentazione su Arduino e NON quella che arriva al sensore, che tanto può lavorare da 4 a circa 38V se non ricordo male. Per cui lascia perdere la batteria, usa l'USB del notebook, fai le prove che ancora devi fare, anche altre ambientali eventualmente, e ad ogni rilevazione misura l'alimentazione su Arduino, così continuo ad aggiornare il file. Oppure se qs e Paolo decidono di lavorare con l'INTERNAL, facciamo lo stesso anche con te ed evitiamo questa cosa dell'alimentazione.
Aspettiamo che decidono loro

farò...ma dovete portare pazienza... l'attesa sarà comunque ripagata in quanto domani mi arriva anche un altro lm35 col quale intendo fare dei confronti serrati.
Il problema è che alberto non ha le resistenze giuste... e neanche io le ho proprio perfette... ma non è tanto importante imho averle perfette quanto averle sempre uguali ed è chiaro che tra i miei dati, quelli di paolo e quelli di alberto ci saranno discordanze dovute a queste resistenze.

NON c'è problema, Voi fornitemi i dati richiesti ed io vi creo i file e poi facciamo confronti e riepilogo.

misurazione ambientale
fonte: notebook
corrente misurata dai pin del arduino in uscita:4.94
temperatura indicata dal termostato è:20.2
ecco le misurazioni

66.00
65.97
66.03
66.03
65.90
66.07
66.03
65.97
66.00
65.93
66.07
66.00
66.00
66.00
66.00
66.07
66.10
66.03
66.10
66.07
66.03
66.13
66.03
66.10
66.03
66.03
65.97
65.93
66.00
66.10
66.00
66.03
66.13
66.00

bene, ho preso nota, ho anche fatto una leggera variazione alle formule per tener conto della tensione di alimentazione, per cui se fai altre misure ambientali (magari sui 18 e 22 gradi, un minimo di distanza da questa), ridammele.

Allora, usate tutti il mio semplice sketch
al quale ho aggiunto ora il riferimento 1,1V. Quindi NON misurate più la tensione di alimentazione ma una sola volta la tensione che c'è tra ARef e GND, così superiamo il problema delle variazioni di alimentazione.

misurazione con il sensore sotto l'ascella.
ho preso il sensore e lo messo sotto l'ascella con il termometro del corpo ho aspettato 5min e poi ho preso le 30 misurazioni, temperatura del mio corpo misurato con termometro con mercurio :wink: indica 36 XD e mezzo,ho usato sketch postato prima :slight_smile:

462.40
462.50
462.03
461.53
461.40
462.60
462.57
462.20
462.17
461.43
462.30
462.70
462.63
462.20
461.57
461.83
462.80
462.87
462.23
461.80
461.73
462.37
462.73
462.77
462.33
461.83
462.57
463.47
462.97
462.10
461.97

alberto39:
misurazione con il sensore sotto l'ascella.
ho preso il sensore e lo messo sotto l'ascella con il termometro del corpo ho aspettato 5min e poi ho preso le 30 misurazioni, temperatura del mio corpo misurato con termometro con mercurio :wink: indica 36 XD e mezzo,ho usato sketch postato prima :slight_smile:

462.40

462.50
462.03
461.53
461.40
462.60
462.57
462.20
462.17
461.43
462.30
462.70
462.63
462.20
461.57
461.83
462.80
462.87
462.23
461.80
461.73
462.37
462.73
462.77
462.33
461.83
462.57
463.47
462.97
462.10
461.97

Mmmmm la tua ascella è caldina.... solo 450 gradi xD

Io ho montato LM35 senza resistenze, come la Fig. 1 del datasheet (http://www.robot-italy.net/downloads/lm35.pdf)
Per fare le prove come in Fig. 8 devo procurarmi le resistenze.

Cecé, sei sempre il solito :drooling_face:, prima di dare aria ai denti rileggiti 13 pagine di Topic, poi decidi se pontificare oppure stare zitto, seguire e imparare, ok? e poi al massimo sarebbero 45°, non ti pare?

@ Alberto: hai sostituito lo sketch, i conti tornano, ma sarebbe bene se mi confermassi la misura della tensione sul pin ARef, in ogni caso continua a fare rilevazioni ambientali, poi trovati il suggerimento di QS per fare la prova "granita" e la esegui appena puoi.

@ Paolo: certamente, la prova va replicata con 10 metri di cavo twisted e le due coppie di R; se hai possibilità la cosa migliore è realizzare il terminale con sensore e resistenze su una piccola millefori, facendo in modo che il sensore sporga orizzontalmente su uno dei lati della millefori. Se non ti metti in queste condizioni le prove non serviranno a nulla, purtroppo.

EDIT: per capirci vi allego il grafico aggiornato: l'immagine superiore è quella fatta con i calcoli che ho dedotto dal data-sheet, quella inferiore è il risultato di un "correttivo" di 30mV applicato per prova..... siamo quasi alla perfezione, considerando le varie tolleranze in gioco e che siamo tutti abbastanza certi dell'errore di misura degli 0°C

michele scusami ma mi sono dimenticato di chiederti che cosa è Aref?? è dove il pin del segnale?
la prova con la granita la faccio domani.

accanto al pin 13 ci sono sia Aref che GND, misura la tensione precisa tra quei due punti, metti il tester su fondo scala 2V; l agranita può essere di qualsiasi gusto :stuck_out_tongue: