Manual

do

Maker

.

com

ESP8266 e relé embutidos

ESP8266 e relé embutidos

Já há alguns posts estou implementando o controle da casa, como já exemplificada a abertura da porta e acendimento da lâmpada do meu balcão nesse outro post (não com ESP8266), com o controle sendo feito diretamente com o Raspberry Pi 2, utilizando MQTT (e ele próprio é o broker, também para os demais dispositivos conectados).

Dando uma olha aí pelos artigos, você encontra diversas interações já finalizadas e alguns com prova de conceito, mas não implementados ainda. Esse artigo tem o propósito de finalizar a implementação do desligamento das lâmpadas da minha sala, tendo sido iniciado nesse outro post utilizando o framework Sming com o ESP8266 (ESP-01) para o acionamento de 2 relés. Nesse post anterior, o conceito foi provado utilizando LEDs, mas agora a implementação será real e algumas observações devem ser levadas em conta.

Acionando relé com ESP8266

Algumas pessoas tem cometido erros grotescos em relação ao acionamento de relé com ESP8266. O primeiro, é tentar acioná-lo colocando um GPIO diretamente no relé. Um segundo é alimentar o relé com fonte regulada a 3.3V. Desses dois primeiros erros, já faltam corrente e tensão, respectivamente. Mas não para por aí. Ainda que usando um módulo relé, algumas pessoas tendem a colocar um diodo (totalmente desnecessário) e nesse caso a tensão cai mais 0.7V. Lembrando que o ESP8266 fornece apenas 16mA por pino, para utilizá-lo em acionamento de relés você tem várias formas, mas me ocorre duas.

Transistor FET canal N

Se você utilizar um transistor, poderá utilizar tensão externa, tal qual eu fiz nesse post. Nesse caso, você deverá manter o GPIO constantemente em HIGH para manter o relé acionado. É o comum, portanto, não há mal em fazê-lo, mas nesse último link de referência você encontrará uma outra maneira de fazê-lo, utilizando um NE555 no modo biestável e assim apenas um pulso do GPIO será necessário para manter o relé ligado ou desligado.

Para melhorar o artigo e levá-lo a produzir algo melhor ainda, consegui chegar no ponto de utilizar apenas 1 botão para desligar e ligar, assim fica igualzinho uma fonte ATX se o circuito for utilizado para o propósito de cortar a energia de boards ARM,MIPS e MCUs.

Optocoupler, acoplador ótico, opto acoplador, foto acoplador, photocoupler, isolador ótico...

Achei todos esses termos para o mesmo componente. Escrevi um breve post para explicar o que é um acoplador ótico e como utilizá-lo; é tão simples que não há necessidade de um artigo exclusivo, mas isolar informações em partes também ajuda a atingir com mais clareza os objetivos de projetos mais incrementados como esse. Essa parece ser a maneira mais prática e diminuta para o nosso objetivo e será adotado aqui.

Alimentação do ESP8266

Para alimentá-lo, tenha sempre em mente que ele é 3.3V e não é tolerante a 5V. Você tem várias opções, dentre as quais uma  fonte de tensão superior juntamente a um regulador de tensão 3.3V. Nesse caso, você encontra fontes baratas por aí, ou pode utilizar uma fonte velha de um celular antigo. Bastará abrí-lo e utilizar a fonte que está dentro. Foi o que fiz, mas devido ao espaço limitado na caixa do interruptor, não pude tirar proveito da porta USB, apenas o utilizei para alimentação de todo o circuito, que disponho mais adiante.

Conexão com a corrente alternada

Somos hobistas, somos profissionais de tecnologia ou somos outra coisa qualquer, não importa. Nesse momento há algo muito sério a ser levado em consideração, que é a interação com a corrente alternada.

Se você for menor de idade, não goza de plenas faculdades mentais, vota no PT, programa em PHP ou é vegano, não recomendo que faça nada que envolva corrente alternada. Isso mata! Você pode por fogo na casa, matar o gato, incendiar a favela, destruir toda uma geração de analfabetos funcionais arredores e sabe-se o que lá mais.

