segunda-feira, maio 26, 2014

Sensor Temperatura Oleo + Arduino + Matlab

Bem, preciso ler a temperatura do óleo do motor do carro.
Um motor antigo, que utiliza um sensor genérico de chavete/fusca/monza.

Neste caso o modelo é um Marflex 8011, cujo fabricante não fornece especificações técnicas do sensor, e sim apenas a aplicação em veículo/modelo/ano.



Para este sensor, quando medido sua resistência em temperatura ambiente : 25C, o mesmo apresenta resistência de 2200ohm (2k2).
Por ser um sensor tipo NTC, quanto maior a temperatura, menor a resistência apresentada pelo sensor.

Visando mapear a relação temperatura/resistência, conectamos o mesmo em um multimetro e colocamos o sensor imerso em agua, tomando o cuidado para não curto-circuitar os polos positivo (terminal) e negativo (rosca)  do sensor. Assim apenas a parte da rosca do sensor ficou submersa.

Juntamente com o sensor, foi imerso um termômetro o qual indicará a temperatura da água em um dado instante, podendo relacionar a temperatura indicada, com o valor de resistência medido.




Em verde o multimetro indicando a resistência em kOhm e em vermelho o termômetro indicando a temo em C

Iniciou-se o processo com agua "gelada" a 10C, e elevou-se até a fervura 96C.
A aproximadamente cada 5C de elevação de temperatura, foi medido o valor da resistência, fornecendo um total de 19 pontos medidos.



Temperatura C Resistencia kOhm
10 4
15 3,3
18 3
20 2,8
25 2,2
30 1,7
35 1,35
40 1,15
45 0,9
50 0,75
55 0,65
60 0,5
65 0,45
70 0,35
75 0,3
80 0,25
85 0,2
90 0,18
95 0,15


Ao traçarmos o gráfico que relaciona a temperatura C com a resistência do sensor em kOhm, obtemos uma curva aproximada que não caracteriza bem o comportamento do sensor.

Visando aproximar esta cursa, e com o uso do Matlab, foi calculado um regressão exponencial de 2 ordem, o qual estimou os melhores coeficientes da curva para o sensor.

M = load('sensor.txt');
%Computa regressao exponecial de 2 ordem
%ft=fittype('exp2');
%cf=fit(M(:,2),M(:,1),ft);
% aplica valores lidos:
dados = M(:,2);
%
% General model Exp2:
% cf(x) = a*exp(b*x) + c*exp(d*x)
% Coefficients (with 95% confidence bounds):
% a =       73.89  (67.5, 80.28)
% b =      -5.436  (-6.305, -4.566)
% c =       69.19  (63.08, 75.3)
% d =     -0.4682  (-0.5291, -0.4074)
ptr=1;    
for i=1:22
    result(ptr) = 73.89*exp(-5.436*dados(i)) + 69.19*exp(-0.4682*dados(i));
    ptr=ptr+1;
end
result

Assim, o grafico abaixo ilustra em vermelho, a curva medida, e em azul, a curva aproximada.
(Clique na imagem para aumentar)



A curva em azul informará melhor o valor da temperatura com base na resistência medida, e mapeado conforme equação abaixo:

Temperatura = 73.89*exp(-5.436*Resistencia) + 69.19*exp(-0.4682*Resistencia);

Novos testes ainda são necessários, e quem sabe o fabricante não queira facilitar minha vida :-)



[]'s

2 comentários:

Fabio Wielewski disse...

Boa noite,

Primeiramente parabéns, gostaria de saber, porque você não usou um sensor com lm35? e segundo como você fez para pegar o RPM com Arduino, poderia detalhar mais seu projeto? preciso pegar o RPM do cabo da vela, poderia me ajudar?

Obrigado.

Marsolla disse...

Olá Fabio, o sensor é original do motor do carro e um LM35 nao tem garantias de operação em ambiente extremo com sujeiras, vibrações, sem contar que vc teria q colocar ele dentro do cárter do motor...
Para pegar o RPM, neste caso estou usando um sensor ótico e não diretamente do cabo de vela.