Vous êtes sur la page 1sur 12

INSTITUTO FEDERAL DE EDUCAO, CINCIA E TECNOLOGIA DE GOIS

DIMMER CONTROLE DE FLUXO DE POTNCIA

Carlos Alexandre
Donata Assis
Jssica Oliveira

Jata GO
2016

1. INTRODUO

Dimmer um dispositivo utilizado para variar a intensidade de corrente eltrica


mdia em uma carga. controlado a partir do Arduino, que utiliza detector de passagem
por zero e o disparo de um TRIAC, sendo possvel o controle da intensidade da luz
produzida pela lmpada. Um dimmer tem como objetivo fazer com que aumente ou
diminua a intensidade luminosa atravs de um potencimetro, boto, comandos pelo
Arduino, etc., que auxilia nessa operao.
Os Dimmers so amplamente utilizados na indstria eletroeletrnica, onde sua
funo controlar a intensidade de corrente e consequentemente a potncia da carga que
est sob o seu controle. O componente eletrnico principal de um Dimmer, ou seja, o
responsvel por este controle o TRIAC que atravs da corrente aplicada no seu GATE,
permite-o controlar a corrente de sada para a CARGA.
A grande vantagem dos TRIACs sob os SCRs que eles podem trabalhar em
circuito VAC e VCC. Os Dimmers podem controlar cargas com correntes que vo de mili
amperes (mA) at 500 Ampres, conforme o TRIAC ou MODULO TIRISTORIZADO
aplicado no projeto. Assim poderemos controlar Fornos Eltricos, Autoclaves, Estufas,
Chocadeiras, Furadeiras, Marteletes, Serras, Motores de Corrente Continua ou Alternada,
Velocidade de Carros Eltricos, Ventiladores, Eletrodomsticos, Lmpadas (exceto
fluorescentes), Bombas Hidrulicas quaisquer, e milhares de outros equipamentos,
respeitando-se e analisando-se previamente se a carga (equipamento ou ferramenta) se
adapta a controle de corrente

2. Diagrama Eltrico
O diagrama eltrico do projeto segue em anexo.
O circuito pode ser dividido em 3 partes, as quais so:

Controle Composto pela plataforma Arduino, LCD, botes e potencimetro


responsveis por selecionar o modo de controle do DIMMER, se ser por botes
ou por potencimetro.

Figura 1: Circuito de controle

Fonte: Do Autor

Circuito de potncia Onde se encontra a carga (nesse diagrama demonstrada


pela lmpada), o TRIAC (BT137E 600R). Fato interessante e que deve ser
observado em todos os projetos sempre que possvel isolar o circuito de potncia
do circuito de controle, nesse diagrama os opto acopladores PC817 esto
desempenhando esse papel. O TRIAC recebe o pulso de disparo pelo opto
acoplador que por sua vez recebe o sinal advindo do PIN10 da plataforma
Arduino.
Figura 2: Circuito de Potncia
+12V

L1

1k
10

100R

3
K
PC817

VSINE
TRIAC

DGND

Fonte: Do Autor

Por fim, o circuito deteco de passagem por zero. Este circuito responsvel por
indicar ao controlador toda passagem pelo zero. por meio dele que cria se a base
de tempo para disparar no momento exato o TRIAC para obter a mxima, mdia,
mnima potencia, ou qualquer seja a potncia que se deseja pra carga no momento

Figura 3:Circuito deteco passagem por zero.


+5V

1k
2

1k
4

2
E
PC817

1N4007

DGND

Fonte: Do Autor

L1

O circuito de
deteco de passagem funciona da seguinte maneira.
10
Figura 4: Sinal de Sada optoacoplador

Fonte: Do Autor

Toda vez que a onda de entrada passa pelo zero o optoacoplador entra em corte,
enviando sinal alto pro Arduino. No cdigo, que ser apresentado adiante, tem uma
interrupo externa que acionada por esse circuito (esse circuito est conectado no PIN2
da plataforma Arduino). Toda vez que o sinal enviado pelo optoacoplador muda de HIGH
para LOW (modo FALLING) ativa a interrupo executando a funo que trata dessa
interrupo.

3. HARDWARE

