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?
Tags:
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.
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por