Olá a todos.

Estou trabalhando num projeto que tem como objetivo de usar um LM35 como monitor de temperatura em uma caixa de acrílico e um cooler (12V) como tentativa de diminuir a temperatura da caixa no caso de a temperatura passar de um limite dito no código para o Arduíno. A comunicação da temperatura é feita usando um ethernet shield em uma rede local. 

A ligação do motor do cooler é feito usando esquema a baixo. O transistor que estou usando é um TIP120 (neste caso acredito que não é necessária a utilização do diodo, mas em todo caso mantive por preciosismo).

O LM35 esta ligado em uma das portas analógicas. 

O sistema todo vai pro espaço quando coloco o Shield e subo o código p/ o Arduíno. Quando o LM35 é ligado na porta A0 a resposta vai p/ 400, 500 C.Na porta A2 ele funciona normal, mas a leitura fica em torno de 30 - 33 C durante quatro ou cinco leituras e ai passa para valores muito mais altos(40 - 50 C) e a temperatura não sobe nem desce com fatores que deveriam muda-la (ferro de solda próximo ou algo que diminuía a temperatura).

Já tentei usar vários códigos e todos tem o mesmo comportamento, no momento estou tentando algo bem simples ainda sem o uso dos códigos para o Ethenet (mas ainda mantenho ele conectado, pois até sem ele o comportamento é o mesmo).

const int LM35 = A5; // Pino Analogico onde vai ser ligado ao pino 2 do LM35
const int REFRESH_RATE = 2000; //Tempo de atualização entre as leituras em ms
const float CELSIUS_BASE = 0.4887585532746823069403714565; //Base de conversão para Graus Celsius ((5/1023) * 100)
const int LED_Controle = 8;
float Controle;

#include <LiquidCrystal.h> //Inclui a biblioteca do LCD
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //Configura os pinos do Arduino para se comunicar com o LCD

int temp; //Inicia uma variável inteira(temp), para escrever no LCD a contagem do tempo


void setup() {
Serial.begin(9600);
pinMode(LED_Controle, OUTPUT);

lcd.begin(16, 2); //Inicia o LCD com dimensões 16x2(Colunas x Linhas)
lcd.setCursor(0, 0); //Posiciona o cursor na primeira coluna(0) e na primeira linha(0) do LCD
lcd.setCursor(0, 1); //Posiciona o cursor na primeira coluna(0) e na segunda linha(1) do LCD
}

void loop() {
Serial.print("Temperatura: ");
Serial.println(readTemperature());
delay(REFRESH_RATE);
Controle = readTemperature();
lcd.print(Controle); //Escreve no LCD "Olá Garagista!"


if(Controle > 33.00)
{
digitalWrite(LED_Controle, HIGH);
}
else
{
digitalWrite(LED_Controle, LOW);
}

lcd.setCursor(13, 1); //Posiciona o cursor na décima quarta coluna(13) e na segunda linha(1) do LCD
lcd.print(temp); //Escreve o valor atual da variável de contagem no LCD
delay(1000); //Aguarda 1 segundo
temp++; //Incrementa variável de contagem

if(temp == 600) //Se a variável temp chegar em 600(10 Minutos),...
{
temp = 0; //...zera a variável de contagem
}
}

float readTemperature(){
return (analogRead(LM35) * CELSIUS_BASE);
}

OBS: Como vou usar um display para informar offline, já coloquei isso no código. 

Alguém já passou por algo assim? 

Exibições: 3068

Responder esta

Respostas a este tópico

Bom dia José, como vai? Talvez no seu caso, seja interessante usar resistores de Pull Down. Como você está trabalhando com LM35 e ele oscila muito, experimente colocar em sua programação algo do tipo:

analogWrite(A2, LOW);

Não me lembro corretamente da estrutura, mas é algo assim. Aterre o seu pino de leitura logicamente (caso nao esteja aterrando fisicamente). Faça o teste e nos reporte.

Abs

 

 Olá José.

 Vendo as respostas, vejo que o André tem razão, pode ser que você esteja tendo problema com ruídos.

 Mas estou pensando  em outro caso, onde a referência do AD do Arduino esteja mudando devido ao consumo do Ethernet Shield. Para confirmar, você poderia colocar um divisor de tensão com 2 resistores ligados à outra fonte de alimentação, calculados para fornecer 1.0 V mais ou menos, ou  utilizar uma pilha caso não tenha a fonte externa, e ligar essa tensão nos seus pinos de leitura. Pelo valor lido do AD você já consegue depurar se sua referência está tendo influência do shield.

 Pensando por cima: se o consumo for alto, a tensão de referência será menor, então o  valor de leitura irá subir.

 Lembrando que neste teste você não poderá utilizar a fonte de tensão do Arduino caso esteja usando os divisores de tensão ao invés da pilha, pois como a alimentação irá mudar também, a relação na variação iria ser proporcional, então você não observaria mudança nenhuma.

 Espero ter ajudado.

 T+

O que me fascina na eletronica, tanto analógica, digital, como de potência, é que não existe apenas um modo de se fazer as coisas. Então eu quero dar a minha opinião sobre seu projeto.

Faça o controle do motor usando um TIP120, na base do TIP120, através de um resistor de 5K6 vc pode ligar uma saida PWM do arduino.

O LM35 vc o mantém na porta analógica, é lá mesmo que deve ser ligado.

No seu código vc faz um controle de PWM relativo a temperatura, quanto maior a temperatura, maior o PWM, ou seja, quanto mais quente mais rápido o motor deve girar para resfriar o que se deseja.

Uma dica para resolver o problema de ruído do LM35 é usar dois capacitores cerâmicos de 1uF.

Esses capacitores devem ser ligados entre a alimentação positiva e a saida do LM35 e a alimentação negativa e a saida do LM35, conforme ilustrei na imagem acima. ligando os capacitores assim vc estabiliza a leitura, pois o capacitor mantem por uma fração de segundos a valor anterior enquanto carrega um valor novo, este valor na verdade é uma variação de tensão com base na temperatura, assim os capacitores estabilizam essa tensão. Não se preocupe com o tempo de resposta, os capacitores vão criar um atraso pequeno que pode ser desconsiderado, da ordem de uns 50ms, que acredito que para sua aplicação isso é o mesmo que nada.

O esquema de ligação do motor eu tb desenhei.

É um pouco diferente do que vc projetou e funciona.

OBS: Outra vantagem de usar o TIP120 é que ele tem um diodo interno, que ajuda a bloquear a tensão reversa do motor, então se vc for usar um diodo é opcional neste caso. O TIP120 suporta uma corrente de trabalho de 3A e uma corrente de pico de 5A e pode trabalhar com uma carga de até 60VDC.

OBS2: A tensão reversa é uma tensão gerada pelo motor quando ele é desenergizado. Quando se desliga a alimentação de um motor ele não freia instantâneamente, ele continua girando até q o atrito o faça parar, durante este tempo que ele continua girando ele gera uma tensão contraria a tensão que o estava alimentando, e isso pode danificar transistores e até seu arduino, então é pra isso que se usa um diodo ligado reversamente a tensão de alimentação de um motor, o mesmo acontece com relés tb, é altamente recomendável ligar um diodo na alimentação das bobinas de um relé pois qdo ele é desenergizado as linhas de campo magnético residuais geram essa tensão reversa e o dido ligado corretamente não permite que essa tensão retorne ao circuito.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço