banner

IOT mais barata do mundo com ESP8266




Automação utilizando o ESP8266. Hoje quero te apresentar um exemplo de baixo custo utilizando este modelo de microcontrolador com o banco de dados real time Firebase. Vou te mostrar uma montagem, bem como o código fonte do ESP8266.
Eu já tinha adiantado que ia fazer uma automação com o ESP8266 e o APP Fernando K. Não tinha feito isso ainda porque já tinha percebido alguns erros na Lib do Firebase, mas que já consegui identificar. O motivo de eu ter escolhido o ESP8266? É que ele é a maneira mais barata de ligar qualquer coisa ao WiFi.






RECURSOS USADOS

  • NodeMcu ESP8266 ESP-12F
  • Módulo de 4 relés
  • Smartphone
  • 1 Extensão de tomadas
  • 2 Lâmpadas
  • Fios
  • Jumpers







MONTAGEM







PINOUT ESP8266








CÓDIGO

Bibliotecas

FirebaseExtended – Está disponível para download junto com o código fonte https://github.com/FirebaseExtended/firebase-arduino/


Importante: Instale a versão 5.13.1 da biblioteca ArduinoJson








INSTALAÇÃO DA BIBLIOTECA

Os arquivos para download desta aula são a biblioteca FirebaseArduino e o código ESP8266_Firebase.ino.

Mova a pasta da biblioteca para:
C:\Users\[NOME_USUARIO]\Documents\Arduino\libraries

É importante utilizar esta versão da biblioteca disponível para download, outras versões não funcionarão!







CÓDIGO

Fluxograma






CÓDIGO

Declarações e variáveis

// Biblioteca com as funções de WiFi
#include <ESP8266WiFi.h>
// Biblioteca do Firebase
#include <FirebaseArduino.h> // IMPORTANTE: Utilize a versão disponível para download, outras versões não funcionarão.

// Dados da rede WiFi
#define WIFI_SSID "NOME_REDE" // Nome da rede
#define WIFI_PASSWORD "SENHA_REDE" // Senha da rede
// adm: wruphe6a

// URL do firebase
#define FIREBASE_HOST "URL.firebaseio.com"
// Chave de autenticação do firebase
#define FIREBASE_AUTH "XXXXXXXXXXXXXXXXXXXXXXXX"

// Local do firebase onde executaremos os comandos
const String PATH_COMMANDS = "/Commands";

// Pinos dos relés 1, 2 e 3
// D1: GPIO5
// D2: GPIO4
// D3: GPIO0
const int rele1 = D1, rele2 = D2, rele3 = D3;







AUTENTICAÇÃO FIREBASE









Setup


void setup()
{ 
  // Iniciamos a serial com velocidade de 115200 bps (baud)
  Serial.begin(115200);

  // Configuramos os pinos dos relés como saída
  pinMode(rele1, OUTPUT);
  pinMode(rele2, OUTPUT);
  pinMode(rele3, OUTPUT);

  // Iniciamos com os relés desligados
  digitalWrite(rele1, HIGH);
  digitalWrite(rele2, HIGH);
  digitalWrite(rele3, HIGH);

  // Conectamos na rede WiFi
  wifiConnect();  

  // Iniciamos o Firebase
  Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);




  // Iniciamos o stream (monitoramento de eventos do Firebase)
  Firebase.stream(PATH_COMMANDS);   
  
  // Se ocorrou um erro exibimos na serial
  if(Firebase.failed()) 
  {
    Serial.println("streaming error");
    Serial.println(Firebase.error());
  }
  else // Se obteve sucesso exibimos "OK"
    Serial.println("OK");
}


Loop



