banner

Dimmer WiFi com ESP8266!



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
}



PÁGINA DE CONTROLE E SAÍDA SERIAL







CAPTURAS NO OSCILOSCÓPIO – DETECÇÃO









CAPTURAS NO OSCILOSCÓPIO – DETECÇÃO E DISPARO






CAPTURAS NO OSCILOSCÓPIO – SEQUÊNCIA DE AJUSTES (TRAFO)







CAPTURAS NO OSCILOSCÓPIO – SEQUÊNCIA DE AJUSTES (AmpOp)






FAÇA O DOWNLOAD DOS ARQUIVOS




Nenhum comentário:

Tecnologia do Blogger.