Antes de contar detalhes, vejam o resultado do projeto do dimmer futurístico neste pequeno vídeo do Youtube:
Com o grande apoio do Paulo Carlos dos Santos, da empresa BR-o-BOT, desenvolvemos um dimmer digital que pode ser facilmente acoplado no Arduino ou qualquer outra placa controladora. O resultado é que você consegue controlar a intensidade de brilho de uma lâmpada incandescente. Dependendo dos circutos que você colocar neste esquema, você pode controlar um ventilador, chuveiro, ou fazer um ferro de solda com controle de potência!
Os desafios propostos neste desenvolvimento foram bem interessantes e pessoalmente foram verdadeiras aulas práticas de eletrônica e microcontroladores.
A primeira tentativa que fizemos utilizamos um isolador ótico simples e tentamos usar a PWM para controlar a potência, mas o resultado com a lâmpada não deu certo: ela ficava piscando. Então Paulo pesquisou e me passou uma solução mais trabalhosa mas que funcionaria.
Neste novo esquema elétrico usamos dois isoladores óticos: 4N35 um MOC3021. O primeiro é utilizado para detectar a passagem da corrente alternada por zero e interromper o ATMega cada vez que isso acontecere, no caso do Brasil com 60hz, 120 vezes por segunda a corrente passa por 0. Neste momento é onde temporizamos a abertura do TRIAC e simulamos o controle de potência. Veja o esquema elétrico:

