Problemas com relé

com groundscomuns o problema não se repetirá?

Talvez, por isso é que recomendo com o foto-acoplador, assim mata qualquer hipotese pois nao ha necessidade do ground comum, podendo o sistema ser completamente isolado.

HugoPT:

com groundscomuns o problema não se repetirá?

Talvez, por isso é que recomendo com o foto-acoplador, assim mata qualquer hipotese pois nao ha necessidade do ground comum, podendo o sistema ser completamente isolado.

Com duas fontes separadas... O shield tem díodos a proteger a bobine?

Aquilo do MOC afinal é MOC3051. LOL
Eu cheguei a usar isto para comutar correntes jeitosas (aquecimento) com um triac e funcionou catita.
http://www.fairchildsemi.com/ds/MO/MOC3052M.pdf
No entanto, o problema seria pior com isto, creio.

Em todo o caso, e olhando bem para o que pretendes no futuro, talvez um filtro seja o que pretendes mesmo que queiras fazer isto com uma fonte e seres tu a comutar as luzes.

Ias precisar duma fonte DC, o tal shield para comutar e podias alimentar o arduino dessa mesma fonte DC... normalmente diria que as fontes DC são já filtradas e talvez eliminasse o problema que vês. Claro que ia dar um pouco mais de trabalho, em termos de ligações e código...

Talvez uma fonte de computador servisse?

pessoal não achei o filtro por aqui, terei que esperar chegar....
testei o pwm dos drivers dos leds que tenho aqui
muito show controlei a intensidade da luz bem como quero....
agora me vem a pergunta, utililei um tip120, existe a possibilidade de isolar os grouns? se conseguir eu alimento o arduino com uma bateria
segui esta ligacao
http://bildr.org/2011/03/high-power-control-with-arduino-and-tip120/

só que ai os grounds se juntam....

Controlaste que LEDs?

A luminária? Ou os leds de teste?

Esse esquema tem apenas o problema da ligação da base do transistor directamente no Arduino. O tipo de transistor (um Darlington) apesar de ser bom para correntes altas, certamente que vai dissipar algum calor, não? Tens ideia da corrente que passa por ele?

Outra hipótese seria algo assim...

Ou... se já encomendaste um shield com FET (motor shield?) isso provavelmente estará feito lá. :slight_smile:

Como estás a alimentar tudo?

O shield é algo assim?
http://www.ebay.co.uk/itm/B001-Arduino-high-power-MOSFET-shield-motor-lighting-PWM-DC-control-/221186925850?pt=UK_Computing_Other_Computing_Networking&hash=item337fc4a51a

Este parece muito porreiro. :slight_smile:

agora me vem a pergunta, utililei um tip120, existe a possibilidade de isolar os grouns? se conseguir eu alimento o arduino com uma bateria

Com essa configuraçao nao.
Penso que ja te disse isto ha uns posts atraz, nunca mas nunca mistures a parte de controlo com a de potencia!
Apesar de o circuito trabalhar ao minimo erro puff vai tudo ao ar.
Nesse circuito do link eles usam 60V na entrada a serem comutados pelo tip120.Ora os transistores entram em curto se por exemplo excederes a corrente maxima de colector( que pode acontecer se trocares a carga).Se isso acontecer puff.Em tempos de escola queimei uma porta paralela de um portatil numa brincadeira destas.Fiz um programa para controlar motores via porta paralela com transistores tudo bonitinho, quando os motores estavam sem carga acoplada tudo ok, quando lhes pedi trabalho os transistores excederam a corrente maxima e entraram em curto injectando 60V pela paralela dentro.
Conclusao nunca mais foi porta :disappointed_relieved: e passei a ter mais cuidado e calcular tudo para o maximo admissivel
Aprendi com o pior cenario.

Outra situaçao frequente que pode acontecer é:
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?
Pode parecer estupido mas antigamente nas TV's este problema existia!
No tempo que reparei televisoes quando chegava um "dinosauro" à oficina muitas delas o chassi estava sobre tensao da rede !
Actualmente isso nao acontece porque é feito um isolamento na fonte comutada atraves do secundario do transformador de chaveamento felismente.
O correcto é usares reles, isolamentos opticos, contactores se for uma carga muito grande.

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?