Em muitos casos as pessoas sequer sabem o que é efeito joule e como é fácil disperdiçar energia, por isso vou discorrer sobre os riscos reais de um serviço mal feito.

emendas

Você corta um fio (seja ele rígido ou flexível) então dobra-o e emenda com fita isolante. É um recurso, mas não é ideal, ainda mais tratando-se do serviço feito para esse artigo.

Conector Sindal

Parece uma ótima pedida, não é mesmo? O conector Sindal elimina a necessidade de fita isolante e garante o fio preso adequadamente. Mas não nesse modelo abaixo. Repare que nesse modelo, o fio é preso somente pelo parafuso que o prensa. Há uma norma NBR que diz claramente que o fio não deve ser "decapitado" sob pressão e esse Sindal faz justamente isso, se for fio em malha, os fios se romperão. E esse não é o único problema.

Efeito Joule

Para ser breve, vou citar a diferença de tensão e corrente; a tensão é a força exercida para movimentar os elétrons por um meio. A corrente é o fluxo de elétrons por esse meio.

Quando uma corrente elétrica passa por um ponto de resistência, a energia que não flui é convertida em calor, porque ela está sendo resistida e essa força de resistência gera consumo. Suponhamos que você tem um cano que passa 100 litros de água por segundo, aí você abre uma torneirinha de filtro de barro conectado a esse cano. O que vai acontecer é uma pressão absurda que pode até romper a torneira, porque ela não comporta o fluxo de água. Do mesmo modo o efeito Joule. Você tem um fio elétrico homologado por um engenheiro em suas instalações (ou nas instalações de seu cliente) e de repente, adiciona uma emenda dessas. Se a corrente não for muito alta, o mínimo que vai acontecer é um aumento do consumo de energia, e isso pode representar de 20% a 60%, dependendo da quantidade de emendas ruins no imóvel.

Em um caso onde o consumo é alto, o fio tende a esquentar mais, porque a emenda tem que dissipar mais calor. Isso vai estragar o fio, que em algum momento se romperá e poderá causar um curto circuito.

Por isso tenho algumas recomendações a respeito, além da segurança. E já pensou se você entra em uma residência para fazer a implementação de domótica e ainda reduz o consumo de energia invés de aumentá-lo? Pois minha primeira dica é essa; se for implementar algo, passe por todos os pontos elétricos da casa e veja o que você pode melhorar seguindo essas dicas.

No video eu mostro as emendas ideais e as mais próximas do ideal.

Conector de derivação

Esse não é o ideal, pela mesma razão supracitada. Ele gera calor também, mas a intervenção na rede elétrica nesse ponto terá o propósito de alimentar uma fonte de 3.3V com 1A, logo, podemos engolir seco e desfrutar do recurso se não for fio rígido. No meu caso sim, é fio rígido, portanto não consegui (eu tentei) utilizá-lo.

Claro, como todos os produtos, sempre tem o melhor e o pior. Esse presumo que seja o pior, mas é o que tenho. Ainda assim, é imensuravelmente mais seguro que utilizar fita isolante ou um Sindal meia-boca. Não se preocupe por eu estar mostrando apenas os componentes porcarias até aqui. No video você vê o que é realmente um material de qualidade, que obedece todas as normas e que garante (comprovadamente) uma economia de energia variando de 20% a 60% quando em substituição aos elementos bizarros dispostos até aqui (sei que receberei críticas dos "acostumados", mas reafirmo minha opinião).

Manter os fios curtos

Uma coisa muito comum dentro das caixas de interruptores e tomadas é uma motoeira de fios, dispostos para facilitar a manpulação e para permitir reemendas em caso de rompimento do fio. Mas se tivesse uma emenda Sindal como a exibida no video, não haveria necessidade e nem o medo do rompimento do fio por ser curto. Não dá pra mostrar as qualidades e detalhes apenas com imagens, por isso é fundamental que você veja o video da implementação dessa parte do projeto a seguir. Como você pode ver na caixa do interruptor finalizada, o comprimento necessário e suficiente foram as pontas até o módulo relé, não mais, nem menos. A fonte de alimentação para o circuito e para o ESP8266 ficou alocada ao lado dos derivadores DERSEHN (visite o site, é feio mas o produto é bacana mesmo).

