Problemas com relé

sobre o problema com o rele quando eu liga-lo novamente então avaliamos.
sobre o sistema é o seguinte...
da corrente AC da casa passa para o Driver do led que transforma em CC com 54V e mantém sempre a mesma amperagem, são especificos para led...
mas vamos esperar eu chegar novamente la.... até agora esta marcando a temperatura no lcd normalmente e quando eu desplugo da porta A15 ele escreve no serial print o no more adresses e trava o sistema como eu queria....

se ficar tudo estável vou ligar os reles com leds pequenos ligados direto no arduino com um resistor. um led verde (simulando um refrigerador) e um led vermelho (simulando um aquecedor). assim confirmo que o script esta tudo ok, estando ok eu ligo o aquecedor de 400W ai parto para a Luminaria Led do aquario

como ficou algumas horas sem problema algum com o lcd decidi dar um passo
coloquei o seguinte comando no script:

if (celsius <= 27.0)digitalWrite(aquecedor, LOW);
if (celsius >= 27.5)digitalWrite(aquecedor, HIGH);
//statusHeater = digitalRead(aquecedor);

if (celsius >= 28.0)digitalWrite(resfriador, LOW);
if (celsius <= 27.5)digitalWrite(resfriador, HIGH);
//statusFan = digitalRead(resfriador);

Meu relé é invertido, o LOW liga e o HIGH desliga.

Ou seja quando baixar de 27 graus ele liga o LED VERMELHO e quando passa de 28 graus ele liga o LED VERDE
Está tudo ok ate o momento, a primeira pergunta.....

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?

fiz a leitura da entrada como vc falou e ficou perto dos 280 com o sensor desplugado e 1021 com ele plugado...

Nao estou a entender tens um sensor one-wire da dallas e aqui falas pelo que me parece de leituras do ADC?
Tens mais que um tipo de sensor?

void loop(void) {
byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
float celsius;

Teres estas variaveis globais declaradas aqui nao é boa pratica.
Por exemplo o byte present a cada volta na loop vai receber o valor 0, imagina que a usas no codigo abaixo logo de seguida ela é reniciada o que se torna inutil!
A nao ser que tenhas um bom motivo para as teres ai retira-as para fora antes do Void Setup por exemplo

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.