Você está na página 1de 37

10

Disparo do Triac e Corrente na carga


8
6
CORRENTE NA CARGA
4
(A)
2
PIN_DETECT (V)
0
-2 0,1 0,11 0,12 0,13 0,14
PIN_DISPARO (V)
-4
-6
-8
-10
Por Fernando Koyanagi
Intenção dessa aula
1. Apresentar um exemplo de circuito
Dimmer usando Triac, controlado via
WiFi por Node MCU ESP12-E DevKit
V1.0.
Demonstração
Recursos usados
1x Node MCU ESP12-E DevKit V1.0
11x resistores (ver esquema)
4x diodos 1N4007
1x opto acoplador 4N25
1x 74HC14 Seis inversores com entradas Schmitt Triggers
1x opto acoplador/driver de Triac MOC3032
1x Triac TIC236D
1x capacitor 100nF/250V
1x fusível de 10A/250V
1x Fonte AC 127V
1x Fonte DC 5V
Osciloscópio
Fios
Protoboard
Rede WiFi
ATENÇÃO
Neste exemplo trabalhamos com tensões
elevadas capazes de causar eletrocussão e dano
a equipamentos.

Há pontos no circuito sem isolamento galvânico.

Se as precauções necessárias não forem


tomadas na realização das medidas,
instrumentos como osciloscópios podem sofrer
danos irreversíveis.
Links onde
comprei os
componentes

Em www.fernandok.com

6
forum.fernandok.com
Instagram
fernandok_oficial

Telegram
fernandok_oficial

8
O circuito em blocos

Fonte AC
I Sincronizador
(detector de passagem por zero)

TRAFO

I
4N25

Chaveamento
I Controle Fonte DC

MOC3032

Carga
Circuito de detecção
Circuito de detecção – Formas de onda

200
Atenuação da rede AC com divisor resistivo e saída da ponte retificadora
150

100

50

DIVISOR (V)
0 RETIFICADO (V)
0 0,005 0,01 0,015 0,02 0,025 0,03 0,035 0,04
Entrada AC (V)

-50

-100

-150

-200
Circuito de detecção – Formas de onda
1,60E+01
Atenuação da rede AC com divisor resistivo e saída da ponte retificadora
1,40E+01

1,20E+01

1,00E+01

8,00E+00

6,00E+00

4,00E+00

2,00E+00
DIVISOR (V)
RETIFICADO (V)
0,00E+00
0 0,005 0,01 0,015 0,02 0,025 0,03 0,035 0,04
-2,00E+00

-4,00E+00

-6,00E+00

-8,00E+00

-1,00E+01

-1,20E+01

-1,40E+01
Circuito de detecção – Tratando o sinal – 3 inversões e um
ajuste de nível

Pull-up
Detecção da passagem por zero
15
14
13
12 Detecção da passagem por zero
11
10
9
8
7
6
5
4
3 FASE / 20 (V)
2 PIN_DETECT (V)
1
0
-1 0 0,005 0,01 0,015 0,02 0,025 0,03 0,035 0,04

-2
-3
-4
-5
-6
-7
-8
-9
-10

* O valor da tensão da rede foi escalado em 1:20 para facilitar a visualização


Circuito de controle e driver de corrente
– Node MCU ESP12E V1.0
Circuito de controle e driver de corrente – 74HC14
Circuito de chaveamento
Circuito de chaveamento – MOC3032

“ Os dispositivos MOC3032 consistem em díodos emissores


de infravermelhos de arsenieto de gálio acoplados
opticamente a um detector de silício monolítico executando a
função de um driver de triac bilateral de cruzamento de
tensão zero. Eles são projetados para uso com um triac na
interface de sistemas lógicos para equipamento alimentados
a partir de linhas de 115 Vac ”
Datasheet do MOC3020 fabricado pela Motorola

Circuito sugerido pelo fabricante do MOC3032


Triac TIC236D

• Triacs são triodos, da familia dos tiristores.


Esses Triodos para corrente alternada são
como dois SCR em antiparalelo com um
terminal de acionamento, o GATE.

• Máximo 12 A rms

