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























5 Comentários
bOM DIA FERNANDO,
ResponderExcluirTERIA 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
Bom dia. No meu caso funcionou por 3 meses, agora o esp fica todo tempo tentando reconectar, e não gera o erro do firebase, sabe me dizer o que pode ser?
ResponderExcluirBoa noite professor, recomendo colocar um "target="_blank" nos links da sua página para que abra em uma nova aba....
ResponderExcluirGrande abraço e seus trabalhos são demais.....
Não funciona, só retorna "Streaming error" no termina
ResponderExcluirA IOT é uma proposta de código aberto a todos, pessoas que fazem publicações incompletas e cheias de erros que forçam os leitores a pagar mensalidades e se associarem a clubes pra obter seus "segredinhos" me deixam bem decepcionado, abram o olho, não percam tempo vendo as postagem desse cidadão que não se digna nem a responder perguntas aos que não lhe contribuem financeiramente, informação é uma dádiva e não uma mercadoria!
ResponderExcluir