Tutorial: Controlando a luminosidade de uma lâmpada incandescente com Dimmer Shield


ATENÇÃO: este projeto utiliza conexão direta à rede elétrica, e não fazer as conexões de forma adequada causa riscos de CHOQUE ELÉTRICO e INCÊNDIO. Só execute este projeto caso você já tenha experiência prévia com instalações elétricas.

Olá garagista no tutorial de hoje mostraremos como utilizar o Dimmer Shield  para controlar a luminosidade de uma lâmpada incandescente pelo monitor serial Arduíno e por tac switchs presentes na placa através do Arduíno UNO Rev.3( Lembrando que a carga máxima é de até 4 A) .

Material utilizados

1x Dimmer Shield

1xArduíno UNO Rev.3

1x Plug de Tomada

1x Lâmpada 

1x Metro de cabo AC

1. Dimmer Shield

Figura 1- Dimmer Shield

Características:

O Dimmer Shield é um shield para Arduíno que pode acionar de forma proporcional cargas como lâmpadas e motores, ou seja, você pode variar a intensidade do brilho de uma lâmpada incandescente, velocidade de um ventilador de mesa e controlar dispositivos que operam diretamente com 110V ou 220V com no máximo 4 A.

 VAC: 110/220VAC 4 A

 LOAD: Lâmpada Incandescente, Motor de ventilador de mesa e etc.

 Pinos Utilizados:

 D2 - Interrupção (Passagem por Zero) 

 D3 - Chaveamento do Triac 

 D4 e D5 - Chaves tácteis para uso geral

2. Dimmer

Dimmers (controles de brilho) e Controles de potência nada mais são do que circuitos que, intercalados com cargas na rede de energia elétrica, permitem controlar a sua potência.

Figura 2 - Esquema de ligação de um Dimmer

Ligados em série com lâmpadas incandescentes, eles permitem controlar seu brilho. Ligados em série com aparelhos que usam motores universais, eles possibilitam o controle da velocidade e em série com elementos de aquecimento a sua temperatura. Infelizmente, esses controles só podem ser usados com cargas resistivas (elementos de aquecimento e lâmpadas) ou formadas por um único enrolamento indutivo (motores universais e transformadores). Nunca devemos usar esses controles com lâmpadas eletrônicas, fluorescentes ou equipamentos eletrônicos em geral, pois eles podem causar a sua queima.O TRIAC é o elemento principal capaz de conduzir a corrente principal da carga. O controle da potência é feito, variando-se o ponto de disparo do triac em cada semiciclo da alimentação de corrente alternada.

Figrura 3 - Passagem pelo ponto zero 

Figura 1- Ângulos de disparo

Com uma constante de tempo baixa  o TRIAC dispara no início do semiciclo e a potência aplicada à carga é maior. Com uma constante de tempo alta , o disparo ocorre no final do semiciclo e apenas uma pequena parte da potência disponível é aplicada à carga.

Entre os dois extremos o controle pode ser ajustado para aplicar à carga qualquer potência entre 0 e aproximadamente 95% da potência máxima. 

3. Sketch

//Desenvolvido por Marco Silva
//Email: Marco.silva@labdegaragem.com
//Lab de Garagem

int AC_LOAD = 3;// Dará o pulso no Triac pin
int dimming = 125;// Dimming level (0-128) 0 = ON, 128 = OFF
unsigned long time;//Contará o tempo
unsigned long timeout;//Estouro
int brilho[3];//Recebe os valores da serial
int i=0;//Quantidade de caracteres recebida pela serial
int flag=0;//Indica que foi recebida informação pela serial
char temp;//Armazena dados recebidos pela serial
int x,y;//Variaveis auxiliares

void setup()
{
  Serial.begin(9600);//Inicia a serial com baud rate
  pinMode(AC_LOAD, OUTPUT);// Disparo do Triac pino 3
  attachInterrupt(0, zero_crosss_int, RISING);// Interrupção detecta a passagem por 0, quando passa de nível baixo para auto
  pinMode(4, INPUT);// Configura o pino 4 como entrada
  pinMode(5, INPUT);// Configura o pino 5 como entrada
  
}

