Olá pessoal, estou adaptando um codigo do cookbook para montar um termostatopara meu aquario,

consegui fazer o hardware imprimir no lcd a temperatura atual, a temperatura ideal e o estado da saida pino 13, falta agora conseguir tornar a temp ideal configuravel através de botões ou um potenciometro.

gostaria da ajuda dos feras aqui pra retirar uma mancha que aparece ao lado da temp ideal.

o funcionamento é o seguinte: configuro a temperatura ideal no pc, por exemplo 28ºC e quando a temperatura baixa até o valor setado liga o pino 13 onde vou instalar um TIC 226 para ligar o aquecedor.

o código está abaixo

//*termostato baseado no cookbook adaptado pra LCD ajustavel apenas via PC

#include <LiquidCrystal.h>
const int numRows = 2;
const int numCols = 16;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

const int inPin = 0; // sensor conectado no pino analogico 0
const int outPin = 13; //2; // saida digital
const int threshold = 28; // valor de leitura que habilita a saida digital
void setup()
{
Serial.begin(9600);
lcd.begin(16, 2);
pinMode(outPin, OUTPUT);
}
void loop()
{
int value = analogRead(inPin);
long celsius = (value * 500L) /1024; // 10 mV por graus c, see text
lcd.setCursor(0,0);
Serial.print(celsius);
lcd.print(celsius);
Serial.print(" graus Celsius: ");
lcd.print((char)223);
lcd.print("C");
if(celsius < threshold) //se celsius menor que threshold ligar pino 13
{
lcd.setCursor(6,1);
digitalWrite(outPin, HIGH);
Serial.println("pino on");
lcd.print(" ligado ");
}
else
{
lcd.setCursor(6,1);
digitalWrite(outPin, LOW);
Serial.println("pino off");
lcd.print("

desligado");

lcd.setCursor(0,1);
lcd.println(threshold);
lcd.print((char)223);
lcd.print("C");

}
delay(1000); // delay de 1 segundo
}

e a mancha que peço aos amigos para me ajudar está na foto abaixo,

no aguardo pessoal e muito obrigado.

Exibições: 3779

As respostas para este tópico estão encerradas.

Respostas a este tópico

Erick,

No capitulo 15.16 do cookbook tem um exemplo onde é obtida a média de 8 leituras do sensor de temperatura.

No seu sketch voce deve trocar a linha onde é feita a leitura da entrada analógica pela chamada da função abaixo.

retirar:       int value = analogRead(inPin);

inserir:       nt value = getTemperature(inPin);

acrescentar a função:

float getTemperature(int pin)
{
   const int nbrSamples = 8; // take the average of 8 samples
   int samples = 0;
   for(int i=0; i < nbrSamples; i++)
      samples = samples + analogRead(pin);

      delay(100); // este delay aumenta o intervalo entre as amostras, não está      no cookbook
   float t = samples / nbrSamples; // get the average value
   t = (t /1024.0) * 500; // each degree C is 10mv
   return t;
}

 cara acabei de testa da maneira que esta acima, acusou alguns erros que consegui corrigir mas um erro persiste, vou postar a sketch e oque a IDE está indicando, talvez vc possa me ajudar.

//*termostato baseado no cookbook adaptado pra LCD ajustavel apenas via PC

#include <LiquidCrystal.h>
const int numRows = 2;
const int numCols = 16;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

const int inPin = 0; // sensor conectado no pino analogico 0
const int outPin = 13; // saida digital para transitor TIC 226
const int threshold = 28; // valor de referencia que habilita a saida digital
void setup()
{
Serial.begin(9600);
lcd.begin(16, 2);
pinMode(outPin, OUTPUT);
}
void loop()
{
int value = analogRead(inPin);
float getTemperature(int pin);

const int nbrSamples = 8; // take the average of 8 samples
int samples = 0;
for(int i=0; i < nbrSamples; i++)
samples = samples + analogRead(inPin);
delay(100); // este delay aumenta o intervalo entre as amostras, não está no cookbook
float t = samples / nbrSamples; // get the average value
t = (t /1024.0) * 500; // each degree C is 10mv
return t;

long celsius = (value * 490L) /1024; // caso precise calibrar o valor da temperatura alterar o valor entre parentesis
lcd.setCursor(0,0);
Serial.print(celsius);
lcd.print(celsius); //esta linha diz para printar o valor da linha 20
Serial.print(" graus Celsius: ");
lcd.print((char)223);
lcd.print("C");
if(celsius < threshold) //se celsius menor que threshold ligar pino 13
{
lcd.setCursor(5,1);
digitalWrite(outPin, HIGH);
Serial.println("pino on");
lcd.print("ligado "); //note que os
}
else
{
lcd.setCursor(5,1);
digitalWrite(outPin, LOW);
Serial.println("pino off");
lcd.print("desligado");

lcd.setCursor(0,1);
lcd.print(threshold);
lcd.print((char)223);
lcd.print("C");

}
delay(1000); // delay de 1 segundo
}

e o erro persistente que não consegui corrigir.

termostato_2.cpp: In function 'void loop()':
termostato_2:28: error: return-statement with a value, in function returning 'void'

no aguardo, valeu mano.

Erick, fiz umas mudanças, agora não está dando erro ao compilar, testa ai pra ver deu certo e me retorna, ok?

//*termostato baseado no cookbook adaptado pra LCD ajustavel apenas via PC

#include <LiquidCrystal.h>
const int numRows = 2;
const int numCols = 16;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

const int inPin = 0; // sensor conectado no pino analogico 0
const int outPin = 13; // saida digital para transitor TIC 226
const int threshold = 28; // valor de referencia que habilita a saida digital
void setup()
{
  Serial.begin(9600);
  lcd.begin(16, 2);
  pinMode(outPin, OUTPUT);
}
void loop()
{
  float getTemperature(int pin);

  const int nbrSamples = 8; // take the average of 8 samples
  int samples = 0;
  for(int i=0; i < nbrSamples; i++)
    samples = samples + analogRead(inPin);
  delay(100); // este delay aumenta o intervalo entre as amostras, não está no cookbook
  float t = samples / nbrSamples; // get the average value
  long celsius = (t * 490L) /1024; // caso precise calibrar o valor da temperatura alterar o valor entre parentesis
  lcd.setCursor(0,0);
  Serial.print(celsius);
  lcd.print(celsius); //esta linha diz para printar o valor da linha 20
  Serial.print(" graus Celsius: ");
  lcd.print((char)223);
  lcd.print("C");
  if(celsius < threshold) //se celsius menor que threshold ligar pino 13
  {
    lcd.setCursor(5,1);
    digitalWrite(outPin, HIGH);
    Serial.println("pino on");
    lcd.print("ligado "); //note que os
  }
  else
  {
    lcd.setCursor(5,1);
    digitalWrite(outPin, LOW);
    Serial.println("pino off");
    lcd.print("desligado");

    lcd.setCursor(0,1);
    lcd.print(threshold);
    lcd.print((char)223);
    lcd.print("C");

  }
  delay(1000); // delay de 1 segundo
}

 e ae marcos, já testei. durante a queda de temperatura parece que está mais estavel mas o problema continua, veja o video abaixo.

http://youtu.be/iqiEgpuVC1c

e na subida de temperatura indica a leitura da mesma forma que está no video.

mano, acredito que uma hora nos possamos resolver isso, mas todos os códigos que achei na net tem esse mesmo problema, estranho né!

abraço.

Erick, tá estranho mesmo, voce já tentou trocar o LM35 pra testar? Qual a fonte que voce está usando para alimentar o arduino?

 cara, não troquei o LM35 não, até pq comprei só 1, será que é problema do componente? a fonte que estou usando? por enquanto está alimentado apenas pelo USB do pc, vou testa com outras fontes externas, mas se fosse problema de vvariação de tensão, não daria pau somente na passagem de desligado para ligado, acho que daria pau o tempo todo, mas mesmo assim vou comprar outro LM35 e colocar outra fonte pra ver.

vlw.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço