O ESP32 Dimmer é um projeto de Automação Residencial desenvolvido para auxiliar no controle de lâmpadas uma vez que possibilita o ajuste preciso de luminosidade da mesma. O Módulo Dimmer é bastante aplicado em diversos projetos de automação como chocadeiras elétricas e demais locais com controle de temperatura via lâmpadas incandescentes.
Através do ESP32 Dimmer vamos poder controlar dinamicamente o controle de luminosidade de lâmpadas e proporcionar mudanças suaves em ambientes como salas de televisão, onde o controle de luz auxilia na melhor experiência de visualização de filmes, séries e conteúdos afins.
No presente projeto de automação é possível realizar o controle de luminosidade através de dois push bottons, normalmente utilizados em projetos de eletrônica e que terão a função de incrementar ou decrementar o valor correspondente a luminosidade da lâmpada.
Alguns fatores para o desenvolvimento deste projeto são importantes de se destacas, o primeiro deles e o mais importante é o cuidado que devemos ter uma vez que estamos lidando com uma rede elétrica de alta tensão e o outro é a escolha da lâmpada que iremos utilizar para o projeto.
Módulo Dimmer MC-8A
Criado com o intuito de proporcionar aos projetos a possibilidade de controlar a quantia de energia enviada para as lâmpadas e consequentemente controlando a sua luminosidade, o Módulo Dimmer MC-8A é amplamente utilizado em projetos de automação residencial.
Com um funcionamento baseado no Triac BT137, o Módulo Dimmer conta também com dois Cis optoacopladores, o MOC3021 e o 4N25, responsáveis por isolar as energias elétricas elevadas que circulam em seu sistema, danifique componentes e cause acidentes ao projetista.
Como sabemos, nenhum microcontrolador é capaz de controlar diretamente energias de corrente alternada (AC), para controlarmos o liga e desliga de dispositivos como lâmpadas, normalmente utilizamos módulos relés, por exemplo, que executam este papel de forma satisfatória.
Porém em alguns casos, queremos mais do que simplesmente controlar o liga e desliga de uma lâmpada, queremos controlar a luminosidade específica desta, deixar a luz um pouco mais fraca ou um pouco mais forte, nestes casos é necessária a inclusão de um Módulo Dimmer.
Antes de continuar apenas um aviso: O presente projeto utiliza-se de redes elétricas de alta tensão, o que causa risco de choques elétricos e danos físicos e materiais, só execute este projeto caso você tenha experiência e certeza do que está fazendo.
Vários dos componentes do módulo estão conectados às estradas de alta tensão do Módulo, então encostar em algum destes é o mesmo que encostar diretamente na tomada, tome cuidado com as superfícies e materiais condutores, segurança em primeiro lugar!
Para melhorar a sua utilização nos mais diversificados projetos, o Módulo dimmer é comercializado com todos os seus bornes nomeados através da placa, porém alguns pontos específicos podemos trabalhar com relação a cada um destes.
Quanto aos bornes de conexão que vão para o ESP32:
- VCC e GND – Pinos de alimentação que vão conectados diretamente junto ao módulo ESP32, mesmo que suas especificações indiquem 5V de alimentação para utilização junto ao Arduino, esta pode ser feita através dos mesmos 3,3V do microcontrolador.
- DIM – Este pino é responsável por realizar o controle da lâmpada através dos pulsos fornecidos pelo ESP, quando em HIGH permite a passagem de energia para a lâmpada.
- ZC – O pino ZC é o que chamamos de detector de Zero Crossing, responsável por verificar os momentos em que a senóide passa pelo zero variando seus valores entre positivo e negativo.
Quanto aos bornes de conexão para energia AC
- AC In – Com a abreviação In vinda de Input, estes dois bornes em especial são responsáveis por receber a energia AC que será controlada pelo Módulo Dimmer.
- AC Load – Estes são os bornes de saída controlada, responsável por realizar a alimentação da lâmpada utilizando-se como base os parâmetros estabelecidos pelo microcontrolador.
O Módulo Dimmer não é bivolt e esta informação é bastante importante, o modelo específico de acordo com a sua energia deve ser selecionado na hora da compra, o módulo precisa estar de acordo com a tensão da sua instalação elétrica residencial que será de 110 ou 220V.
Como saber a tensão do meu Módulo Dimmer MC-8A?
O Módulo Dimmer MC-8A comercializado pela Usinainfo possui uma diferença bastante simples de se verificar entre os seus modelos de 110 e 220V, o resistor grande instalado em pé junto ao módulo possui uma resistência de 15K Ohms para tensões de 110V e uma resistência de 33K Ohms para tensões de 220V.
O Módulo Dimmer pode ser utilizado com qualquer lâmpada?
Infelizmente não, o Módulo Dimmer só pode ser utilizado com lâmpadas incandescentes ou com lâmpadas de LED Dimerizáveis (leading edge), um novo modelo de lâmpada que vem conquistando o mercado. Não será possível realizar o controle de lâmpadas de LED comuns e fluorescentes, por exemplo, podendo causar danos às mesmas.
Posso realizar o controle de Motores através do Módulo Dimmer?
O Módulo Dimmer não é o produto mais indicado para o controle de motores uma vez que não proporcionará um controle muito preciso, este modelo foi produzido para utilização em cargas resistivas e não indutivas que é o caso de motores.
Conceitos Importantes de Elétrica
Alguns conceitos básicos de elétrica devem estar bem claros para compreendermos o projeto e o sistema de funcionamento do Módulo Dimmer, dentre eles temos o sistema de funcionamento da rede AC.
A instalação elétrica de corrente alternada (AC) das residências que seguem o padrão brasileiro possuem uma frequência fixa de 60Hz na qual o valor da tensão fica 60 vezes positivo e 60 vezes negativo a cada segundo.
Ao alternar entre os valores positivos e negativos, a tensão sempre passa por um ponto comum de 0V o qual é utilizado como parâmetro para o controle da lâmpada e é sinalizado com um pulso para o ESP através do pino Zero Crossing que mencionamos anteriormente, um exemplo destas variações podemos ver abaixo:
Mas quando a Lâmpada passa por 0V ela não deveria se apagar?
Na verdade, a lâmpada não só deveria como também se apaga sempre que chega aos 0V, mas assim que passa por este ponto volta a ascender, como este liga e desliga ocorre 120 vezes por segundo, a cada mudança de sinal, a nossa visão não percebe piscar, parece que está sempre aceso.
Com isto, podemos concluir que teoricamente, é o tempo de permanência em 0V que irá definir a luminosidade de nossa lâmpada, quanto mais longa for a duração da senóide em 0, mais tempo a lâmpada ficara apagada a cada ciclo e assim, menor será a luminosidade que iremos observar.
Cada ciclo da senóide dura em média 8,33 milésimos de segundo (0,0083 segundos) então se ficar apagada o suficiente para iluminar o seu mínimo, este valor ainda será muito pequeno, imagine dividir o segundo em mil partes e a cada 8 partes desta unidade a luz está piscando, isto é tão rápido que se torna imperceptível ao olho humano.
Para entendermos melhor esta teoria vamos observar a imagem abaixo:
A teoria de controle do tempo em 0V do Dimmer é bastante simples, para compreendermos melhor vamos analisar as cristas e o vale da imagem acima, as cristas são os valores positivos da nossa senóide e o vale o nosso valor negativo.
Na primeira crista observamos um valor x1 atribuído ao tempo em que a senóide permaneceu em 0V e quanto menor for este tempo maior será o brilho da lâmpada, no vale já podemos observar que o tempo em 0 foi bem superior através da variável x2 e consequentemente nestes casos menor será o brilho da lâmpada.
Já ao analisarmos a segunda crista vemos que o tempo em 0V expresso por x0 foi praticamente nulo, o valor de 0 correspondeu apenas ao instante em que a senóide mudou o seu valor de negativo para positivo, esta seria a representação de uma lâmpada em seu brilho máximo.
Produtos Utilizados no Projeto ESP32 Dimmer
1 NodeMCU ESP32 Iot com WiFi e Bluetooth – 38 Pinos;
1 Módulo Dimmer para Arduino / Pic MC-8A com sinal Zero Cross;
1 Protoboard 400 Pontos para Montagem de Projetos;
2 Push Button / Chave táctil 6x6x5 para Projetos;
10 Jumper Premium para Protoboard Macho-Macho 20 cm;
1 Metro de Fio Cristal Paralelo 2×18 0,75mm;
1 Soquete para Lâmpada (Pode ser um abajur – Mais seguro);
1 Lâmpada Incandescente;
1 Flecha para Tomada.
Esquema de Ligação do Projeto ESP32 Dimmer
O esquema de ligação do Projeto ESP32 Dimmer é extremamente fácil uma vez que conta com poucos fios de controle, o que já foi mencionado acima e que vale ter cuidado no desenvolvimento desta ligação são os equipamentos de alta tensão, tenha certeza de estarem todos bem fixos junto ao módulo e isolados de qualquer material ou superfície condutiva.
A ligação dos elementos elétricos pode variar de acordo com a disponibilidade de cada um, o recomendado para otimizar a autonomia e mobilidade do projeto é a utilização de uma tomada, porém esta parte do diagrama pode ser conectada diretamente aos fios da rede elétrica.
A utilização da lâmpada por sua vez, pode ser feita através de um soquete comum, através de um abajur ou até mesmo extensão de luz especiais que possuem uma lâmpada instalada em sua extremidade, não é recomendada a instalação da lâmpada sem nenhum dispositivo de fixação e meio de isolamento.
Código de Funcionamento do Projeto ESP32 Dimmer
O código de funcionamento do Projeto ESP32 Dimmer é um pouco mais complexo do que o que utilizamos junto ao Arduino uma vez que seu sistema de interrupção deve ser feito de forma manual e seus comandos mostram-se parcialmente mais extensos do que os que vimos anteriormente.
O projeto não necessita da inclusão de bibliotecas, a única biblioteca inclusa já é instalada junto ao Software Arduino quando fazemos download do mesmo, o código está totalmente comentado, então quaisquer dúvidas quanto ao seu funcionamento podem ser tiradas junto ao mesmo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 |
#include <Arduino.h> #define PINO_DIM 26 #define PINO_ZC 27 #define maxBrightness 800 // brilho maximo em us #define minBrightness 7500 // brilho minimo em us #define TRIGGER_TRIAC_INTERVAL 20 // tempo quem que o triac fica acionado #define IDLE -1 #define pino_botao_up 4 // pino quem que o botao de aumentar o brilho esta conectado #define pino_botao_down 2 // pino que o botao de diminuir o brilho esta conectado //variaveis globais int brilho = 0; int brilho_convertido = 0; unsigned long ultimo_millis1 = 0; unsigned long ultimo_millis2 = 0; unsigned long debounce_delay = 100; hw_timer_t * timerToPinHigh; hw_timer_t * timerToPinLow; portMUX_TYPE mux = portMUX_INITIALIZER_UNLOCKED; volatile bool isPinHighEnabled = false; volatile long currentBrightness = minBrightness; void IRAM_ATTR ISR_turnPinLow(){ // desliga o pino dim portENTER_CRITICAL_ISR(&mux); // desativa interrupçoes digitalWrite(PINO_DIM, LOW); isPinHighEnabled = false; portEXIT_CRITICAL_ISR(&mux); // ativa as interrupçoes novamente } void IRAM_ATTR setTimerPinLow(){ // executa as configuracoes de pwm e aplica os valores da luminosidade ao dimmer no tempo em que ra ficar em low timerToPinLow = timerBegin(1, 80, true); timerAttachInterrupt(timerToPinLow, &ISR_turnPinLow, true); timerAlarmWrite(timerToPinLow, TRIGGER_TRIAC_INTERVAL, false); timerAlarmEnable(timerToPinLow); } void IRAM_ATTR ISR_turnPinHigh(){ // liga o pino dim portENTER_CRITICAL_ISR(&mux); // desativa interrupçoes digitalWrite(PINO_DIM, HIGH); setTimerPinLow(); portEXIT_CRITICAL_ISR(&mux); // ativa as interrupçoes novamente } void IRAM_ATTR setTimerPinHigh(long brightness){ // executa as configuracoes de pwm e aplica os valores da luminosidade ao dimmer no tempo que ira ficar em high isPinHighEnabled = true; timerToPinHigh = timerBegin(1, 80, true); timerAttachInterrupt(timerToPinHigh, &ISR_turnPinHigh, true); timerAlarmWrite(timerToPinHigh, brightness, false); timerAlarmEnable(timerToPinHigh); } void IRAM_ATTR ISR_zeroCross() {// funçao que é chamada ao dimmer registrar passagem por 0 if(currentBrightness == IDLE) return; portENTER_CRITICAL_ISR(&mux); // desativa interrupçoes if(!isPinHighEnabled){ setTimerPinHigh(currentBrightness); // define o brilho } portEXIT_CRITICAL_ISR(&mux); // ativa as interrupçoes novamente } void turnLightOn(){ // liga o dimmer no brilho maximo portENTER_CRITICAL(&mux);// desativa interrupçoes currentBrightness = maxBrightness; digitalWrite(PINO_DIM, HIGH); portEXIT_CRITICAL(&mux);// ativa as interrupçoes novamente } void turnLightOff(){// deliga o dimmer portENTER_CRITICAL(&mux); // desativa interrupçoes currentBrightness = IDLE; digitalWrite(PINO_DIM, LOW); portEXIT_CRITICAL(&mux); // ativa as interrupçoes novamente } void setup() { Serial.begin(115200);//inicia a serial currentBrightness = IDLE; pinMode(PINO_ZC, INPUT_PULLUP); pinMode(PINO_DIM, OUTPUT); digitalWrite(PINO_DIM, LOW); attachInterrupt(digitalPinToInterrupt(PINO_ZC), ISR_zeroCross, RISING); Serial.println("Controlando dimmer com esp32"); pinMode(pino_botao_up, INPUT); pinMode(pino_botao_down, INPUT); } void loop() { Serial.println(brilho); // mostra a quantidade de brilho atual bool leitura_up = digitalRead(pino_botao_up); if ((millis() - ultimo_millis1) > debounce_delay) { // se ja passou determinado tempo que o botao foi precionado ultimo_millis1 = millis(); if (leitura_up == HIGH) { // e o botao estiver precionado brilho++; // aumente o brilho brilho = constrain(brilho, 0, 100); // limita a variavel brilho_convertido = map(brilho, 100, 0, maxBrightness, minBrightness); //converte a luminosidade em microsegundos portENTER_CRITICAL(&mux); //desliga as interrupçoes currentBrightness = brilho_convertido; // altera o brilho portEXIT_CRITICAL(&mux);// liga as interrupçoes } } bool leitura_down = digitalRead(pino_botao_down); if ((millis() - ultimo_millis2) > debounce_delay) { // se ja passou determinado tempo que o botao foi precionado ultimo_millis2 = millis(); if (leitura_down == HIGH) {// e o botao estiver precionado brilho--;// diminui o brilho brilho = constrain(brilho, 0, 100);// limita a variavel brilho_convertido = map(brilho, 100, 0, maxBrightness, minBrightness);//converte a luminosidade em microsegundos portENTER_CRITICAL(&mux); //desliga as interrupçoes currentBrightness = brilho_convertido; // altera o brilho portEXIT_CRITICAL(&mux);// liga as interrupçoes } } } |
Após carregar o código junto ao ESP32 seguindo os parâmetros de gravação que precedem este dispositivo, temos um projeto capaz de controlar a luminosidade de uma lâmpada através de dois push buttons, ao pressionarmos um destes dispositivos mecânicos iremos aumentar o brilho da lâmpada e no outro iremos diminuir o brilho da mesma.
Um projeto que parece parcialmente simples, porém mostrou-se bastante complexo uma vez que envolveu um conhecimento aprofundado no sistema de interrupção do Microcontrolador ESP32 e um conhecimento considerável em eletrônica e elétrica.
Conclusão Projeto ESP32 Dimmer
O Projeto ESP32 Dimmer para controle de intensidade de luz é um projeto desenvolvido com o intuito de explorar ainda mais as possibilidades de uso do Microcontrolador ESP32, um módulo com conexão Wi-Fi, bluetooth e demais ferramentas bastante úteis para a implementação de novas tecnologias.
Utilizando este artigo como base, podemos incrementar o nosso sistema de controle de luz para acesso e controle remoto via wi-fi, podemos incluir ferramentas de controle bluetooth para ambientar sua sala durante um filme ou qualquer outra atividade e isto tudo apenas com o que temos neste projeto.
Se adicionar mais dispositivos podemos fazer muito mais, imagine desenvolver uma chocadeira elétrica que monitore temperatura, umidade e demais informações e te mantenha informado 24 horas sobre a incubação de sua produção? Diversas possibilidades podem ser exploradas com este exclusivo produto.
Se você gostou deste projeto, acha que existem melhorias que passam ser feitas ou até mesmo se ele foi útil para você, não se esqueça de comentar abaixo e deixar a sua opinião, ela é muito importante para nós. Até a próxima!
Boa tarde Matheus parabéns pelo projeto. Teria alguma indicação para que eu posso utilizar em uma resistência até 40A.
Obrigado por sua atenção.
Boa Tarde Daniel! Infelizmente não trabalhei com nenhum produto com potências altas assim para poder indicar.
pessoal gostaria de fazer o comando por interface web, alguem pode ajudar
Bom projeto, porem tem como incorporar o controle de brilho por voz, atraves da interface de I.A. da Alexa Amazon? (echo dot)
show. não eh recomendado para motores a induçao?
qual produto projeto publicado se aplica?
comprei o módulo com este propósito.
obrigado.
Olá Zeh! Infelizmente do site da Usinainfo ainda não tem nenhum produto específico para este tipo de dispositivo. Como citado no artigo, é possível utilizar, porém não tem como garantir precisão e exatidão no controle assim como é possível em equipamentos resistivos.
Funciona para Lâmpadas de LED Dimerizáveis, ou apenas Incandescente?
Olá Arthur! Lâmpadas de LED Dimmerizáveis são compatíveis, só não são compatíveis as lâmpadas de LED tradicionais.
Olá Matheus, utilizando esse mesmo kit e código que você disponibilizou consegui dimerizar com eficiência uma lâmpada incandescente, porém utilizando uma lâmpada de led dimerizavel não consegui controlar, ela até regula a luminosidade mas fica oscilando desligando e ligando. Sabe me dizer se nos seus testes isso acontece?
Olá Leonardo! Nos meus testes não utilizei nenhum modelo de lâmpada dimmerizável, apenas lâmpadas incandescentes, mas existe hoje, dois modelos de lâmpada LED dimmerizável, a trailing edge (borda de fuga) e a leading edge (borda de entrada), ao que tudo indica, nosso módulo não é compatível com o modelo trailing edge, então acreditamos que este seja o problema que está enfrentando aí.
Olá, parabéns pelo projeto.
Estou criando um projeto para controle de temperatura de uma resistência de 2000w. Este módulo suporta?
Olá Vitor! As especificações de potência deste produto seguem a seguinte relação: Potência máxima de 880W para 127V e 1760W para 220V. No site da Usinainfo existem outros Dimmers com potências maiores, porém seus ajustes são manuais, não digitais.
Eu uso bloco com triac de 60 amperes.
Matheus,
Seu programa funcionou perfeitamente com este módulo. Consegui adaptar em meu projeto que faz a leitura de temperatura e controla o aquecimento de um pequeno ambiente através de uma lâmpada incandescente. O problema é que qualquer função a mais que coloco no loop (exemplo: Exibição da temperatura atual em um display) o dimmer funciona alguns segundos e reinicia o Esp32. Já pesquisei bastante mas não consegui encontrar nada que consiga deixar o projeto estável utilizando o controle de um dimmer (via interrupção para o controle de passagem por zero) e outras funções de forma simultânea. Você tem algum artigo ou projeto que possa me ajudar?
Olá Vitor! Por estar reiniciando, é possível que o seu sistema esteja sobrecarregando o ESP, verifique os componentes e até sugiro remover o display e testar a impressão das informações diretamente no Monitor Serial, para ver se soluciona.
Boa tarde queria saber porque o meu codigo na linha 22 e 23 hw_timer_t * timerToPinHigh;
hw_timer_t * timerToPinLow; dá erro de complilaçao. o que estaria errado? Grato Hector