void zero_crosss_int() // Função que detecta a passagem por 0
{
  // Calculo do ângulo de disparo :: 60Hz-> 8.33ms (1/2 Cycle)
  // (8333us - 8.33us) / 128 = 65 (Approx)
  int dimtime = (65*dimming); // 65 equivale a 1 de 128
  delayMicroseconds(dimtime); // Off cycle
  digitalWrite(AC_LOAD, HIGH); // disparando o Triac
  delayMicroseconds(8.33); // Aguarda o tempo de disparo
  digitalWrite(AC_LOAD, LOW); // finaliza o pulso do Triac
}

void loop()
{
  //------------------------------------------------------------------------------------------
  // Retorna o tempo em milisegundos desde que o Arduíno começou a rodar,
  time = millis()%2;//Divide por 2 e salva o resto
  if(time==1||time==0)//Compara se o resto é igual a 0 ou 1 e sempre vai ser
  {
  timeout++;// Cronômetro
    if (timeout>500)// Compara se houve estouro do tempo
    {
    i=0;// Zera o quantidades de caracteres recebidos
    flag=0;// Zera o aviso de que foi recebido algum dado na serial
    }  
   }
 
  //-------------------------------------------------------------------------------------------
  
  //Aumenta a intensidade
  if(digitalRead(4)==1 && dimming >10)// Compara se o botão foi pressionado e se o dimming é maior que 10 seu limite máximo
  {
   dimming= dimming -5;// Aumenta a intensidade de 5 em 5
    y=dimming/1.25;//Converte em %
    y=(y-100)*(-1);//O dimming é inversamente proporcional à porcentagem
    Serial.print(y);
    Serial.println("%");
    Serial.print("Resolucao: ");
    Serial.println(dimming);
    delay(100);// Aguarda um tempo até o próximo acionamento
  }
  //Diminui a intensidade
  if(digitalRead(5)==1&& dimming<125)
  {
    dimming= dimming +5; 
    y=dimming/1.25;
    y=(y-100)*(-1);
    Serial.print(y);
    Serial.println("%");
    Serial.print("Resolucao: ");
    Serial.println(dimming);
    delay(100);
  }
  //--------------------------------------------------------------------------------------------
  if (Serial.available()>0)// Verifica se houve recepção
  {
    flag=1;//Sinaliza que houve recepção
    timeout=0;// Zera o o tempo de reset
    //------------------------------------------------------------------------------------------
    temp = Serial.read();// Armazena o que foi recebido pela serial
    brilho[i]=temp-48;// Decrementa 48 na tabela ascii para converter de decimal para char
    i++;// Contabiliza um recebimento
  }
   //---------------------------------------------------------------------------
if (timeout>200&&flag==1)// Compara se houve estouro do timeout(se ficou um tempo sem recepção) e se houve recepção
{
  flag=0;// Sera aviso de recepção
  
   // Verifica a quantidade de informação recebida
   switch(i)
   {
   case 1:
   x=brilho[0];//Unidade
   break;
   
   case 2:
   x=brilho[0]*10 + brilho[1];//Dezena e unidade
   break;
   
   case 3:
   x=brilho[0]*100 + brilho[1]*10 + brilho[2];//Centena, Dezena, Unidade
   break;
   }  
   // Envia para serial informações em % e resolução de disparo
    Serial.print(x);
    Serial.println("%");
     delay(30);
   
    if(x>100||x<0)// Proteção para se foi inserido um valor mair que 100%
    {
    Serial.println("Excedeu o limite");
    }
    else// Se estiver tudo OK
    {
    x=100-x;// Inversamente proporcional a %
    dimming=x*1.25;// Resolução diminuida de 128 para 125 para garantir um tempo bom de resposta
      if(dimming<8)
      {
      dimming=8;// O dimming será sempre maior que 10 para garantir um tempo bom de resposta
      }
    //Envia para a serial o valor da resolução
    Serial.print("Resolucao: ");
    Serial.println(dimming);
    }

}
}

Referências:

http://www.labdegaragem.org/loja/48-ldg/dimmer-shield.html

http://labdegaragem.com/profiles/blogs/tutorial-dimmer-shield

http://labdegaragem.com/profiles/blogs/tutorial-acionando-lampada-com-mini-relay-shield-e-interruptor-pa

http://www.newtoncbraga.com.br/index.php/como-funciona/619-dimmers-e-controles-de-potencia-art071

Exibições: 31780

Comentar

Você precisa ser um membro de Laboratorio de Garagem (arduino, eletrônica, robotica, hacking) para adicionar comentários!

