quinta-feira, 4 de novembro de 2010

Dimmer futurístico & automação residencial open source

Nossos projetos de eletrônica e open source hardware baseados em Arduino / Atmega não param!

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:

/*

#include 
int 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

24 comentários:

  1. Parece Interessante!

    Se puder postar o código novamente, pois da forma como está não dá pra entender.

    ResponderExcluir
  2. Eu vi o Dimmer no TDC2010, da GlobalCode bem legal, procurava isso a tempo. :)
    Uma pergunta posso trocar o 4N35 pelo 4N25 ?

    ResponderExcluir
  3. muito bacana... estou procurando ideias para "brincar" em casa. Essa pode ser uma aproveitada. Parabens pelo post.

    ResponderExcluir
  4. Ola garoto!
    Meu 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

    ResponderExcluir
  5. Este comentário foi removido pelo autor.

    ResponderExcluir
  6. Ola 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
    Um 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;
    }
    }

    ResponderExcluir
  7. Ola Alexandre!
    Desculpe a minha ignorancia, mas onde eu encontro
    essa biblioteca wire.h?

    ResponderExcluir
  8. Ola Itamar, esse biblioteca ja vem no compilador do Arduino, no menu superior acesse Sketch>Import Library>Wire e pronto =D

    ResponderExcluir
  9. Ola Alexandre!
    Olhei 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?

    ResponderExcluir
    Respostas
    1. boa tarde Itamar Conseguiu resolver este problema com o dimmer
      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

      pois estou com o mesmo problema.

      Excluir
  10. Quero montar este circuito, mas não entendi a notação X1-1, X1-2 ... X5-2, o que eu devo ligar nestes pontos ?

    ResponderExcluir
  11. TV Digital com 500 canais sem mensalidade www.tvdigitalnopc.com.br

    ResponderExcluir
  12. Olá alexandre,quantos destes(interrupts) posso usar no arduino ao mesmo tempo?
    pra color 2 por exemplo,só preciso repetir a parte do circuito "lamp-2"certo?parabéns,muito bacana este projeto!

    ResponderExcluir
  13. Esse projeto funciona pra redes tanto de 220v quanto 110v?

    ResponderExcluir
  14. Olá amigos . Queria uma ajuda ..
    Exite 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 :(

    ResponderExcluir
  15. Este comentário foi removido pelo autor.

    ResponderExcluir
  16. Projeto muito interessante, parabéns!
    Tenho 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?

    ResponderExcluir
  17. Este comentário foi removido pelo autor.

    ResponderExcluir
  18. Atualizando o código

    Ao 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?

    ResponderExcluir
  19. Ola Alexandre!
    Olhei 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

    ResponderExcluir
  20. 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

    ResponderExcluir
  21. Minha lampada está tendo picos de luminosidade quando está prestes a desligar (fica piscando), o que pode ser?

    ResponderExcluir
  22. Olá, gostaria de saber se o circuito funciona para lâmpadas LEDs dimerizáveis. Obrigada

    ResponderExcluir
  23. Olá uma dúvida que me surgiu.
    No 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...

    ResponderExcluir