Automação Residencial

Porteiro Inteligente com NodeMCU ESP8266

Eletrogate 16 de maio de 2024

Porteiro Inteligente Com NodeMcu ESP8266

Este projeto apresenta uma opção interessante para o controle de acesso, combinando tecnologia web e a versátil placa NodeMCU ESP8266. Veja abaixo suas principais características e funcionalidades:

Controle Remoto via Página Web: Utilizando uma página web acessível via navegador, este sistema permite o controle remoto da abertura da porta de forma simples e segura. A placa NodeMCU ESP8266 é configurada para um IP fixo dentro da rede local, possibilitando o acesso à página e a ativação do mecanismo de abertura com apenas alguns cliques.

Transformação em Atalho no Desktop: Além do controle via página web, este projeto também oferece a possibilidade de transformar o link de acionamento em um atalho no seu desktop. Ao abrir o atalho, a página web é automaticamente acessada, permitindo o acionamento da trava da porta de maneira fácil e rápida.

 


Materiais Utilizados

Descrição dos materiais:

Módulo Relé 2 Canais 5V com Optoacoplador.

  • O Módulo Relé 2 Canais 5V com Optoacoplador é um dispositivo crucial para controlar cargas de alta potência com sinais de baixa potência. Ele possui dois canais independentes, permitindo o controle de duas cargas separadamente. Ideal para projetos que envolvem o acionamento de dispositivos elétricos, como lâmpadas, motores e eletrodomésticos, por meio de microcontroladores como o NodeMcu ESP8266. O isolamento óptico oferece proteção contra danos elétricos, enquanto o relé possibilita a conexão e desconexão seguras da carga.

Fonte Ajustável para Protoboard

  • A Fonte Ajustável para Protoboard é uma fonte de alimentação que fornece tensão e corrente ajustáveis, ideal para alimentar circuitos experimentais montados em protoboards. Ela permite ajustar os parâmetros de energia de acordo com as necessidades do projeto.

Protoboards (400 pontos)

  • As Protoboards são placas de circuito perfuradas que permitem montar circuitos eletrônicos de forma rápida e sem solda. Com 400 pontos de conexão, oferecem espaço suficiente para interligar os componentes do projeto de maneira organizada e segura.

Jumpers Macho-Macho e Macho-Fêmea

  • Os Jumpers Macho-Macho e Macho-Fêmea são cabos de conexão utilizados para interligar os componentes eletrônicos em um projeto. Os Macho-Macho são usados para conectar componentes em protoboards ou placas de circuito, enquanto os Macho-Fêmea são úteis para conectar componentes em protoboards a outros dispositivos, como o NodeMcu ESP8266.

Fonte 9V 1A Bivolt para Arduino

  • A Fonte 9V 1A Bivolt para Arduino é uma fonte de alimentação que fornece energia estável e confiável para o NodeMcu ESP8266 e outros dispositivos eletrônicos. Com capacidade para operar em diferentes tensões de entrada (bivolt), é uma escolha prática e versátil para alimentar o seu projeto.

Módulo WiFi ESP8266 NodeMcu ESP-12E

  • O Módulo WiFi ESP8266 NodeMcu ESP-12E é uma placa de desenvolvimento baseada no chip ESP8266, que oferece conectividade Wi-Fi para projetos IoT (Internet das Coisas). Ele possui recursos de processamento e armazenamento integrados, além de interfaces de comunicação que o tornam ideal para criar dispositivos conectados à internet.

Esquema De Montagem:

Observação: A trava elétrica alimentada por 12V no esquema é meramente ilustrativa, pois a intenção do projeto é o acionamento de uma trava elétrica já existente no portão de sua casa ou escritório. Portanto, o circuito pode ser instalado próximo ao interfone ou em qualquer lugar onde passem os dois fios de acionamento da trava. A única conexão necessária é ligar esses dois fios no módulo relé, facilitando a integração do sistema de controle remoto com a trava elétrica já instalada. Além disso, o projeto pode ser adaptado para acionar outras travas elétricas ou qualquer outro mecanismo suportado pelo relé, ampliando suas possibilidades de uso.


Código

Código completo:

#include <ESP8266WiFi.h>

// Definição das credenciais da rede WiFi
#ifndef STASSID
#define STASSID "REDE"
#define STAPSK "SENHA"
#endif

// Definição dos parâmetros de rede
IPAddress ip(192, 168, 100, 54);
IPAddress gateway(192, 168, 100, 1);
IPAddress subnet(255, 255, 255, 0);

// Definição das credenciais da rede WiFi
const char* ssid = STASSID;
const char* password = STAPSK;

// Inicialização do servidor na porta 47
WiFiServer server(47);

// Pino do relé para controle da porta
const int relePin = 5;

// Margem de leitura para evitar múltiplos acionamentos
int margemLeitura = 15000;

// Variável para armazenar o tempo de acionamento
unsigned long tempoAC = 0;