Entrar em Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)

Comentário de Mario Henrique em 26 novembro 2015 às 2:21
Muito obrigado André salvou meu semestre,caso queira aperfeiçoar e acrescentar os dois botões novamente, jogo a programação deles no início do loop?
Comentário de André Araújo Kuhn Pereira em 25 novembro 2015 às 21:47

Boa noite Bruno Carvalho!

Eu fiz o código baseado em temperatura do lm35 que variava de 0 a 100 graus Celsius, e nesta proporção calculava o disparo do triac, de 0 a 100 %.

Para utilizar em seu projeto, mude a linha do código:

      ...

     temperatura =( 5.0 * leitura_analog * 100.0)/1024.0;

     ...

Substituindo o "100.0" por "200.0", e veja se satisfaz a sua necessidade, ou seja, ficará dessa forma:

    ...

    temperatura =( 5.0 * leitura_analog * 200.0)/1024.0;"

    ...

Att.

André Kuhn.

Comentário de Bruno Carvalho em 24 novembro 2015 às 20:06

Ola André tem como mudar essa programação para o efeito de dimming comece em uma intensidade mais baixa tipo 25º ? fiz o teste aqui em casa e lampada nao chega no seu 100% e ela soh começa a variar sua intensidade com 27 graus,sendo uma temperatura muito elevada

Comentário de André Araújo Kuhn Pereira em 22 novembro 2015 às 1:12

Boa noite Mario Henrique!

 

Segue o código utilizando o lm35 para controlar a luminosidade da lâmpada com o Dimmer Shield.

 

O controle utilizado foi calcular a temperatura em graus Celsius, e deste resultado, controlar a luminosidade na mesma proporção.

 

No comentário do código mostra qual a relação desejada entre temperatura e luminosidade, que pode ser positiva ou negativa, por exemplo,  se a temperatura subir e a luminosidade subir, terá relação positiva, e se a temperatura subir e a luminosidade cair, terá relação negativa. Isso dependerá do projeto.

 

 

//André Kuhn - Automação
//Código para o Dimmer Shield ser controlado pela variação da temperatura

//Pino digital responsável pelo chaveamento do TRIAC, o Dimmer Shield é o pino digital 3.
int load = 3;

//Variável inteira que varia de 0 a 100, representado em porcentagem (%), responsável por definir a

//luminosidade

volatile int power = 40;

void setup()
{ 
     //Configurando a comunicação serial, com baud rate de 9600
     Serial.begin(9600);

     //Declarando o pino digital load (digital 3) como saída
     pinMode(load, OUTPUT); 

     //Inicializa interrupção. O número zero indica a porta 2 do Arduino,
     //zero_cross_int é a função que será chamada toda vez que pino 2 do Arduino,
     //"subir" (RISING) de valor de 0 para 1.
     attachInterrupt(0, zero_cross_int, RISING);
}


void loop()
{
     //Variável que vai armazenar a temperatura do lm35
     int temperatura;

     //Variável responsável por armazenar a leitura da porta analógica
     int leitura_analog;

     //Fazendo a leitura analógica da porta A0
     leitura_analog = analogRead(A0);

 

     //Equação para calcular a temperatura do sensor lm35 em graus Célsius
     temperatura =( 5.0 * leitura_analog * 100.0)/1024.0;

 

     //-----------------------------------------------------------------------------------------
     //Definindo a luminosidade, atribuindo o valor da variável conversao para a variável power,
     //nesta parte, iremos definir se a relação de temperatura com a luminosidade será negativa ou positiva,
     //por exemplo, se a temperatura subir e a luminosidade subir, terá relação positiva, e se a temperatura
     //subir e a luminosidade cair, terá relação negativa. Isso dependerá do projeto.

     //------------------
     power = temperatura; //Relação positiva 
     //------------------

     

     //-----------------
     //power = 100 - temperatura; //Relação negativa
     //-----------------
     //---------------------------------------------------------------------------------------

 

     //Imprimindo na serial monitor
     Serial.println("Leitura, temperatura e power");
     Serial.println(leitura_analog);
     Serial.println(temperatura);
     Serial.println(power);
     //Atraso de 1 segundos
     delay(1000);
}