void loop() 
{  
  // Se o WiFi se desconectou, tentamos reconectar
  if(!WiFi.isConnected())
  {
    Serial.println("Desconectado, reconectando...");
    WiFi.reconnect();
  }

  // Se ocorrou algum erro no streaming 
  if(Firebase.failed()) 
  {
    // Exibimos o erro
    Serial.println("Streaming error");
    Serial.println(Firebase.error());
    // Não executamos nada abaixo até que o streaming volte a funcionar
    return;
  }  





  // Se existem dados disponíveis no stream
  if(Firebase.available()) 
  { 
    String type, event;
    
    // Efetuamos a leitura do evento
    if(!Firebase.readEvent2(&type, &event))
    {
      // Se aconteceu algum erro abortamos os próximos passos
      Serial.println("Erro ao ler evento");
      return;
    }
    
    // Debug...
    Serial.println("Event->"+event);
    Serial.println("Type->"+type);

    // Se for um evento "keep-alive" ignoramos os próximos passos
    // Esta mensagem é enviada pelo Firebase de tempo em tempo automaticamente
    if(event.equalsIgnoreCase("keep-alive") || type == NULL)
    {
      Serial.println("Evento keep-alive [ignorado]");
      return;
    }




    // Se for um evento "put" (envio)
    if(event.equalsIgnoreCase("put"))
    {      
      // path: / ou /Commands -> Local onde o evento ocorreu
      // value: /Rele1, /Rele2... -> Variável que foi atualizada
      String path, value;      

      // Criamos um buffer com 256 bytes
      StaticJsonBuffer<256> jsonBuffer; 
      // Efetuamos um parser no json "type" construindo um objeto json
      JsonObject& obj = jsonBuffer.parseObject(type.c_str());

      // Atribuímos o valor de "path" na nossa variável
      path = obj["path"].asString();

      // Se o path for a raiz significa que é o primeiro envio de mensagem efetuado pelo Firebase após o ESP iniciar
      // Para motivos de sincronização
      if(path == "/")
      { 
        // Enviamos os dados para nossa função de sincronização
        syncFirebase(obj["data"]);
      }




      else // Se o path não for a raiz
      {
        // Obtemos o valor e atribuímos para nossa variável
        value = obj["data"].asString();
        // Enviamos o path (caminho) e a variável para a função que executará os respectivos comandos
        executeCommand(path, value);
      }    
    }
    // Limpamos os buffers
    type = event = "";
  }     
}



syncFirebase


// Função que sincroniza os relés com os dados atuais do Firebase
// Ou seja, ativa ou desativa os relés de acordo com os valores "ON/OFF" que estão no Firebase
void syncFirebase(JsonObject& valores)
{ 
  // Debug...
  Serial.println("[syncFirebase]");
  Serial.println(valores["Rele1"].asString());
  Serial.println(valores["Rele2"].asString());
  Serial.println(valores["Rele3"].asString());

  // Ativamos ou desativamos o respectivo relé com seu respectivo valor
  // Relé 1
  String(valores["Rele1"].asString()).equalsIgnoreCase("ON") ? digitalWrite(rele1, LOW) : digitalWrite(rele1, HIGH);
  // Relé 2
  String(valores["Rele2"].asString()).equalsIgnoreCase("ON") ? digitalWrite(rele2, LOW) : digitalWrite(rele2, HIGH);
  // Relé 3
  String(valores["Rele3"].asString()).equalsIgnoreCase("ON") ? digitalWrite(rele3, LOW) : digitalWrite(rele3, HIGH);
}



executeCommand


// Função que executa comandos (ativar ou desativar relé)
// cmd: /Rele1, /Rele2 ou /Rele3
// valor: ON ou OFF
void executeCommand(String cmd, String valor)
{
  // Debug...
  Serial.println("[executeCommand] path: "+cmd);
  Serial.println("[executeCommand] valor: "+valor);

  // Ativamos ou desativamos o respectivo relé com seu respectivo valor
  // Relé 1
  if(cmd.equalsIgnoreCase("/RELE1"))
    valor.equalsIgnoreCase("ON") ? digitalWrite(rele1, LOW) : digitalWrite(rele1, HIGH);
  else // Relé 2
  if(cmd.equalsIgnoreCase("/RELE2"))
    valor.equalsIgnoreCase("ON") ? digitalWrite(rele2, LOW) : digitalWrite(rele2, HIGH);
  else // Relé 3
  if(cmd.equalsIgnoreCase("/RELE3"))
    valor.equalsIgnoreCase("ON") ? digitalWrite(rele3, LOW) : digitalWrite(rele3, HIGH);
}





WifiConnect


// Função que conecta o WiFi utilizando os dados de ssid e senha informados anteriormente
void wifiConnect()
{
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);             
  
  Serial.print("Conectando WiFi");

  while(WiFi.status() != WL_CONNECTED)
  { 
    Serial.print(".");                                      
    delay(1000);    
  }
  Serial.println('\nConectado');  
}











FAÇA O DOWNLOAD DOS ARQUIVOS




Um comentário:

  1. bOM DIA FERNANDO,
    TERIA COMO VC ACRESCENTAR UM SENSOR DE TEMPERATURA NESSE PROJETO, PODERIA EXPLICAR COMO.
    PENSEI NAQUELE SENSOR QUE VC JÁ USPU ANTES O

    Módulo Sensor Temperatura Infra Gy-906 Mlx90614

    SOU MEMBRO DO CANAL E ME AJUDARIA MUITO, POIS JÁ TENTEI E ESTOU APANHANDO KKKK

    VALEU

    ResponderExcluir

Tecnologia do Blogger.