void setup() {
  Serial.begin(115200);

  // Inicialização da conexão WiFi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  // Configuração do endereço IP estático
  WiFi.config(ip, gateway, subnet);

  server.begin();
  Serial.println("Conectado ao WiFi. IP: " + WiFi.localIP().toString());
  // Configuração dos pinos do relé e do LED embutido
  pinMode(relePin, OUTPUT);
  digitalWrite(relePin, LOW);
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);
  Serial.println("Inicialização concluída.");
}

void loop() {
  unsigned long tempoAT = millis();

  // Verificação da conexão WiFi
  if (WiFi.status() != WL_CONNECTED) {
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
    }
  }

  // Verificação de clientes conectados
  WiFiClient client = server.available();
  if (!client) {
    return;
  }
  Serial.println("Cliente conectado.");

  // Leitura da requisição do cliente
  String req = client.readStringUntil('\r');
  Serial.println("Requisição: " + req);

  // Verificação da requisição para abrir a porta
  if (req.indexOf("GET /AbrirPorta") != -1) {
    Serial.println("Requisição para abrir a porta.");

    // Verificação do tempo de acionamento
    if (tempoAT >= tempoAC) {
      Serial.println("Tempo atual maior que tempo de acionamento.");
      // Acionamento do relé e LED
      digitalWrite(relePin, HIGH);
      digitalWrite(LED_BUILTIN, HIGH);
      tempoAC = millis() + margemLeitura;
      Serial.println("Porta aberta.");

      // Resposta para o cliente após abrir a porta
      client.println("HTTP/1.1 200 OK"); // Inicia a resposta HTTP com o status 200 (OK)
      client.println("Content-Type: text/html; charset=utf-8"); // Define o tipo de conteúdo como HTML
      client.println(); // Linha em branco indicando o fim dos cabeçalhos

      // Início do documento HTML
      client.println("<!DOCTYPE HTML>");
      client.println("<html>");
      client.println("<head>");
      client.println("<title>Controle de Porta</title>");
      client.println("<link rel='icon' type='image/png' href='https://i.im.ge/2024/04/15/Zota51.download-5.png'>");
      client.println("<style>body { background-color: black; color: white; } #header { display: flex; align-items: center; } #header img { margin-right: 10px; width: 50px; height: auto; } #author { position: absolute; top: 10px; right: 10px; font-size: 10px; }</style>");
      client.println("<script>window.setTimeout(function() { window.close(); }, 3000);</script>"); // Fecha a janela após 3 segundos
      client.println("</head>");
      client.println("<body>");
      client.println("<div id='header'><img src='https://i.im.ge/2024/04/15/Zota51.download-5.png' alt='Logo'>");
      client.println("<h1>Controle de Porta</h1></div>");
      client.println("<p>Porta Aberta</p>"); // Adiciona a mensagem "Porta Aberta"
      client.println("<div id='author'>Autor: Rafael Faleiros</div>"); // Adiciona o texto do autor
      client.println("</body>");
      client.println("</html>");

      // Aguarda antes de desativar o relé e o LED
      delay(2000);
      digitalWrite(relePin, LOW);
      digitalWrite(LED_BUILTIN, LOW);
    } else {
      Serial.println("Tempo atual menor que tempo de acionamento.");

      // Resposta para o cliente se o tempo de acionamento não foi atingido
      client.println("HTTP/1.1 200 OK"); // Inicia a resposta HTTP com o status 200 (OK)
      client.println("Content-Type: text/html; charset=utf-8"); // Define o tipo de conteúdo como HTML
      client.println(); // Linha em branco indicando o fim dos cabeçalhos

      // Início do documento HTML
      client.println("<!DOCTYPE HTML>");
      client.println("<html>");
      client.println("<head>");
      client.println("<title>Controle de Porta</title>");
      client.println("<link rel='icon' type='image/png' href='https://i.im.ge/2024/04/15/Zota51.download-5.png'>");
      client.println("<style>body { background-color: black; color: white; } #header { display: flex; align-items: center; } #header img { margin-right: 10px; width: 50px; height: auto; } #author { position: absolute; top: 10px; right: 10px; font-size: 10px; }</style>");
      client.println("</head>");
      client.println("<body>");
      client.println("<div id='header'><img src='https://i.im.ge/2024/04/15/Zota51.download-5.png' alt='Logo'>");
      client.println("<h1>Controle de Porta</h1></div>");
      client.println("<p>Porta Já Acionada, aguarde...</p>");
      client.println("<div id='author'>Autor: Rafael Faleiros</div>"); // Adiciona o texto do autor
      client.println("<script>window.setTimeout(function() { window.close(); }, 5000);</script>"); // Fecha a janela após 4 segundos
      client.println("</head>");
      client.println("</body>");
      client.println("</html>");
    }
  } else {
    Serial.println("Requisição inválida.");

    // Resposta para requisições inválidas ou para a rota raiz
    client.println("HTTP/1.1 200 OK"); // Inicia a resposta HTTP com o status 200 (OK)
    client.println("Content-Type: text/html; charset=utf-8"); // Define o tipo de conteúdo como HTML
    client.println(); // Linha em branco indicando o fim dos cabeçalhos

    // Início do documento HTML
    client.println("<!DOCTYPE HTML>");
    client.println("<html>");
    client.println("<head>");
    client.println("<title>Controle de Porta</title>");
    client.println("<link rel='icon' type='image/png' href='https://i.im.ge/2024/04/15/Zota51.download-5.png'>");
    client.println("<style>body { background-color: black; color: white; } #header { display: flex; align-items: center; } #header img { margin-right: 10px; width: 50px; height: auto; } #author { position: absolute; top: 10px; right: 10px; font-size: 10px; }</style>");
    client.println("</head>");
    client.println("<body>");
    client.println("<div id='header'><img src='https://i.im.ge/2024/04/15/Zota51.download-5.png' alt='Logo'>");
    client.println("<h1>Controle de Porta</h1></div>");
    client.println("<p>Pressione o botão para abrir a porta:</p>");
    client.println("<form action='/AbrirPorta' method='get'>");
    client.println("<input type='submit' value='Abrir Porta'>");
    client.println("</form>");
    client.println("<div id='author'>Autor: Rafael A. Faleiros</div>");
    client.println("</body>");
    client.println("</html>");
  }

  Serial.println("Fechando conexão com o cliente.");
  client.stop();
}