E a empresa é peituda, colocou um ensaio com conector cerâmico pra mostrar uma economia de 12% no ato. Imagine quanto se perde com emendas de fita isolante e Sindal Boqueta?

ensaio-01.webp

Eu sei que já está parecendo propaganda, mas olha a atenção que recebi da DERSEHN (pronuncia "dersên") - me enviaram contas de clientes que autorizaram divulgação e, considerando a crise somada ao preço atual da energia elétrica, não posso deixar de falar em como economizar MUITO (cortei número do relógio e endereço pra não prostituir a pessoa):

contas.webp

Agora que finalizei minhas dicas de economia e segurança, vamos voltar a adaptação na caixa do interruptor. Aqui aconteceu o caso de não caber tudo porque como você pode notar, meus interruptores Prime são de excelente qualidade (de novo; parece propaganda, mas não é - coloquei-os há mais de 5 anos aqui). O efeito colateral disso é que ele ocupa um espaço extra devido à sua estrutura, então, nessa caixa fui obrigado a eliminar os interruptores substituindo-os por botões de estado momentâneo, que fazem o desligamento através do meu circuito com NE555, transistor FET e relé. Além do mais, um acoplador ótico nesse circuito dá ao ESP8266 a capacidade de fazer o acionamento do relé criando assim duas novas e agradáveis condições! Está tão divertido isso que já irritei minha esposa com o pisca-pisca manual. Aqui as luzes da frente e do fundo da sala são separadas, por isso utilizei um módulo relé duplo. Esse circuito exemplificado é para apenas 1 módulo e 1 GPIO, se quiser fazer independente, deverá fazer um conjunto desse pra cada atuador.

ne555_toogle.webp

Se você reparar, é bastante semelhante ao circuito criado para corte de fornecimento de energia para MCUS, ARMs e MIPS que fiz em outro post (que serve também para RISC, como o ESP8266, claro). A grande diferença é que aqui você tem apenas 1 botão para ligar e desligar, mas nesse post ele será utilizado apenas para acionamento do relé. O circuito ficou embutido num espelho cego, então não há o que mostrar, por isso, o acionamento está sendo feito pela protoboard completinho, como deve ficar.  Pra mostrar o quão pequeno ficou, fiz algumas imagens. Esse é o circuito:

circuito-domestico.webp

Nesse circuito é exatamente o desenho que está na protoboard mais acima. Embaixo do ESP-01 está o transistor FET canal N e atrás do circuito coloquei um regulador de tensão 3.3V porque a fonte embutida na caixa do interruptor é 5V.

Após encaixá-lo na caixa do espelho, fica como na imagem abaixo. O quadrado preto é a costa do módulo relé com fita isolante, os fios aparentes acima foram cortados para encaixar no módulo relé. Ainda nao coloquei botão porque só tenho botões feios aqui, mas o optocoupler está alí para o acionamento pelo ESP8266.

espelho-esp01.webp

Aqueles 2 fios brancos estão saindo da fonte. Estão embutidos também, claro. O código que disponibilizo é para utilizar o ESP8266 com o framework Sming, mas já no próximo post devo mostrar códigos genéricos para utilizar esse circuito como pseudo fonte ATX. Dei uma ajeitada no código do post sobre o Sming, porque depois que liguei percebi que ele estava mantendo o estado do botão, que não é o propósito, já que o NE555 que guarda o estado graças ao flip-flop. Dito isso, saiba que esse código é quebra-galho, mas basicamente o que você precisa fazer é levantar e baixar o gpio em um intervalo curto. 100ms é até um exagero, mas aí está. No próximo post coloco códigos bem enxutos. Nesse, a comunicação com o ESP8266 está sendo feita utilizando MQTT.

#include <user_config.h>
#include <SmingCore/SmingCore.h>