3.1. Controle
Constitudo pela Plataforma Arduino UNO R3, LCD 16x2, PushButtons, Sensor
de posio (potencimetro).
A alimentao da plataforma Arduino uma fonte chaveada de 9V 1A. A partir
dela na plataforma Arduino disponibiliza uma fonte de 5V que utilizada para alimentar
os elementos de controle.

3.2. Potncia
Constitudo pelo TRIAC BT137 600R, suporta at 8A e 600V. Trafo abaixador
de 220/12V 1A para reduzir a tenso para a ponte utilizada pelo circuito de deteco de
passagem pelo zero e tambm para uma fonte linear de 12V usada para alimentao do
optoacoplador responsvel pelo disparo do gate do TRIAC.
Utiliza-se tambm o optoacoplador PC387.
Os optoacopladores so elementos de proteo, isolam o circuito de controle do
de potncia.
Figura 5: Optoacoplador PC817

Fonte: Google Imagens modificado pelo autor

O PC817 possui um diodo emissor de luz interno, que ao aciona-lo satura o


fototransistor.

4. CDIGO
#include "LiquidCrystal.h"
#include "TimerOne.h"
#define
#define
#define
#define
#define
#define

bDiminui A2
bEnter
A3
bAumenta A4
potenciometro A5
triacGatePin 10
display 7

int valorPotenciometro = 0;
int i = 0; //contador para o lao for
int PotenciaDimmer = 0; //Potencia do Dimmer de 0 a 100%
int ProgressoBarra = 0; //Progresso da Barra no LCD de 0 a 16
char state = 1; //varivel que guarda posio atual do menu
LiquidCrystal lcd (12, 11, 6, 5, 4, 3); //Declarao do objeto tipo lcd
//Cria Caracterer que preencher a barra de progresso
byte pBar[8] = {
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
};
//==================================================================
void setup()
{
lcd.begin(16, 2);

SETUP

//Iniciando a biblioteca do LCD

pinMode(bDiminui, INPUT);
pinMode(bEnter, INPUT);
pinMode(bAumenta, INPUT);

//Botes

pinMode(display, OUTPUT);
pinMode(potenciometro, INPUT);
pinMode(triacGatePin, OUTPUT);
digitalWrite(bDiminui, HIGH);
digitalWrite(bEnter, HIGH);
digitalWrite(bAumenta, HIGH);

//Aciona o pull-up interno dos botes

digitalWrite(display, 7);
//Cria o caracter da barra de progresso
lcd.createChar(0, pBar);
//Interrupes
attachInterrupt(0, PassagemPorZero, FALLING); //associa interrupcao INT0
(PIN2) com funcao PassagemPorZero
}

