Problemas com relé

Parabéns! Está bacano.

ontem observei que o relogio também entra em pane mas com muito menos frequencia, vai a 45 horas :stuck_out_tongue: e desliga a luz.... da uma piscada apenas.....
segue todo o código,
#include <OneWire.h>
#include <LiquidCrystal.h>
#include "Wire.h"
#define DS1307_ADDRESS 0x68
#define Luz_Fundo 6

#define ledbranco 10
#define ledazul 9
const char estados[2][10] = {"ON ", "OFF"};

byte zero = 0x00;
byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
float celsius;

byte decToBcd(byte val){
return ( (val/10*16) + (val%10) ); // Converter decimal para código binário
}

byte bcdToDec(byte val) {
return ( (val/16*10) + (val%16) ); // Converter código binário para decimal
}

byte sinal[8] = { //símbolo de graus celsius
0b01000,
0b10100,
0b01000,
0b00011,
0b00100,
0b00100,
0b00011,
0b00000
};

byte temperatura[8] = { //símbolo de graus celsius
0b01110,
0b01010,
0b01110,
0b01110,
0b01110,
0b11111,
0b11111,
0b01110,
};

byte relogio[8] = { //símbolo de graus celsius
0b00000,
0b11111,
0b10101,
0b10101,
0b10101,
0b10011,
0b10001,
0b11111,
};

byte minimo[8] = {
B01110,
B01010,
B01010,
B01010,
B10001,
B10001,
B10001,
B01110
};

byte maximo[8] = {
B01110,
B01110,
B01110,
B01110,
B11111,
B11111,
B11111,
B01110
};

byte rsimb[8] = {
B00000,
B01010,
B00100,
B10101,
B01110,
B10101,
B00100,
B01010
};

byte asimb[8] = {
B01001,
B01001,
B10010,
B11011,
B01001,
B10010,
B10010,
B00000
};

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

float tempMax;
float tempMin;
int seg = 0;

int pbranco = 0;
int Pbranco = 250;
int pazul = 0;
int Pazul = 150;
int statusHeater = 0;
int statusFan = 0;
int aquecedor = A0;
int resfriador = A2;
int temperatura_controle = 27.5;
int vt = 0.5;
int luz_desligamento = 24;
int fp = 6; //fotoperíodo
OneWire ds(A15);

LiquidCrystal lcd(8, 7, 5, 4, 3, 2);

void setup(void) {
Serial.begin(19200);
pinMode(ledbranco, OUTPUT);
pinMode(aquecedor,OUTPUT); //define o pino do aquecedor como saída
pinMode(resfriador,OUTPUT); //define o pino do resfriador como saída
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.
Wire.begin();
tempMax = 0;
tempMin = 100;
digitalWrite(aquecedor, HIGH);
digitalWrite(resfriador, HIGH);
//pinMode(fadePin, OUTPUT); //retirarrrrrrrrrrrrrr
//pinMode(fadePinn, OUTPUT); //retirarrrrrrrrrrr
}

void loop(void) {
if ( !ds.search(addr)) {
while (!ds.search(addr)) { //enquanto não encontrar o sensor.
ds.reset_search();
delay(250);
digitalWrite(aquecedor, HIGH);
digitalWrite(resfriador, HIGH);
lcd.clear();
lcd.setCursor(1,0);
lcd.print("ERRO NO SENSOR");
}}
if (OneWire::crc8(addr, 7) != addr[7]) {
Serial.println("CRC não é válido!");
return;
}
else {
printTemp();
updateTime(&agora);
printLCD();
statusHeater = digitalRead(aquecedor);
statusFan = digitalRead(resfriador);
pbranco = (Pbranco * 100 / 250);
pazul = (Pazul * 100 / 250);

}}

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

  • lcd.createChar(2,temperatura);*

  • lcd.createChar(3,relogio);*

  • lcd.createChar(4,maximo);*

  • lcd.createChar(5,minimo);*

  • lcd.createChar(6,asimb);*

  • lcd.createChar(7,rsimb);*

  • celsius = (float)raw / 16.0;*

  • if (celsius <= 27.0)digitalWrite(aquecedor, LOW);*

  • if (celsius >= 27.5)digitalWrite(aquecedor, HIGH);*

  • if (celsius >= 28.0)digitalWrite(resfriador, LOW);*

  • if (celsius <= 27.5)digitalWrite(resfriador, HIGH);*

  • if (celsius > tempMax) tempMax = celsius;*

  • if (celsius < tempMin) tempMin = celsius;*

  • }*

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

  • if (agora.hora >= luz_desligamento - fp + 1 && agora.hora < luz_desligamento - 1) analogWrite(ledbranco, Pbranco);*

  • if (agora.hora >= 0 && agora.hora < luz_desligamento - fp) analogWrite(ledbranco, 0);*

  • if (agora.hora >= luz_desligamento - fp && agora.hora < luz_desligamento) analogWrite(ledazul, Pazul);*

  • if (agora.hora >= 0 && agora.hora < luz_desligamento - fp) analogWrite(ledazul, 0);*
    }
    void printLCD(){

  • if (seg >= 0 && seg <=20) {*

  • lcd.clear();*

  • lcd.setCursor(0,0);*

  • lcd.write(2);*

  • lcd.print(celsius);*

  • lcd.write(1);*

  • lcd.setCursor(0,1);*

  • lcd.write(3);*

  • if (agora.hora <10) lcd.print("0");*

  • lcd.print(agora.hora);*

  • lcd.print(":");*

  • if (agora.minuto <10) lcd.print("0");*

  • lcd.print(agora.minuto);*

  • lcd.setCursor(12,0);*

  • lcd.write(6);*

  • lcd.print(estados[statusHeater]);*

  • lcd.setCursor(12,1);*

  • lcd.write(7);*

  • lcd.print(estados[statusFan]);*

  • seg++;*

  • }*

  • if (seg >=21 && seg <=26){*

  • lcd.clear();*

  • lcd.setCursor(0,0);*

  • lcd.write(4);*

  • lcd.print(tempMax);*

  • lcd.write(1);*

  • lcd.setCursor(0,1);*

  • lcd.write(5);*

  • lcd.print(tempMin);*

  • lcd.write(1);*

  • lcd.setCursor(11,1);*

  • lcd.print("B ");*

  • lcd.print(pbranco);*

  • lcd.setCursor(11,0);*

  • lcd.print("A ");*

  • lcd.print(pazul);*

  • seg++; *

  • }*

  • if (seg >= 27){*

  • seg =0;*

  • }*
    }

Boas.

Não prestei muita atenção ao código, mas assim de repente podes melhorar isto:

 const char estados[2][10] = {"ON ", "OFF"};

//por isto...

const char estados[2][4] = {"ON ", "OFF"}; //pormenores, eu sei... mas são 12 bytes que poupas :P

bubulindo vlw a dica ja modifiquei...
resolvi o problema de imprimir temperaturas loucas assim:
if ((float)raw / 16.0 <= 100) {
if (celsius2/celsius >=0.9 && celsius2/celsius <=1.1)
{
celsius = (float)raw / 16.0;
delay (1000);
}}
celsius2 = (float)raw / 16.0;
desta forma ele só atualiza o celsius se a temperatura for menor que 100 e tambem faz uma leitura e depois de um segundo faz outra, se a diferença for entre 0.9 e 1.1(isso da uma margem de quase 2 graus) ele grava o novo valor de temperatura..
agora acho que arrumei a parte de checar o sensor e se não achar travar tudo colocando um delay de dois segundos e repetindo a parte de checar, ou seja, ele checa espera dois segundo e checa denovo:

if ( !ds.search(addr)) {
delay (2000);
if ( !ds.search(addr)) {
while (!ds.search(addr)) { //enquanto não encontrar o sensor.
ds.reset_search();
delay(250);
digitalWrite(aquecedor, HIGH);
digitalWrite(resfriador, HIGH);
lcd.clear();
lcd.setCursor(1,0);
lcd.print("ERRO NO SENSOR");
}}}

agora preciso arrumar o relógio, e alguem tem alguma dica do que fiz ou esta bom?

deu uma olhada no script hugo?

Eu não olhei para o script, mas fiquei a pensar porque é que fazes a procura do sensor no loop.

Não devias fazer isso no setup para verificar que o sensor está lá e depois tentar ler dele? Certamente que a funcão de leitura dá um erro se o sensor não estiver lá, certo?

no loop para ele sempre estar verificando se o sensor esta conectado porque em caso de um contato ruim a temperatura vai zerar, e assim o aquecedor vai ligar porque entende que a temperatura esta abaixo.... entao a cada loop ele verifica se o sensor esta marcando a temperatura, caso contratio desliga tudo e me alerta.

sobre o driver eu desisti dos meus. certamente produzem muito ruido magnético e deixa tudo pirado sem funcionar.... vou esperar um driver novo e vou tentar outros também.....