#define MQTT_USERNAME "dobitaobyte"
#define MQTT_PWD "senhaSecretaDoMQTT"

#define MQTT_HOST "ns1.dobitaobyte.lan"
#define MQTT_PORT 1883

#define WIFI_SSID "MinhaRedeWiFi"
#define WIFI_PASS "senhaSecreta"

#define ON  0
#define OFF 1

int FRONT = 0;
int BACK  = 0;

int lightStatus = 0; //tudo apagado

void startMqttClient();
void onMessageReceived(String topic, String message);

Timer procTimer;

MqttClient mqtt(MQTT_HOST, MQTT_PORT, onMessageReceived);


void checkMQTTDisconnect(TcpClient& client, bool flag){
    if (flag == true){
        Serial.println("MQTT Broker Disconnected!!");
    }
    else {
        Serial.println("MQTT Broker Unreachable!!");
    }

    procTimer.initializeMs(2000, startMqttClient).start();
}

doFront(){
    digitalWrite(0,FRONT);
}

doBack(){
    digitalWrite(2,BACK);
}

void publishMessage(){
	if (mqtt.getConnectionState() != eTCS_Connected)
		startMqttClient(); // Auto reconnect

	Serial.println("Publicando...");
	mqtt.publish("casa/sala/status/luzes", String(lightStatus));
}

// Callback
void onMessageReceived(String topic, String message){
    if (topic.compareTo("casa/sala/luzes") != 0 || message.length() > 2){
        return;
    }
    lightStatus = message.charAt(0)-48;
    
    if (lightStatus == 1){
        //ACENDE FRENTE
        FRONT = 1;
        doFront();
        FRONT = 0;
        procTimer.initializeMs(100, doFront).start();
    }
    else if (lightStatus == 2){
        //ACENDE FUNDO
        BACK = 1;
        doBack();
        BACK = 0;
        procTimer.initializeMs(100, doBack).start();
    }
    else {
        //ACENDE TODAS COM QUALQUER VALOR NA MENSAGEM
        FRONT = 1;
        doFront();
        FRONT = 0;
        procTimer.initializeMs(100, doFront).start();
        BACK = 1;
        doBack();
        BACK = 0;
        procTimer.initializeMs(100, doBack).start();      
    }
    Serial.print(topic);
    Serial.print(":\n");
    Serial.println(message);
}

//Inicializar o MQTT
void startMqttClient(){
    procTimer.stop();
    if(!mqtt.setWill("last/will","The connection from this device is lost:(", 1, true)){
        debugf("Unable to set the last will and testament. Most probably there is not enough memory on the device.");
    }
    mqtt.connect("Sming", MQTT_USERNAME, MQTT_PWD);
    mqtt.setCompleteDelegate(checkMQTTDisconnect);
    mqtt.subscribe("casa/sala/#");
}

// Chamada quando conectado ao WiFi
void connectOk(){
    Serial.println("I'm CONNECTED");
    startMqttClient();

    //Loop de publicacao (sem while, for, loop()...)
    procTimer.initializeMs(2000, publishMessage).start();
}

//Chamada na falha da conexao WiFi
void connectFail()
{
    Serial.println("Offline");
}

void init(){
    //configuracao do GPIO no init sem problemas pois nao eh loop
    pinMode(0,OUTPUT);
    pinMode(2,OUTPUT);
    Serial.begin(115200);
    Serial.systemDebugOutput(true); // Debug na serial

    WifiStation.config(WIFI_SSID, WIFI_PASS);
    WifiStation.enable(true);
    WifiAccessPoint.enable(false);

    //aguarda status da conexao
    WifiStation.waitConnection(connectOk, 20, connectFail);
}

Assista o video, é bastante breve e direto só pra mostrar o funcionamento.

https://youtu.be/pO3FrRkhbJc

Inscreva-se no nosso canal Manual do Maker Brasil no YouTube.

Próximo post a caminho!

Nome do Autor

Djames Suhanko

Autor do blog "Do bit Ao Byte / Manual do Maker".

Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.