Ao configurar seu dispositivo para se conectar à rede Wi-Fi, é fundamental ajustar os parâmetros de rede corretamente, considerando as caracteristicas da rede. Dependendo do roteador utilizado, podem ser necessários diferentes valores de endereço IP e gateway.

Para encontrar o endereço correto do gateway da sua rede, você pode usar o comando ipconfig no prompt de comando no seu computador (Windows). Este comando fornecerá uma lista de informações sobre a sua conexão de rede, incluindo o endereço do gateway padrão.

Substitua o endereço Gateway encontrado.

IPAddress gateway(192, 168, 100, 1);

Neste caso não podemos utilizar o protocolo DHCP (Dynamic Host Configuration Protocol). O DCHP atribui automaticamente endereços IP aos dispositivos na rede, o que dificultaria o controle do dispositivo de forma significativa, pois sempre que o dispositivo for reiniciado ele pode receber um endereço IP diferente, para que o projeto possa funcionar corretamente devemos usar um IP estático.

Para localizar um endereço disponível utilize um endereço dentro da faixa do endereço de Gateway, como no exemplo abaixo:

// Definição dos parâmetros de rede
IPAddress ip(192, 168, 100, 54);
IPAddress gateway(192, 168, 100, 1);
IPAddress subnet(255, 255, 255, 0);

Nota: É importante verificar se o IP inserido não está em conflito com outros dispositivos na rede. Para isso, basta abrir o prompt de comando e digitar o comando arp -a. Ele retornará todos os dispositivos conectados em sua rede e quais IPs estão em uso.

Verifique o monitor serial para garantir que o IP foi definido corretamente:

Além de definir corretamente o endereço IP, é necessário definir uma porta para o servidor. No exemplo fornecido, o servidor está inicializado na porta 47. Certifique-se de escolher uma porta que não esteja em uso por outros serviços na rede.

Aqui está um trecho do código que inicializa o servidor na porta 47:

// Inicialização do servidor na porta 47
WiFiServer server(47);

Seguindo essas etapas, você poderá configurar seu dispositivo para se conectar à rede Wi-Fi de forma estável e confiável, utilizando um endereço IP estático e uma porta definida.


Criando o aplicativo para acionamento

Abra o navegador Edge e digite o endereço IP e porta definidos no programa, já com o caminho para abertura da porta. Por exemplo: http://192.168.12.54:47/AbrirPorta

Siga o caminho para instalação do link como arquivo executável.

Personalize com o nome e imagem de sua preferência.

Selecione onde deseja fixar o atalho do aplicativo:

Pronto! Assim que clicar, a porta será aberta e o aplicativo vai fechar automaticamente.


Botando pra rodar

No vídeo abaixo você pode conferir o funcionamento do projeto:

 


Conclusão

Esperamos que tenha entendido o passo a passo para implementação desse projeto. Novos recursos e funcionalidades podem ser desenvolvidos tomando esse tutorial por base, sua imaginação é o limite!


Sobre o autor


Rafael Faleiros

Estudante do ensino médio com formação técnica em eletrônica. Atua como consultor e projetista de sistemas embarcados.


Eletrogate

16 de maio de 2024

A Eletrogate é uma loja virtual de componentes eletrônicos do Brasil e possui diversos produtos relacionados à Arduino, Automação, Robótica e Eletrônica em geral.

Tenha a Metodologia Eletrogate dentro da sua Escola! Conheça nosso Programa de Robótica nas Escolas!

Eletrogate Robô

Assine nossa newsletter e
receba  10% OFF  na sua
primeira compra!