LusoRobótica - Robótica em Português
Electrónica => Componentes Genéricos => Tópico iniciado por: Psycop em 21 de Janeiro de 2012, 19:28
-
Olá
Tenho andado a explorar o Arduino ligado a um Temperature Sensor – LM335A, mas não estou a conseguir fazer medições correctas.
Estou a usar o seguinte esquema de ligações:
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fwww.danielandrade.net%2Fwp-content%2Fuploads%2F2008%2F07%2Farduino-temperature-sensor-lm35.png&hash=d56ebee75a33a16511d19307c63943c92034ed85)
E o Seguinte Código:
float temp;
int tempPin = 0;
void setup()
{
Serial.begin(9600);
}
void loop()
{
temp = analogRead(tempPin);
temp = (temp * 0.48828125) - 273.15;
Serial.println(temp);
delay(1000);
}
Obtenho sempre leituras na ordem dos 300 / 301. Isso não é possivel, O que estou a fazer de mal?
Tentei também com este exemplo:
(https://lh6.googleusercontent.com/-RsfzgB4YwGk/TXoz9VYShII/AAAAAAAAAFk/KQ5fouPUASA/s400/Untitled+Sketch_bb2.png)
Mas usei um resistor de 10k, mas também não consegui medições correctas, com o seguinte código:
float temp_in_celsius = 0, temp_in_kelvin=0, temp_in_fahrenheit=0;
void setup()
{
Serial.begin(9600);
}
void loop()
{
//Reads the input and converts it to Kelvin degrees
temp_in_kelvin = analogRead(0) * 0.004882812 * 100;
//Converts Kelvin to Celsius minus 2.5 degrees error
temp_in_celsius = temp_in_kelvin - 2.5 - 273.15;
temp_in_fahrenheit = ((temp_in_kelvin - 2.5) * 9 / 5) - 459.67;
//Print the temperature in Celsius to the serial port
Serial.print("Celsius: ");
Serial.println(temp_in_celsius);
//Print the temperature in Fahrenheit to the serial port
Serial.print("Fahrenheit: ");
Serial.println(temp_in_fahrenheit);
Serial.println();
delay(1000);
}
Alguém me poderá dar umas dicas?
Cumps
-
o output do LM335A é em Kelvin e são 10mV por grau
http://www.national.com/mpf/LM/LM335A.html#Overview (http://www.national.com/mpf/LM/LM335A.html#Overview)
portanto a temperatura em ºC será:
(((temp/1023)x5)x100)-273
se não me engano ;)
-
Podias explicar-me melhor esses cálculos?
E porquê?
Cumps
-
o valor lido vai ser um valor de 0 a 1023, mas quer-se um valor em Volts logo: (temp*5)/1023
o output do LM335 é em mV, para converter para Volts multiplica-se por 100
com isto obtens um valor em Kelvin, para converter para Celsius subtrais 273
0 ºK = -273 ºC
-
Mas para isso funcionar tenho de usar o resistor de 10k?
É que tentei isso com o primeiro esquema e estou a receber temps de 28ºc o que não esta correcto!
Cumps
-
não, ligado dessa maneira serve para calibrar, para uso normal basta assim:
(https://labitat.dk/w/images/8/8c/Circ-10-lm335-diagram.png)
-
Ou seja, posso ligar os pinos directamente ao arduino sem usar qualquer resistência.
Mas porque é que dessa maneira me está a dar cerca de 10ºc acima do real?
Cumps
-
basta usar a R1 do esquema
tens outro para testar?
-
Não tenho outro para testar!
O R1 que dizes é directamente não é? Sem qualquer resistor?
Um facto curioso é que quando coloco o dedo sobre o sensor os valores deviam aumentar, mas diminuem!
Porque será?
Tenho algo invertido?
Cumps
-
R1 é o nome da resistencia nesse circuito, o LM335 serve de divisor de tensão que varia conforme a temperatura, essa resistencia é sempre necessária ou os valores não serão os reais.
ligas o pino 0 ao 2º pino do LM335, o 3º ao GND e uma resistencia de 1k dos 5V ao 2º pino do LM335
pode ser que esta imagem seja mais esclarecedora:
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fwww.nearsys.com%2Fcatalog%2Fexperiments%2Flm335.jpg&hash=d8c6dda545fcb766329b1011681f66029a7ec087)
-
Olá
Eu estou a colocar assim como está na imagem em anexo!
Estou a fazer mal?
Ainda sou muito noob em esquemas electrónicos!
Cumps
-
assim penso que esteja bem
-
Penso que era eu que tinha a resistência errada!
Estava a usar uma com o seguinte código de cores: (Dourado, Laranja, Preto, Castanho) e dava valores negativos, cerca de -2ºc)
Experimentei com uma (Dourado, e Depois 3 Tons de Vermelho) e começou a dar temperaturas na ordem dos 18ºc que é +/- a temperatura que está realmente (cerca de 17ºc / 17.5ºc).
Cumps
-
a 1ª era de 10k essa é de 2.2k
-
Pois, eu ainda ando muito baralhado com essas coisas!
Amanhã irei procurar pelos códigos de cores de cada uma, e corrigir! No entanto com a de 2.2 parece estar a funcionar bem!
Cumps
-
(...) o seguinte código de cores: (Dourado, Laranja, Preto, Castanho) (...)
Não admira que andes baralhado, estás a ler o código de trás para a frente :); ou seja essa resistência lê-se castanho-preto-laranja-dourado. O código começa a ler-se do lado em que a risca de cor está mais perto da extremidade da resistência, ou do lado em que estão 3 riscas mais juntas, ou então decoras que dourado e prateado indicam a tolerância e é sempre no final do código.
O LM335 tem um erro inicial de até +/-9ºK (não é explicito na datasheet que é +/- mas é a única forma de fazer sentido), mas podes calibrá-lo com um pot ou corrigir o erro em software. Isto quer dizer que tens que o submeter a uma temperatura conhecida, medir o valor que ele dá na saída e daí aplicar um valor que corrija esse erro em todas as leituras. Por exemplo, se o submeteres a 25ºC e o arduino ler 32º, o erro é de +7º e então passas a subtrair sempre 7ºC às leituras no arduino.
2.2K parece-me uma boa resistência. Essa resistência tem que permitir entre 0.4mA e 5mA de corrente pelo sensor. O intervalo de funcionamento do sensor é entre -40ºC e 100ºC. A 25ºC a saída do sensor está perto de 3V (valor da datasheet). Como é de 10mV/ºC, a 100ºC o sensor terá 3V + (100 - 25) x 10mV = 3V + 750mV = 3.75V, e a -40ºC a saída do sensor é de cerca de 3V + (-40 - 25) x 10mV = 3V + (-650mV) = 2.35V. Aplicando agora a Lei de Ohm podemos calcular a corrente que passa pelo sensor em amos os extremos de temperatura, que é a mesma que passa pela resistência, para vemos se está sempre entre 0.4mA e 5mA:
a -40ºC : (5V - 2.35V) / 2200 Ohm ~ 1.2 mA -> OK!
a 100ºC : (5V - 3.75V) / 2200 Ohm ~ 0.568 mA -> OK!
Com a resistência de 10K o sensor não ia funcionar bem a todas as temperaturas possíveis. Por exemplo a 100ºC, a corrente seria (5V - 3.75V) / 10000 Ohm = 0.125 mA, que é muito baixo para o sensor funcionar.
É melhor a corrente ser baixa do que ser alta, porque quanto maior for a corrente mais o sensor aquece pela potência dissipada nele próprio, introduzindo um erro extra na leitura (o sensor aquece-se a si próprio!).
Fui claro?
-
Olá
Sim foste muito esclarecedor! =)
De momento os testes que tenho feito usando a resistência de 2.2 k tenho obtido valores bastante correctos, falhando por cerca de 0.5ºc \ 1ºc o que para mim é aceitável!
Irei estar mais atento a estes pequenos pormenores que podem fazer a diferença!
Cumprimentos