Problemas com relé

meio fgrau de histerese vai dar sarilho...

que sensor tens afinal?

Também concordo, podes fazer uma amostragem das temperaturas durante um x tempo de depois calcular a media das temperaturas, desta forma suavizas o "mexer" rápido dos reles que respondem logo com essa margem tão pequena

lmeireles43:
Coloquei o comando para o resfriador e o aquacedor logo abaixo do no more adresseses pois achei que travava, porém não é isto que acontece, o relé fica ligando e desligando..... fiz a leitura da entrada como vc falou e ficou perto dos 280 com o sensor desplugado e 1021 com ele plugado... ou seja quando ele fizer a leitura perto dos 280 eu quero que desligue o aquecedor e o resfiador e ligue uma luz de alerta... como fazer isto?

Quando compilas o programa, aparecem alguns warnings? (provavelmente não por causa dos settings do Arduino)
Existe a remota possibilidade de estares a usar a variável float sem inicializares... daí dar problemas.

Eu não tenho a certeza do que é que o return faz dentro da loop, por isso nada como fazer assim:

if ( !ds.search(addr)) {
    Serial.println("No more addresses.");
    Serial.println();
    digitalWrite(LED_ERRO, HIGH); //ligar uma luzinha para dar erro... 
    while (!ds.search(addr) {  //enquanto não encontrar o sensor, fica preso aqui a procurar. 
        ds.reset_search();
        delay(250);
    }//return;
  }

Ou então, uma solução mais "civilizada"...

#include <OneWire.h>
#include <LiquidCrystal.h>
#define Luz_Fundo  6

LiquidCrystal lcd(8, 7, 5, 4, 3, 2);
OneWire  ds(A15);  // on pin 10

void setup(void) {
  Serial.begin(9600);
  pinMode(Luz_Fundo,OUTPUT); //define o pino como saída
   lcd.begin(16, 2); //inicia o lcd com 2 linhas e 16 colunas
   digitalWrite(Luz_Fundo,HIGH); // Liga a luz do display.
}

void loop(void) {
  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius;
  
  if ( !ds.search(addr)) {
    Serial.println("No more addresses.");
    Serial.println();
    ds.reset_search();
    delay(250);
//    return;
  } else { //se o sensor estiver bom... corre esta parte do programa. 
   ds.reset();
  ds.select(addr);
  ds.write(0x44,1);         // start conversion, with parasite power on at the end
  
  delay(1000);     // maybe 750ms is enough, maybe not
  // we might do a ds.depower() here, but the reset will take care of it.
  
  present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE);         // Read Scratchpad

 for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data = ds.read();
 }
  // convert the data to actual temperature
unsigned int raw = (data[1] <<  | data[0];
  if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {
      // count remain gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    if (cfg == 0x00) raw = raw << 3;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw << 2; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw << 1; // 11 bit res, 375 ms
    // default is 12 bit resolution, 750 ms conversion time
  }
  celsius = (float)raw / 16.0;
  Serial.print("  Temperature = ");
  Serial.print(celsius);
  Serial.print(" Celsius, ");
  lcd.setCursor(0,0);
  lcd.print(celsius);
} //fim do else. 
}

Como o Hugo disse, ter as variáveis ali por inicializar não é boa prática.

Quanto ao teu controlo de temperatura... se apenas tivesses uma fonte de energia (aquecedor, arrefecedor), o controlo de termostato funcionaria (duvido que fosse óptimo) com uma histerese tão pequena (dependendo onde tens o sensor e onde tens o actuador). No entanto, com duas fontes de energia isso vai provocar fazer com que o sistema descontrole completamente.
Qual é a gama de conforto que os peixes necessitam? Certamente que serão entre 3 a 5 graus, não? Porque não usar essa gama para a tua histerese?

Outra questão:
Qual é em média a temperatura da tua casa? Eu acredito que não tenhas um ar condicionado para arrefecer no verão, já aquecer no Inverno certamente que terás algo que coloque a temperatura da casa acima daqueles 5 que falaste anteriormente. Tens ideia de qual é a temperatura da casa durante o Inverno? Efectivamente esse será o teu limite baixo para o sistema de controlo.

Tu falaste em ventoínhas para arrefecer a água. Que ventoínhas são essas? São ventoínhas de 230V? Ou ventoínhas de 12? Se tiveres ventoínhas de 12V, poderias implementar diferentes controlos para a temperatura da água.
Por exemplo, para aquecer colocar um controlo tipo termostato (on/off) com o relé e resistência e para arrefecer usar um PWM para controlar a ventoínha e podias ver um PID por exemplo...
Isto não são coisas necessárias... apenas ideias para melhorar o sistema.

muito obrigado a vocês dois pela grande ajuda.
Quando chegar em casa vou atualizar com as dicas que vocês passaram, colocar aqueles valores em cima do void e o codigo atualizado do bubulindo.

Quero fazer um controle total de um aquario marinho para corais, por isto preciso de meio grau de variação. Mas isto não é problema, a agua mantem a temperatura e não fica variando. Ou apenas o ventilador liga ou apenas o aquecedor liga.