• Até 400V entre Gate e o Main Terminal 1


aplicados bidirecionamente.

• Corrente de manutenção de 20mA a 40mA.

• Corrente máxima de disparo no Gate +/-


50mA
Corrente sobre a carga e sinais de controle
10

Disparo do Triac e Corrente na carga


8

CORRENTE NA CARGA (A)


0 PIN_DETECT (V)
0,1 0,105 0,11 0,115 0,12 0,125 0,13 0,135 0,14
PIN_DISPARO (V)

-2

-4

-6

-8

-10
Código - Fonte: Declarações

//Inclui biblioteca Wifi


#include <ESP8266WiFi.h>

const int PIN_DETECT = 5; //GPIO usada para detecção


const int PIN_DISPARO = 16; //GPIO usada para disparo do TRIAC

volatile float AJUSTE = 0.0; //Armazena o valor atual do ajuste

//Cria um servidor na porta 80


//(porta padrão para onde os navegadores enviam as requisições http)
WiFiServer server(80);
Código - Fonte: Setup()
void setup()
{
Serial.begin(74880); //inicia a Serial
pinMode(PIN_DETECT, INPUT); //define o GPIO como entrada
pinMode(PIN_DISPARO, OUTPUT); //Define o GPIO como saída

digitalWrite(PIN_DISPARO, LOW); //Inicia o GPIO em nível baixo

//Mensagem pela Serial


Serial.println();
Serial.println("Conectando . . .");

//Faz o ESP se conectar à rede WiFi disponível no local de uso.


//No nosso exemplo o ssid da rede é SSID e a senha é SENHA
WiFi.begin("SSID", "SENHA");
Código - Fonte: Setup()
//Enquanto o ESP não se conectar à rede
while (WiFi.status() != WL_CONNECTED)
{
//Verificamos a cada 500 milisegundos
delay(500);
Serial.print(".");
}

//Se chegou aqui é porque conectou à rede,


//então mostramos na Serial para termos um feedback
Serial.println();
Serial.println("Conectou!");

delay(1000); //aguarda um segundo

//Configurações do IP fixo.
//Você pode alterar conforme a sua rede.
IPAddress ip(192, 168, 0, 119);
IPAddress gateway(192, 168, 0, 1);
IPAddress subnet(255, 255, 255, 0);

Serial.println("Configurando IP fixo para : ");


Serial.println(ip.toString());

//Solicita ao ESP a configuração


WiFi.config(ip, gateway, subnet);
Código - Fonte: Setup()

//Inicializa o servidor que criamos na porta 80


server.begin();

delay(1000); //aguardamos mais um segundo

//Mostramos na Serial o IP que o ESP possui


//para verificarmos se é o mesmo que configuramos
Serial.println("Server em:");
Serial.println( WiFi.localIP().toString());

//Ajustamos o ESP para detectar uma borda de descida no PIN_DETECT (GPIO5)


// e ao detectar, executar a função ISR_pulsar
attachInterrupt(digitalPinToInterrupt(PIN_DETECT), ISR_pulsar, FALLING);
}
Código - Fonte: Função de interrupção

//Esta é a função que será executada quando for detectada


//uma interrupção no GPIO5 (borda de descida)
//A função é armazena na RAM para execução mais rápida
//declarando ICACHE_RAM_ATTR antes de sua assinatura
ICACHE_RAM_ATTR void ISR_pulsar()
{
//Determina o atraso no disparo como uma fração (de 0% a 100%) de 7000us.
//Como a duração de meio período é de 8333us e descontando
// a largura do pulso de detecção que é de aproximadamente
//1300us, podemos considerar que meio período vale aproximadamente
//7000us.
//Atrasar o disparo em 100% deste valor (AJUSTE=0.0) não entrega nenhuma
//potência à carga. Nenhum atraso (AJUSTE=1.0) entrega 100% da potência.
delayMicroseconds((1.0 - AJUSTE) * 7000.0);

digitalWrite(PIN_DISPARO, HIGH); //Ajuste o GPIO16 para nível Alto


delayMicroseconds(500); //Aguarda 500us
digitalWrite(PIN_DISPARO, LOW);//Ajuste o GPIO16 para nível Baixo
}
Código - Fonte: Loop()

