Problemas com relé

Tens de guardar o simbolos.h dentro duma pasta dentro da libraries.

Tens uma forma rapida para usar mais ficheiros no projecto usando a IDE do arduino.Se reparares abaixo de onde abres a porta Serie na IDE tens uma seta para baixo, tocas ai e escolhes new tab.De seguida pede-te o nome do ficheiro, colocas o que quiseres com a extensao desejada .h ou .c
Assim desta forma consegues ver todos os ficheiros envolvidos no sketch e ir alterando-os conforme precisas.
Quando fazes guardar ele vai colocar esses ficheiros na mesma pasta do projecto.
Quando abrires novamente o projecto ele tambem irá abrir os ficheiros adicionais.
No final quando tiveres tudo como desejas podes entao colocar isso tudo ( o ficheiro de cabeçalho .h e o ficheiro de implementaçao .c) numa liblioteca para reutilizares de futuro, bastando depois incluir essa biblioteca no projecto.
Anexei uma foto para veres as abas em cima com dois ficheiros de exemplo

vlw Hugo vou verificar amanha...
bubulindo, ja havia colocado, e inclui o mesmo...

Hoje tenho novidades, comprei o FET e o photoprotector e liguei o arduino na bateria, isolando-o completamente.
Resultado, o lcd funciona mas a cada 10 segundos +- não é regra... o sensor de temperatura sobre interferencia e da problema, mas vai e volta rápido....
Ligando o arduino num adaptador AC o sensor de temperatura nem funciona.....
Será que posso fazer algo ou vou ter que trabalhar com a programação?

Ficou muito legal, com o tip120 eu não conseguia fazer os leds piscarem rapidamente, e os leds tambem não desligavam por completo.... com o FET o led pisca igual discoteca EHEHEHHEHEHE..... Estou rodando o aquario no momento com 60% da potencia dos azuis e 100% os brancos
sendo que o azul liga e depois de uma hora o branco liga, depois o branco desliga primeiro e depois de uma hora o azul desliga....

Tava pensando na programação do arduino para o sensor poderia colocar que se ele não for achado em tipo 2 segundos ai sim ele entrar em modo de segurança, desarmando os reles e enviando a mensagem de erro, caso contrario ele apenas deixa de registrar a temperatura maluca e continua tudo em funcionamento, o que acham?
olhem aqui meu problema

deveria colocar algum resistor no sinal do arduino?

Gostei, o simbolo da temperatura fica muito fixe.Tens o sensor da dallas a ser alimentado pelos 5 V gerados na placa do arduino correcto?
Tens a resistencia de pull-up no sensor?
Podera nao ter nada a ver mas tenta baixar a resoluçao do sensor para 9 bits, desta forma ele é mais rapido a calcular a temperatura e 9 bits de resoluçao é suficiente.
Outra questao a lib do one-wire tem um metodo de calculo CRC8 para comprovar os dados recebidos, tens isso implementado no teu codigo essa verificaçao de CRC?
Tentei ir confirmar isso em posts anteriores mas nao vi la nada ou me espacou.
De qualquer forma coloca ai o codigo actual para estar mos sintonizados quando as alterações que ja fizeste.

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.