Ficou a noite inteira rodando o seguinte hardware.

Um led vermelho simulando o aquecedor
um led verde simulando um ventilador
um sensor de temperatura ds18b20
rele shield
lcd shield
Rodou sem erro algum.
Para fechar esta primeira etapa, preciso apenas que trave tudo quando o ds for desconectado, vou utilizar a dica hoje e ver se funciona.

para identificar vou postar a etapa final do sistema de controle de temperatura que eu quero.

Um ventilador de 220v no lugar do led verde que utilizo hoje
um aquecedor de 400w no lugar do led vermelho que utilizo hoje
o ds18b20

quando este sistema rodar sem problemas por alguns dias eu inicio o controle da luminária também... mas agora vamos por etapa para não embaralhar tudo, apenas a temperatura por enquanto.
Verifiquei que o sensor com este novo código está mais lento para lançar a temperatura, eu coloco o dedo para aquecer o sensor e demora bastante até retornar a temperatura ambiente... antes era mais rápido.

Ao final podemos disponibilizar este controle de temperatura para todos, garanto que mais gente interessado em controlar o aquario.

acabei de chegar em casa e esta funcionando 100% ainda.

bubulindo, coloquei como vc descreveu porém funciona apenas quando o arduino inicia, e não quando ele esta em funcionamento... por exemplo está ligado no aquário e então o cabo desconecta, rompe a ligação... ele vai achar que esta em 0 graus e continuar esquentando, este é meu medo e por isto quero esta trava.
outra coisa, se eu inicio ele sem o cabo ele alerta e trava ali porém o relé que estava ligado continua ligado.... tentei colocar o comando ali para o relé desligar mas não deu em nada.

Ok...

Nada mais simples:

