Problemas com relé

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

#1

lcd.print(statusheater== HIGH ? "LIGADO": "DESLIGADO");

#2

#define TIMEOUT 10000

unsigned long now = 0, before = 0; 
unsigned char data = 0; 

if((now = millis())-before > TIMEOUT) {
   if (data == 0) {
      lcd.print("COISAS");
      data = 1; 
      } else {
      lcd.print("OUTRAS COISAS");
      data = 0;
      }
   before = now; 
   }

Quanto ao numero 1, podes fazer algo mais artístico. LOL

const char estados[2][10] = {"LIGADO", "DESLIGADO"};

lcd.print(estados[statusheater]);

bubulindo, tentei de tudo aqui mas a impressão de 10 em 10 segundos não funciona... fica 10 segundos o lcd em branco dai imprime o coisas.... então coloquei o cursos no 0,1 para um e 1,0 para o outro e imprime os dois ao mesmo tempo, tentei mudar algumas coisas mas não funciona.... o statusheater ainda não testei. Utilizei exatamente seu script apenas com a adição do lcd lógico porque tive um problema.... não consigo juntar a impressao da temperatura com a do tempo porque cada um esta me um void, então quando eu coloco em outro lugar ele fala que não esta declarado naquele escopo

void printDate(){
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(zero);
Wire.endTransmission();
Wire.requestFrom(DS1307_ADDRESS, 7);
int second = bcdToDec(Wire.read());
int minute = bcdToDec(Wire.read());
int hour = bcdToDec(Wire.read() & 0b111111);
int weekDay = bcdToDec(Wire.read());
int monthDay = bcdToDec(Wire.read());
int month = bcdToDec(Wire.read());
int year = bcdToDec(Wire.read());

if (hour >= 10 && hour < 24) digitalWrite(luz, LOW);
if (hour >= 0 && hour < 10) digitalWrite(luz, HIGH);

Serial.print(hour);
Serial.print(":");
Serial.print(minute);
lcd.setCursor(0,1);
lcd.print(hour);
lcd.print(":");
lcd.print(minute);
}

void printTemp(){
ds.reset();
ds.select(addr);
ds.write(0x44,1);
delay(1000);
present = ds.reset();
ds.select(addr);
ds.write(0xBE);
for ( i = 0; i < 9; i++) {
data = ds.read();

  • }*

  • unsigned int raw = (data[1] << 8) | data[0];*

  • if (type_s) {*

  • raw = raw << 3;*

  • if (data[7] == 0x10) {*

  • raw = (raw & 0xFFF0) + 12 - data[6];*

  • }}*

  • else {*

  • byte cfg = (data[4] & 0x60);*

  • if (cfg == 0x00) raw = raw << 3; *

  • else if (cfg == 0x20) raw = raw << 2;*

  • else if (cfg == 0x40) raw = raw << 1;*

  • }*

  • lcd.createChar(1,sinal);*

  • celsius = (float)raw / 16.0;*

  • 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);*

  • Serial.print(" temperatura = ");*

  • Serial.print(celsius);*

  • Serial.println();*

  • lcd.clear();*

  • lcd.setCursor(0,0);*

  • lcd.print(celsius);*

  • lcd.write(1);*

  • }*
    gostaria de fazer um
    void printLCD(){
    lcd.setCursor(0,0);
    lcd.print(celsius);
    lcd.write(1);
    lcd.setCursor(0,1);
    lcd.print(hour);
    lcd.print(":");
    lcd.print(minute);
    assim consigo organizar cada coisa... e coloco para rodar no void loop com os outros :
    void loop(void) {
    printDate();
    printTemp();
    }
    em relação a temperatura eu até consigo mudar, mas o relógio se eu tirar do seu void e qualquer outro lugar que eu coloco da que HOUR não está declarado no escopo

sobre o estados eu testei e funcionou perfeito, demais bubulinodo.
o que quer dizer esse [2] e o [10]
?

Ok... aquele código parece correcto para mim.

Quanto ao que pretendes fazer, queres uma função que vá buscar a data e hora para meter no lcd, certo?

Experimenta adicionar isto no inicio:

struct data_hora {
   unsigned char minuto; 
   unsigned char hora;
   unsigned char dia;
   unsigned char mes;
   unsigned int ano;
} agora;

Isto é uma estrutura de dados que cria uma variável com o nome agora.

Depois a tua função printDate, passa a chamar-se updateTime e fica assim:

void updateTime(struct data_hora *dt){
   Wire.beginTransmission(DS1307_ADDRESS);
   Wire.write(zero);
   Wire.endTransmission();
   Wire.requestFrom(DS1307_ADDRESS, 7);
   int dummy = (unsigned char)bcdToDec(Wire.read());
   dt->minuto = bcdToDec(Wire.read());
   dt->hora = (unsigned char)bcdToDec(Wire.read() & 0b111111); 
   dummy = bcdToDec(Wire.read()); 
   dt->dia = (unsigned char)bcdToDec(Wire.read());
   dt->mes = (unsigned char)bcdToDec(Wire.read());
   dt->ano = bcdToDec(Wire.read());
}

Depois tens de fazer update à estrutura agora em todos os ciclos.

void loop() {
updateTime(&agora);
}

E para usares a estrutura agora, fazes assim:

void printLCD(){
  lcd.setCursor(0,0);
  lcd.print(celsius);
  lcd.write(1);    
  lcd.setCursor(0,1);
  lcd.print(agora.hora);
  lcd.print(":");
  lcd.print(agora.minuto);

lmeireles43:
sobre o estados eu testei e funcionou perfeito, demais bubulinodo.
o que quer dizer esse [2] e o [10]
?

Antes de mais, alguma background teórico:

http://www.mtm.ufsc.br/~azeredo/cursoC/aulas/c530.html

o [2] é o numero de strings. Neste caso, tens duas, a LIGADO e DESLIGADO.
o [10] é o tamanho de ambas as matrizes, ou seja, o tamanho da maior string (desligado) mais um lugar vazio para colocar o terminador de string ('\0').

Julgava que me fosses perguntar o que era o ? e o : ...

Em todo o caso, fica aqui:

http://www.vivaolinux.com.br/topico/C-C++/O-operador-ternario-()