Hoje trago um projeto bastante
solicitado pelos meus seguidores que é sobre um dimmer, ou seja, um dispositivo
de variação de intensidade de corrente elétrica. Nosso exemplo, que emprega um
ESP8266, serve não só para controlar lâmpadas, mas, se utilizado com um Triac
mais potente, você também consegue executar um controle razoável de um motor
comum.
Vou, portanto, te apresentar
um exemplo de circuito dimmer usando Triac, controlado via WiFi por Node MCU
ESP12-E DevKit V1.0.
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
O CIRCUITO EM BLOCOS
CIRCUITO DE DETECÇÃO
CIRCUITO DE DETECÇÃO – FORMAS DE ONDA
CIRCUITO DE DETECÇÃO – TRATANDO O SINAL – 3 INVERSÕES E UM AJUSTE DE NÍVEL
DETECÇÃO DA PASSAGEM POR ZERO
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
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
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);
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("LABMAKER", "18labmaker18"); //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); //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); }
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 }
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) } if (req.indexOf("acao=2") != -1) { AJUSTE = 0.2; //...e assim por diante . . . } else if (req.indexOf("acao=3") != -1) { AJUSTE = 0.3; } if (req.indexOf("acao=4") != -1) { AJUSTE = 0.4; } else if (req.indexOf("acao=5") != -1) { AJUSTE = 0.5; } if (req.indexOf("acao=6") != -1) { AJUSTE = 0.6; } else if (req.indexOf("acao=7") != -1) { AJUSTE = 0.7; } if (req.indexOf("acao=8") != -1) { AJUSTE = 0.8; } 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 } //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;" "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>"; //Escreve o html no buffer que será enviado para o cliente client.print(html); //Envia os dados do buffer para o cliente client.flush(); //client.stop(); //descomente para liberar a conexão com o navegador }
2 Comentários
Boa tarde, você disponibilizaria o PCB que usou para imprimir o seu circuito, iria me ajudar muito, obrigado.
ResponderExcluirCada vez que eu assisto os seus vídeos, eu me assusto como você consegue nos passar tanto conhecimento tanto teórico como na prática....
ResponderExcluirEssa advertência que você faz a respeito dos cuidados na utilização do osciloscópio foi muito importante....pois eu mesmo no início da minha carreira, cometi esse erro.., que até hoje estou procurando o circuito........Parabéns.....