lmeireles43:
no loop para ele sempre estar verificando se o sensor esta conectado porque em caso de um contato ruim a temperatura vai zerar, e assim o aquecedor vai ligar porque entende que a temperatura esta abaixo.... entao a cada loop ele verifica se o sensor esta marcando a temperatura, caso contratio desliga tudo e me alerta.

Isto parece-me estranho... tens a certeza que a funcão de leitura não retorna um erro se tirares a ligacão do sensor? Só dá zero? Se bem me lembro no interface one wire, havia um handshake que dava para entender se o sensor estava ligado ou não.
Podes tirar os if antes do while já que estás a chamar a mesma funcão e assim o programa também trava ali.

Olá também estou montando um controle para aquário e estou tendo o mesmo problema, depois de algumas horas ligado está imprimindo lixo no LCD, porém o meu relay shield tem sim optoacopladores mas mesmo assim depois de um tempo aparece lixo no LCD. Eu li todos os comentários desse tópico mas parece que não foi identificado uma solução, queria compartilhar que tenho o mesmo problema e estou em busca de ma solução

Ja agora que tipo de carga tens no teu relé.Tambem é uma iluminaria?
Gostava de descobrir o misterio, e se possivel ate montar um circuito parecido em breadboard para ver a acontecer e localizar o problema com um osciloscopio.
Podes mostrar o teu esquema ou detalhar melhor para poder eventualmente ver o que existe em comum?

Segue abaixo as especificação dos componentes utilizados, tudo ainda está montado em uma protoboard, as vezes ele funciona por mais de 12h sem aparecer lixo no visor, porém mesmo que aparece lixo os demais itens continuam funcionando normalmente como o acionamento da luz, das bolhinhas e da ração, segue também umas fotos, não reparem a bagunça pois ainda é um protótipo.

  • Arduino duemilanove 32k;
  • Relay shield com 4 portas com optoacopladores:
    Porta 1 do relé: lampada de 110v/20w T5 acionada por um reator normal de lampada fluorecente;
    Porta 2 do relé: aquecedor de 110v/40w;
    Porta 3 do relé: compressor de ar 110v/3w;
  • Sensor de temperatura DS18B20;
  • Ultrasom HC-SR04 para detectar movimento na frente do aquario;
  • Servo motor para liberação de ração;
  • Sensor de proximidade IR TCRT5000L para verificar se ainda tem ração;
  • LCD 16x2 mais PCF8574P para i2c;
  • 2 tact button para acertar horas
  • Fonte 12v/2A;
  • LM7805 para alimentar o demais componentes e não sobrecarrecar o arduino;

boas,
Eu resolvi o problema de ruido magnético substituindo o driver eletronico de leds por uma fonte de notebook com resistores para limitar a corrente. Possivelmente o driver das t5 também estão causando ruído.
Depois que modifiquei consigo utilizar até mesmo o arduino com a fonte ac, o que antes era impossível....
Ja esta a uns dias rodando perfeitamente, apenas hoje acordei e o LCD estava sem nada impresso, porém todas as funões do arduino funcionando... ele controlava a temperatura normalmente, lampadas desligadas por causa do horário....
Reiniciei o sistema e tudo ok... algém sabe como resolver essa pane no lcd de não imprimir nada? vou observar hoje...

Olá!

Tem alguma função deste tipo no seu código?

void(* resetFunc) (void) = 0; //declare reset function @ address 0

Tentei usar está função como cão de guarda no meu programa e acontecia a mesma coisa que relatou.

Abraço.

funcionou para vc? onde colocar isto?

No meu não tem.

coloquei mas não adiantou....
toda a madrugada o problema acontece.... durante todo o dia até denoite ele funciona corretamente, e durante a madrugada da algum problema.... mas o sistema continua funcionando perfeitamente, apenas o lcd entra em colapso e não retorna....

lmeireles43:
coloquei mas não adiantou....
toda a madrugada o problema acontece.... durante todo o dia até denoite ele funciona corretamente, e durante a madrugada da algum problema.... mas o sistema continua funcionando perfeitamente, apenas o lcd entra em colapso e não retorna....

Boa Noite,

O problema com o LCD ainda continua? Eu estou tendo o mesmo problema das sujeiras no LCD. Eu li todo o tópico fiz tudo o que vc´s disseram e ainda estou com o problema, sniff, :´(

Olá amigos, já passei bastante por este tipo de problema é a solução foi utilizar o conceito de projeto mostrado no vídeo: Proteção, Robustez e Profissional com Arduino - Crescer Engenharia - A Casa da Automação - YouTube