Segue o código-fonte para Arduino. Você pode mudar a intensidade alterando o valor da variável dim entre 1 e 120, sendo que 1 é o mais forte e 120 praticamente desligada. Este programa permite alteração desta variável por I2C ou por Serial:
/* #includeint AC_pin = 3; volatile long dim = 60; void setup(){ pinMode(AC_pin, OUTPUT); Serial.begin(9600); attachInterrupt(0, light, CHANGE); Wire.begin(66); Wire.onReceive(receiveEvent); } void receiveEvent(int howMany){ char comando[16]; int counter=0; while(1 < Wire.available()) { char c = Wire.receive(); comando[counter++]=c; Serial.print(c); } int x = Wire.receive(); Serial.println(x); Serial.println("Evento"); Serial.println(howMany); //value, fromLow, fromHigh, toLow, toHigh) dim = map(comando[1], 48,57,10,120); } void light(){ if(dim<125) { long dimtime = (60*dim); // eval the proper pause to fire the triac delayMicroseconds(dimtime); // delay the dim time digitalWrite(AC_pin, HIGH); // fire the Triac delayMicroseconds(1); // pause briefly to ensure the triac turned on digitalWrite(AC_pin, LOW); // turn off the Triac gate (triac will not turn off until next zero cross) } else { digitalWrite(AC_pin, LOW); // turn off the Triac gate (triac will not turn off until next zero cross) } } void loop(){ if (Serial.available() > 0) { byte inByte = Serial.read(); dim = inByte; } }
E na etapa seguinte integramos este circuito com o ping da Parallax para ter o controle de intensidade "on the air". Bem, isso deixamos para um próximo post, por enquanto vai se divertindo com este circuito!
Ah, em tempo, a lista de materiais para você comprar e montar:
- 4 resistores de 47K (R1 a R4)
- 1 resistor de 10k (R5) (se não tiver 1k e 10k não é eletrônica!)
- 2 resistores 330 (R6 e R7)
- TRIAC BTA16
- 1 isolador 4N35
- 1 isolador MOC3021
Preço da lista: menos que R$ 10.
Vinicius Senger
http://twitter.com/vsenger
http://twitter.com/eletronlivre
http://loja.eletronlivre.com.br
http://www.globalcode.com.br/instrutores/ViniciusSenger
Parece Interessante!
ResponderExcluirSe puder postar o código novamente, pois da forma como está não dá pra entender.
Eu vi o Dimmer no TDC2010, da GlobalCode bem legal, procurava isso a tempo. :)
ResponderExcluirUma pergunta posso trocar o 4N35 pelo 4N25 ?
muito bacana... estou procurando ideias para "brincar" em casa. Essa pode ser uma aproveitada. Parabens pelo post.
ResponderExcluirOla garoto!
ResponderExcluirMeu nome e Itamar, fiz um curso com vc na UNB.
Tentei rodar esse programa que vc postou, porem nao rodou no meu arduino, quando mando compilar ele da erro.
Se nao for pedir demais, gostaria de receber esse exemplo no meu email.
Agradeço a sua atençao.
i34@r7.com
ou
itamarsoundboys@gmail.com
Este comentário foi removido pelo autor.
ResponderExcluirOla pessoal, fiz as modificacoes necessárias para o código do Dimmer funcionar corretamente, inclui uma biblioteca, inseri alguns parâmetros de comentário e formatei o código para facilitar o entendimento, espero ter ajudado! Mais projetos sobre Arduino em meu blog http://www.AlexandreMainardi.com
ResponderExcluirUm abraco a todos da GlobalCode
#include Wire.h
int AC_pin = 3;
volatile long dim = 60;
void setup(){
pinMode(AC_pin, OUTPUT);
Serial.begin(9600);
attachInterrupt(0, light, RISING);
Wire.begin(66);
Wire.onReceive(receiveEvent);
}
void receiveEvent(int howMany){
char comando[16]; int counter=0;
while(1 < Wire.available()){
char c = Wire.receive();
comando[counter++]=c;
Serial.print(c);
}
int x = Wire.receive();
Serial.println(x);
Serial.println("Evento");
Serial.println(howMany);
dim = map(comando[1], 48,57,10,120);
}
void light(){
if(dim<125){
long dimtime = (60*dim); // eval the proper pause to fire the triac
delayMicroseconds(dimtime); // delay the dim time
digitalWrite(AC_pin, HIGH); // fire the Triac
delayMicroseconds(1); // pause briefly to ensure the triac turned on
digitalWrite(AC_pin, LOW); // turn off the Triac gate (triac will not turn off until next zero cross)
}
else{
digitalWrite(AC_pin, LOW); // turn off the Triac gate (triac will not turn off until next zero cross)
}
}
void loop(){
if (Serial.available() > 0) {
byte inByte = Serial.read();
dim = inByte;
}
}
Ola Alexandre!
ResponderExcluirDesculpe a minha ignorancia, mas onde eu encontro
essa biblioteca wire.h?
Ola Itamar, esse biblioteca ja vem no compilador do Arduino, no menu superior acesse Sketch>Import Library>Wire e pronto =D
ResponderExcluirOla Alexandre!
ResponderExcluirOlhei aqui e encontrei essa biblioteca. Beleza, mas quando compilo da um erro na linha Wire.begin(66);
o erro e o seguinte:
sketch_dec23a.cpp:1:10: error: #include expects "FILENAME" or
sketch_dec23a.cpp: In function 'void setup()':
sketch_dec23a:9: error: 'Wire' was not declared in this scope
sketch_dec23a.cpp: In function 'void receiveEvent(int)':
sketch_dec23a:15: error: 'Wire' was not declared in this scope
sketch_dec23a:20: error: 'Wire' was not declared in this scope
pensei que fosse meu compilador, mas baixei outro e deu o mesmo erro.
O que sera?
boa tarde Itamar Conseguiu resolver este problema com o dimmer
ExcluirWire.begin(66);
o erro e o seguinte:
sketch_dec23a.cpp:1:10: error: #include expects "FILENAME" or
sketch_dec23a.cpp: In function 'void setup()':
sketch_dec23a:9: error: 'Wire' was not declared in this scope
sketch_dec23a.cpp: In function 'void receiveEvent(int)':
sketch_dec23a:15: error: 'Wire' was not declared in this scope
sketch_dec23a:20: error: 'Wire' was not declared in this scope
pois estou com o mesmo problema.
Quero montar este circuito, mas não entendi a notação X1-1, X1-2 ... X5-2, o que eu devo ligar nestes pontos ?
ResponderExcluirTV Digital com 500 canais sem mensalidade www.tvdigitalnopc.com.br
ResponderExcluirOlá alexandre,quantos destes(interrupts) posso usar no arduino ao mesmo tempo?
ResponderExcluirpra color 2 por exemplo,só preciso repetir a parte do circuito "lamp-2"certo?parabéns,muito bacana este projeto!
Esse projeto funciona pra redes tanto de 220v quanto 110v?
ResponderExcluirOlá amigos . Queria uma ajuda ..
ResponderExcluirExite algum código que possa controlar a intensidade da lampada ( 0 a 255 ) usando a porta PWM , com códigos html ou php integrado com Arduíno.
Nao quero usar sensor, queria uma botão no codigo Html ou com php ..tipo slider para aumentar e diminuir o brilho da lampada , mais nao sei como fazer :(
Este comentário foi removido pelo autor.
ResponderExcluirProjeto muito interessante, parabéns!
ResponderExcluirTenho apenas uma dúvida, posso remover os resistores R1,R2,R3,R4 e deixar apenas um Resistor de 47K 3W no local onde antes tinha o R2?
Este comentário foi removido pelo autor.
ResponderExcluirAtualizando o código
ResponderExcluirAo incluir a biblioteca Wire: #include Wire.h
Colocar o nome da biblioteca entre tags <>
Dependendo da versão do compilador
trocar:
Wire.receive()
por
Wire.read()
À propósito, alguém conseguiu montar o projeto?
Ola Alexandre!
ResponderExcluirOlhei aqui e encontrei essa biblioteca. Beleza, mas quando compilo da um erro na linha Wire.begin(66);
o erro e o seguinte:
sketch_dec23a.cpp:1:10: error: #include expects "FILENAME" or
sketch_dec23a.cpp: In function 'void setup()':
sketch_dec23a:9: error: 'Wire' was not declared in this scope
sketch_dec23a.cpp: In function 'void receiveEvent(int)':
sketch_dec23a:15: error: 'Wire' was not declared in this scope
sketch_dec23a:20: error: 'Wire' was not declared in this scope
Boa noite, possuo uma controladora que ao invés de 5v possui 2 saídas de 0 a 3,3v pwm, gostaria que se possível uma sugestão das alterações necessárias para que funcione adequadamente. Obrigado
ResponderExcluirMinha lampada está tendo picos de luminosidade quando está prestes a desligar (fica piscando), o que pode ser?
ResponderExcluirOlá, gostaria de saber se o circuito funciona para lâmpadas LEDs dimerizáveis. Obrigada
ResponderExcluirOlá uma dúvida que me surgiu.
ResponderExcluirNo caso como eu colocaria esse dimmer diretamente em substituição ao interruptor de um cômodo por exemplo?
Visto que em um interruptor padrão só temos dois fios.
Obrigado...
Olá, gostaria de saber como faço para incluir o sensor ultrassônico nessa programação, no outro post ele não faz com o ultrassônico .
ResponderExcluirolá, podemos ensinar vc a implementar através de um personal class, havendo interesse basta responder aqui!
Excluirclaro, gostaria
ExcluirAutomação é o futuro que todos nós esperamos!
ResponderExcluirQuero minha casa igual do homem de ferro com um assistente igual ao Jarvis
Quem sabe um dia né?
Gostei do seu conteúdo. Bem completo e explicativo!