void loop() //Executa enquanto nenhuma interrupção é gerada


{

//Verifica se algum cliente está tentando se conectar


WiFiClient client = server.available();

if (client) //se há um cliente...


{
//Fazemos a leitura da requisição
String req = client.readStringUntil('\r');

//A partir daqui, verificamos se a requisição possui algum comando de


//ajuste de sinal
if (req.indexOf("acao=0") != -1)
{
AJUSTE = 0.0; //nenhuma potência (atraso de 100%)
}
else if (req.indexOf("acao=1") != -1)
{
AJUSTE = 0.1; //10% da potência (1.0 - 0.1 = 0.9 => 90% de atraso)
}
Código - Fonte: Loop()
if (req.indexOf("acao=2") != -1)
{
AJUSTE = 0.2; //...e assim por diante . . .
}
else if (req.indexOf("acao=3") != -1)
{
AJUSTE = 0.3;
}

...
else if (req.indexOf("acao=9") != -1)
{
AJUSTE = 0.9;
}

else if (req.indexOf("acao=A") != -1)


{
AJUSTE = 1.0; //...até que 100% da potência é solicitada
//1.0 - 1.0 = 0.0 ou 0% do atraso
}
Código - Fonte: Loop()
//Este é o html que iremos retornar para o cliente
//É composto basicamente de botões numerados indicando os níveis de 0% a 100%
//A parte que nos interessa é o <a href=' com a ação vinculada a cada botão
//Quando clicamos em um destes botões essa informação chegará até o ESP para
//que ele verifique qual ação deve executar
//A parte dentro de '<style>' é apenas para modificarmos o visual da página
//que será exibida, você pode alterá-la como quiser
String html =
"<html>"
"<head>"
"<meta name='viewport' content='width=device-width, initial-scale=1, user-
scalable=no'/>"
"<title>DIMMER WiFi Http</title>"
"<style>"
"body{"
"text-align: center;"
"font-family: sans-serif;"
"font-size:25px;"
"padding: 25px;"
"}"
"p{"
"color:#444;"
"}"
"button{“
"outline: none;"
"border: 2px solid #1fa3ec;"
Código - Fonte: Loop()
"border-radius:18px;"
"background-color:#FFF;"
"color: #1fa3ec;"
"padding: 5px 25px;"
"}"
"button:active{"
"color: #fff;"
"background-color:#1fa3ec;"
"}"
"button:hover{"
"border-color:#0000ff;"
"}"
"</style>“
"</head>"
"<body>"
"<p>Nivel de ajuste " + String(AJUSTE * 100, 0) + "%</p>"
"<p><a href='?acao=0'><button>0%</button></a></p>"
"<p><a href='?acao=1'><button>10%</button></a></p>"
"<p><a href='?acao=2'><button>20%</button></a></p>"
"<p><a href='?acao=3'><button>30%</button></a></p>"
"<p><a href='?acao=4'><button>40%</button></a></p>"
"<p><a href='?acao=5'><button>50%</button></a></p>"
"<p><a href='?acao=6'><button>60%</button></a></p>"
"<p><a href='?acao=7'><button>70%</button></a></p>"
"<p><p><a href='?acao=8'><button>80%</button></a></p>"
"<p><a href='?acao=9'><button>90%</button></a></p>"
"<p><a href='?acao=A'><button>100%</button></a></p>"
"</body>"
"</html>";
Código - Fonte: Loop()

//Escreve o html no buffer que será enviado para o cliente


client.print(html);
//Envia os dados do buffer para o cliente
client.flush();
}
}
Página de controle e saída serial
Capturas no osciloscópio - Detecção

Duração do
pulso de
detecção é de
1340us
Capturas no osciloscópio - Detecção
Capturas no osciloscópio – Detecção e disparo
Capturas no osciloscópio – Sequencia de ajustes (Trafo)
Capturas no osciloscópio – Sequencia de ajustes (AmpOp)
Em www.fernandok.com
Download arquivos PDF e INO do código fonte

37

Você também pode gostar