//=================================================================== LOOP
/* * O programa constituido de apenas 3 telas: * TELA 1: (state == 1)
*
Aparecer a seguinte mensagem no LCD: *
PROJETO
ARDUINO *
DIMMER *
*
O usurio tem a opo
de pressionar o botao: *
bAumenta - Avana pra TELA 2
*
bDiminui - Retorna pra TELA 3 *
bEnter No executa nenhuma funo * * TELA 2: (state == 2) *
Aparecer a
seguinte mensagem no LCD: *
CONTROLE BOTAO
*
BARRA DE PROGRESSO *
*
O usurio tem a opo
de pressionar o botao: *
bAumenta - Avana pra TELA 3
*
bDiminui - Retorna pra TELA 1 *
bEnter
habilita a Funo da TELA 2 (CONTROLE POR
BOTOES)
*
* TELA 3: (state == 3)
*
Aparecer a seguinte mensagem no LCD: *
CONTR POTENC
*
BARRA DE PROGRESSO *
*
O usurio tem a opo
de pressionar o botao: *
bAumenta - Avana pra TELA 1
*
bDiminui - Retorna pra TELA 2 *
bEnter
habilita a Funo da TELA 3 (CONTROLE POR
POTENCIOMETRO)
*
*/
void loop()
{
delay(300);
switch (state) {
// Define/checa qual tela atual
est
//*************************************************************************
** TELA 1
case 1:
// executado quando na TELA 1
switch (VerificaBotao()) {
case bAumenta:
lcd.clear();
//Limpa tela
MudaParaTela(2);
//Avana para TELA 2
break;
case bDiminui:
lcd.clear();
//Limpa tela
MudaParaTela(3);
//Retorna para TELA 3
break;
case bEnter:
MudaParaTela(1);
//Caso apertar o bEnter no
acontecer nada
break;
//Continua na TELA 1
default:
// Caso nenhum boto tenha sido
apertado,
MudaParaTela(1);
// Continua na TELA 1.
}
break;
//*************************************************************************
** FIM TELA 1
//*************************************************************************
** TELA 2
case 2:
// executado quando na TELA 2
switch (VerificaBotao()) {
case bAumenta:
lcd.clear();
//Limpa tela
MudaParaTela(3);
//Muda para TELA 3
break;
case bDiminui:
lcd.clear();
//Limpa TELA
MudaParaTela(1);
//Muda para TELA 1

break;
case bEnter:
ControlePorBotao();
//Executa Funo
ControlePorBotao();
break;
default:
MudaParaTela(2);
//Continua na TELA 2 mesmo no
pressionando nenhum botao
}
break;
//*************************************************************************
** FIM TELA 2
//*************************************************************************
** TELA 3
case 3:
// executado quando na TELA 3
switch (VerificaBotao()) {
case bAumenta:
lcd.clear();
//Limpa tela
MudaParaTela(1);
//Muda para TELA 1
break;
case bDiminui:
lcd.clear();
//Limpa tela
MudaParaTela(2);
//Muda para TELA 2
break;
case bEnter:
ControlePorPotenciometro();
//Executa funo
ControlePorPotenciometro();
break;
default:
MudaParaTela(3);
//Continua na TELA 3 memso no
pressionado nenhum botao
}
break;
//*************************************************************************
** FIM TELA 3
default: ;
}
}
//============================================== FIM da funo LOOP
//============================================== Verifica Boto
/* * Essa Funo verifica qual o botao foi pressionado e * retorna o botao
para onde foi chamada */
char VerificaBotao() {
if(digitalRead(bAumenta) == 0)
{
return bAumenta;
}else
if (digitalRead(bDiminui) == 0)
{
return bDiminui;
}else
if (digitalRead(bEnter) == 0)
{
return bEnter;
} else
return 0;
}

//============================================== Fim da funao Verifica


Boto
//============================================== Verifica Boto
/* * Essa Funo responsvel por escrever o conteudo * de cada tela *
* TELA 1: *
PROJETO ARDUINO *
DIMMER *
TELA 2:
*
CONTROLE BOTAO *
*
TELA 3: *
CONT POTENC
*
*
*/
void MudaParaTela(char tela)
{
state = tela;
if(tela == 1)
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("PROJETO ARDUINO");
lcd.setCursor(0,1);
lcd.print("DIMMER");
}
if(tela == 2)
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("CONTROLE BOTAO");
lcd.setCursor(0,1);
lcd.print("Press bEnter");
}
if(tela == 3)
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("CONT POTENC");
lcd.setCursor(0,1);
lcd.print("Press bEnter");
}
return;
}
//============================================== Fim MudaParaTela
//============================================== ControlePorBotao
/* * Funo ControlePorBotao - Permite controlar o dimmer pelos botoes:
*
Se pressionar o botao: *
bAumenta - Aumenta a barra de
progresso e a potencia na lampada *
bDiminui - Diminui a barra de
progresso e a potencia na lampada *
bEnter - Interrompe a Funo e
retorna TELA 2 sem barra de progresso */
void ControlePorBotao()
{
delay(300);
//tempo do botao para no sair assim que
entrar na funo
while(digitalRead(bEnter) == 1)
{
lcd.clear();
lcd.print("CONTROLE BOTAO");
//Verifica qual botao foi pressionado para aumentar ou diminuir a barra
de progresso e a Potencia da lampada
if(digitalRead(bAumenta) == 0 && ProgressoBarra < 16)
{
ProgressoBarra ++;
}else if(digitalRead(bDiminui) == 0 && ProgressoBarra > 0)
{
ProgressoBarra --;

}
PotenciaDimmer = int(map(ProgressoBarra, 0, 16, 0,
100));
//Equivalencia entre as variaveis ProgressoBarra e PotenciaDimmer
//Print a barra de progresso
for(i=0; i<ProgressoBarra; i++)
{
lcd.setCursor(i,1);
lcd.write(byte(0)); //preenche o quadrado do LCD
}
delay(150);
}
return;
}
//============================================== Fim da funao
ControlePorBotao
//============================================== ControlePorPotenciometro
/* * Funo ControlePorPotenciometro - Permite controlar o dimmer pelo
potenciometro *
Se pressionar o botao: *
bAumenta - nada
acontece *
bDiminui - nada acontece *
bEnter - Interrompe a
Funo e retorna TELA 3 sem barra de
progresso *
*
potenciometro controla o dimmer (pontecia da
carga - lampada) */
void ControlePorPotenciometro()
{
delay(300);
while(digitalRead(bEnter) == 1)
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("CONTR POTENC");
//ADC - Conversor Analogico Digital: Ler o pin do potenciometro
valorPotenciometro = analogRead(potenciometro);
delay(5);
//Converter o valorPotenciometro para a variavel PotenciaDimmer
correspondente
PotenciaDimmer = int(map(valorPotenciometro, 0, 1023, 0, 100));
//Relaciona valorPotenciometro a valor correspondente a variavel
ProgressoBarra
ProgressoBarra = int(map(valorPotenciometro, 0, 1023, 0, 16));
//Print Barra de Progresso
for(i=0; i<ProgressoBarra; i++)
{
lcd.setCursor(i, 1);
lcd.write(byte(0)); //Preenche quadrado do LCD
}
delay(150);
}
return;
}
//============================================== Fim da funao
ControlePorBotao
//============================================== Deteco de
PassagemPorZero
/* * Funo executada aps a interrupo externa no PIN2 que a deteco
de passagem por zero * Essa funo inializa o Timer1 com a contagem do
respectivo tempo de disparo para obter a
* potencia desejada no dimmer */