if ( !ds.search(addr)) {
    Serial.println("No more addresses.");
    Serial.println();
    digitalWrite(LED_ERRO, HIGH); //ligar uma luzinha para dar erro... 
    digitalWrite(aquecedor, HIGH);  //desliga aquecedor
    digitalWrite(resfriador, HIGH);   //desliga resfriador.         
    while (!ds.search(addr) {  //enquanto não encontrar o sensor, fica preso aqui a procurar. 
        ds.reset_search();
        delay(250);
    }//return;
  }

Se desligares os relés quando entrar em erro, isso não acontece.

Os relés não estão sempre a ligar/desligar?

funcionou mas tive que colocar o desligamento dos reles no while, como vc postou, mesmo com o ds conectado ele fica ligando e desligando o rele sem parar.....
agora esta ok, vou deixar esse sistema funcionar por um tempinho e ver como se comporta muito obrigado pessoal
ficando perfeito vou incrementar o RTC.....

Pessoal esta rodando até agora e teve o primeiro problema.... ontém quando fui desligar a luz do aquario deu problema no lcd do arduino.

Mas o aquario ainda não tem nada a ver com o arduino, a luz não está ligada no arduino, é um sistema a parte. o arduino só está do lado do aquario e o sensor ds está dentro da agua... apenas isto. Ele continuou funcionando porém o lcd imprimiu um monte de coisas estranha e não voltou ao normal.

O arduino está a uns 45cm dos drivers de leds

Hmmm...

E só tens esta instrução

 lcd.print(celsius);

Para escrever no LCD?
Porque não limpares o lcd antes de voltares a escrever?

O que é que realmente apareceu no LCD?

A minha opinião é que isso é certamente algum problema no sensor e comunicação com o mesmo.
Experimenta, por exemplo, imprimir para o lcd o valor de raw e o valor de celsius. Um está ligado ao outro e certamente que dará uma ideia do problema.

Hugo, no inicio deste tópico acho que respondi para vc isto.. por uma foto... é foi respondido por alguém que é... eu não sei....

Tudo rodou tranquilamente LONGE do aquario sem problema algum, foi só eu colocar do lado do aquario medindo a temperatura dele e quando desliguei a luz do mesmo imprimiu sujeira.....
Imprimiu coisa do tipo #%¨$#%$@¨%&¨@ e travou.... Não acredito que seja nada do sistema do arduino porque o mesmo funcionou sem problema algum longe do driver elétrico do led do aquario... acho que o problema é algum campo magnético, indução ou sei la o que..... A luz desligada ele está la funcionando perfeitamente, bem como ela ligada... o problema foi apenas quando desliguei... Depois liguei e desliguei para ver e não teve problema.... Os leds depois de desligados permanecem acesos por milésimos de segundos e ainda brilham por uns segundo, seria isto capacitor? não seria isto? porque quando liguei e desliguei rápido o led não brilha e desliga na hora e não atrapalhou o funcionamento do lcd.... seria um "capacitor" carregado que da problema no lcd?

bubulindo, o comando clear ou impressão de qualquer outra coisa quando da problema no lcd apaga e são impressos $#¨%#&%$&# em tudo quanto é lugar.... não é envio de informação errado....

Ok...

Segundo passo na resolução do problema. Consegues provocar o erro repetidamente? Ou seja, consegues identificar exactamente o que causa isso?

Acho que podes fazer videos com o Skype... pdoes tentar fazer um video do que se passa e meter no youtube por exemplo para vermos o que se passa mesmo. E, como está tudo ligado com um esquema por exemplo.

foi exatamente na hora que desliguei a luz no timer. então liguei e desliguei novamente e o erro não se repetiu.
o esquema de ligação foi este

http://www.google.com.br/imgres?q=lcd+arduino&hl=pt-BR&sa=X&tbo=d&biw=1170&bih=752&tbm=isch&tbnid=Iryl9CqyqvwGBM:&imgrefurl=http://engenheirando.com/arduino/displaylcd/&docid=eZwqAfbmUQz1dM&imgurl=http://engenheirando.com/wp-content/uploads/2012/04/ArduinoLCD2.png&w=1012&h=513&ei=icULUZfTK4zc8ASZ8IDIBw&zoom=1&iact=hc&vpx=596&vpy=139&dur=7733&hovh=160&hovw=316&tx=210&ty=127&sig=117775725329749755557&page=1&tbnh=135&tbnw=267&start=0&ndsp=23&ved=1t:429,r:3,s:0,i:91

apenas coloquei um resistor no Vo para diminuir a luminosidade e conseguir ver direito

Eu não acho que o problema esteja nas ligações do LCD...
Quando disse uma foto do sistema todo era para perceber o que podia, dentro do sistema todo, causar o problema.
Afinal de contas, se apenas ligares o Arduino ao LCD daquela forma, não tens problema algum, certo?

Nós estamos a tentar ajudar, mas após repetidos pedidos de mostrares todo o sistema e como tens tudo ligado, tu continuas a não dar muita informação ao que já sabemos. Então estamos literalmente a esgotar as possibilidades de ajuda que podemos dar sem mais informação.

Revê os meus posts (tipo os 5 anteriores ou isso) e tentar responder a todas as questões colocadas e logo vemos que mais podemos fazer.

P.S.:
Podes fazer o video e colocá-lo no youtube... não disse que eu ia estar no skype para ver o problema.

Sim sem saber mos essas respostas é tentar adivinhar e a minha bola de cristal está avariada :grin:

colegas segue o vídeo

este vídeo desligando a luz simulando o mesmo problema que aconteceu ontém, hoje não houve problema

este vídeo mostra o sistem, os leds pequenos simulando aquecedor e refrigerador, o lcd shield e o relé shield ligado com os 5v do arduino, fiz uma ponte no vcc para alimentar as saídas do relé, e o sensor de temperatura.

Após ver o teu segundo video das ligaçoes tenho um palpite.Há uns tempos atras vi um video no youtube que agora nao consigo encontrar para te mostrar, que consistia em exemplificar o que pode acontecer se num dos fios do bus de dados que vai para o LCD for colocado um fio no ar ou simplesmente se o prolongares ,tipo um fio de um metro apesar de conectado.O que acontecia é parecido ao que tu contas.
No filme era visivel que quando ele conectava o fio começavam a aparecer artefactos no LCD que iam desaparecendo e aparecendo.
No fundo o que o criador do filme queria transmitir é que as interferencias podem causar esses danos.
Como tu dizes que isso acontece quando ligas a iluminaria dos Leds que recorrem a muito provavelmente a sinais PWM possam estar a emitir interferencias que depois sao captadas pelos teus fios que tens no ar.
É so um palpite mas para o despistares podes tentar reduzir a distancia dos cabos ou entao tentar colocar todo esse circuito dentro de um tumper-ware e depois forra-lo com prata, tipo uma gaiola imune a ruido eletromagnetico.
Muitos equipamentos recorrem à de blindagem eletromagnetica por estes motivos.
Faz o teste é rapido

HugoPT:
É so um palpite mas para o despistares podes tentar reduzir a distancia dos cabos ou entao tentar colocar todo esse circuito dentro de um tumper-ware e depois forra-lo com prata, tipo uma gaiola imune a ruido eletromagnetico.

Lembra-te, o papel de prata é condutor... não faças como eu que queimou uma placa de aquisição da National à custa de fazer uma gaiola de papel de prata.
Mas a ideia é boa e resulta. Experimenta, mas com cuidado. :wink:

pessoa muito obrigado pela ajuda,

Não fiz nada e não aconteceu mais o problema. Tirei tudo da protoboard e fiz uma fiação e ficou mais limpo. Dei também uma arrumada e estruturada no código.

Estou com duas dúvida uma já tentei de tudo e não consegui. Quando a saída do aquecedor por exemplo estiver ligada ou desligada eu gostaria de imprimir isto no lcd, mas o que eu consigo é apenas imprimir o status em 1 e 0. Gostaria de substitui o 1 por LIGADO e 0 por DESLIGADO
aqui está o comando:
statusHeater = digitalRead(aquecedor);
então mando imprimir statusHeater e imprime o numero 1 ou 0 de acordo.

A outra pergunta é... gostaria de imprimir informações de relógio e temperatura no lcd por alguns segundo e logo imprimir outras informações por mais tantos segundos, ficar alternando entre um e outro.....
não gostaria de utilizar delay, apenas um contator separado ou uma condição, por exemplo 10 segundos numa tela e 10 segundo em outra tela