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