10

void PassagemPorZero()
{
if (PotenciaDimmer > 0) {
long dimtime = int(map(PotenciaDimmer, 0, 100, 8000, 150)); // calcula
o tempo de delay para o disparo do TRIAC
Timer1.initialize (dimtime); // inicializa o TIMER1 com o delay
calculado
Timer1.attachInterrupt(gateTRIAC); //associa a funcao gateTRIAC
com Interrupcao do TIMER1
Timer1.start(); // inicia contagem TIMER1
} else {
digitalWrite(triacGatePin, LOW);
// mantem gate do TRIAC desativado.
Timer1.stop();
}
}
//============================================== Fim da funao
PassagemPorZero
//============================================== gateTRIAC
/* * Trata a interrupo interna do TIMER1 gerando pulso no gate do TRIAC
*/
void gateTRIAC () { // trata interrupcao do TIMER1 gerando pulso no gate
do TRIAC
digitalWrite(triacGatePin, HIGH); // dispara o Triac
delayMicroseconds(15); // aguarda 15 microsegundos para garantir disparo
do TRIAC
digitalWrite(triacGatePin, LOW);
// desabibilta gate do TRIAC
Timer1.stop();
}
//============================================== Fim da funo gateTRIAC

11

ANEXO A DIAGRAMA ELTRICO


LCD

+12V
7812
1

VO

GND

VI

1N4007

D0
D1
D2
D3
D4
D5
D6
D7

1k

7
8
9
10
11
12
13
14

4
5
6

1
2
3

RS
RW
E

VSS
VDD
VEE

+5V

33uF
33uF
LED

7
6
5
4
3
2
1
0

+5V

SIM1

7
~6
~5
4
~3
2
TX > 1
RX < 0

13
12
~11
~10
~9
8

SIMULINO UNO

DIGITAL (PWM~)

SIMULINO
ARDUINO

ATMEGA328P

ANALOG IN

1k
2

1N4007

2
E
PC817

A0
A1
A2
A3
A4
A5

DGND

+5V

+12V

L1

A5

A4

A3

A2

1k
4

A0
A1
A2
A3
A4
A5

GND

5V

RESET

ATMEL

POWER

www.arduino.cc
blogembarcado.blogspot.com

AREF

13
12
11
10
9
8

DGND

1k

1k

1k

10

1k

100R

3
K
PC817

100k

VSINE
TRIAC

DGND

DGND

12

Vous aimerez peut-être aussi