Carlos Alexandre
Donata Assis
Jssica Oliveira
Jata GO
2016
1. INTRODUO
2. Diagrama Eltrico
O diagrama eltrico do projeto segue em anexo.
O circuito pode ser dividido em 3 partes, as quais so:
Fonte: Do Autor
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
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
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
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);
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;
}
}
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
+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