Problemas com relé

HugoPT:
Queres controlar uma lampada de 230V.Tens fase e neutro que têm de ser controlados por um triac.
Como tens de ligar um dos lados a mesma referencia do arduino qual ligas?

MOC305X :slight_smile: LOL

gente fiz igual a pagina que mostrei para vcs e no lugar da luz coloquei minha luminária led, na verdade apenas o circuito de lez azuis, 36v 0,6A
fiz um programa para fade de 0 a 100 e ficou perfeito....
primeiro testei com um cooler de 12V

Ok... agora só tens de isolar o Arduino e estás lançado para ficares com um sistema mais porreiro ainda. :slight_smile:

para quem quiser, basta usar um photo isolator antes do FET, ou do TIP-120, é um 4n25 - 35. Hoje vou comprar e testar....
Sobre a biblioteca simbolos.h eu criei, inclui ela e mandei rodar, mas ele não acha, fala que não esta incluido no sketch os chars.... tenho que colocar mais alguma coisa

Sim no programa principal tens de fazer o include desse .h e depois usar antes do nome da variável a keyword extern. Desta forma o compilador vai procurar essa variável fora do programa principal

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?