//Função executada quando o Dimmer Shield detecta a passagem por zero da tensão alternada (senóide)
void zero_cross_int()
{
     //Cálculo do ângulo de disparo: 60Hz -> 8,33ms (1/2 ciclo)
     //(8333us - 8,33us) / 100 = 83 (aproximadamente)

 

     //O powertime é o tempo que o TRIAC permanescerá desligado quando é detectado o ponto

     //0 da senoide e varia de 0 a 8300 microsegundos

     int powertime = (83*(100-power)); 


     //Se o powertime for menor ou igual a 300 microsegundos, dar o comando de ligar a

     //lâmpada (carga) - potência total fornecida
    if(powertime <= 300)
    {
         //Liga o pulso do sinal ao TRIAC para que ele passe a conduzir, coloca o pino digital

         //"load" em nível alto

        digitalWrite(load, HIGH);
    }

 

    //Se o powertime for menor ou igual a 8000 microsegundos, dar o comando de desligar a

    //lâmpada (carga) - potência zero fornecida
    else if(powertime >= 8000)
     {
         //Desliga o pulso do sinal ao TRIAC para que ele não conduza, coloca o pino digital "load"

         //em nível baixo

         digitalWrite(load, LOW);
     }


     //Se o powertime estiver entre 300 microsegundos a 8000 microsegundos
     else if((powertime > 300) && (powertime < 8000))
     {
           //Mantém o circuito desligado por powertime microssegundos (espera powertime

           //microssegundos)

          delayMicroseconds(powertime);

 

           //Envia sinal ao TRIAC para que ele passe a conduzir, coloca o pino digital "load" em

           //nível alto
           digitalWrite(load, HIGH);

 

           //Espera 8,33 microssegundos para que o TRIAC perceba o pulso

          delayMicroseconds(8.33);

 

          //Desliga o pulso do TRIAC, coloca o pino digital "load" em nível baixo
         digitalWrite(load, LOW);
      } 
}

//André Kuhn - Automação
//Código para o Dimmer Shield ser controlado pela variação da temperatura

                                                                 Figura 1 - Vista geral

                                                      Figura 2 - Conexão do lm35 ao arduino

                                               Figura 3 - Testando o experimento e o código

Mario Henrique, espero que este código possa lhe ajudar no seu projeto.

Att.

André Kuhn.

Comentário de Mario Henrique em 21 novembro 2015 às 12:20
Beleza André, aguardo atenciosamente sua resposta, pois irá salvar meu semestre obrigado

Att
Comentário de André Araújo Kuhn Pereira em 19 novembro 2015 às 9:53

Bom dia Mario Henrique! Final de semana a gente conversa melhor, pode ser? No momento estou viajando. Abraço.

Att.

André Kuhn.

Comentário de Mario Henrique em 19 novembro 2015 às 9:39
Então André se não for pedir muito,queria agradecida mente saber se poderia disponibilizar com urgência, sei que você tem outras prioridades mas meu TCC depende disso mas se n der tudo bem,muito obrigado pela atenção
Comentário de André Araújo Kuhn Pereira em 18 novembro 2015 às 20:13

Boa noite Mario Henrique!

Quando terminar o tutorial do controle de luminosidade de uma lâmpada utilizando o Ethernet Shield e o Dimmer Shield, em breve irei desenvolver e disponibilizar o código com o uso do LM35.

Att.

André Kuhn.

Comentário de Mario Henrique em 16 novembro 2015 às 8:34
Como faço pra implementar um lm35
Tem como me disponibilizar a programação de como ficaria? Obg
Comentário de André Araújo Kuhn Pereira em 8 outubro 2015 às 13:15

Bom dia Flávio!

O disparo do Triac utiliza a porta digital 3 sim.

Sobre a alteração da porta do envio de dados da biblioteca IRremote, dei uma pesquisada em alguns fóruns.

Pelo que pesquisei, não é possível alterar a porta digital. No arduino Uno se utiliza a porta digital 3, no Mega e Leonardo, utiliza a porta digital 9.

Segue o link do tutorial:

https://learn.adafruit.com/using-an-infrared-library/sending-ir-codes

Fóruns pesquisado:

http://labdegaragem.com/forum/topics/como-alterar-o-pino-de-envio-n...

http://forum.arduino.cc/index.php?topic=49630.0

http://labdegaragem.com/forum/topics/ligar-e-desligar-tv

http://forum.arduino.cc/index.php?topic=28434.0

http://forum.arduino.cc/index.php/topic,20902.0.html

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço