quinta-feira, 19 de janeiro de 2017

Protocolo mqtt.Ascenda reles ou leds de qualquer lugar do mundo com Blynk

Saudações povo que acompanha o meu blog, hoje eu posto a vocês um belissímo tutorial, que é usando o protocolo mqtt, vulgo IOT (if of things ou mais precisamente, internet das coisas) para fazer seus acionamentos e ler seus gráficos baseados em sensores.

Como posts sobre web servers tem aos rodos, irei fazer algo meio inédito ainda, posts sobre  Iots.

Antes de tudo vamos nos situar, o que é um broquer?

Bem broquer é um serviço que pode ser tanto executado pela "nuvem" quanto pelos embarcados de sua residencia, mas no post de hoje irei fazer a execução pela nuvem.

A groço modo o serviço de mqtt é um "carteiro" onde seu embarcado se conecta pela nuvem e fica "vendo" de tempos em tempos se tem alguma requisição, se tem "carta" pra ele. Voce se conecta a nuvem também de onde estiver e manda a tal "carta, e dependendo do conteúdo da carta, o embarcado faz seu desejo, seria algo mais ou menos como a imagem a seguir:



 Basicamente com este serviço voce manda uma "carta" para a nuvem mandando acender o led, a nuvem manda pro embarcado e o embarcado acende o led :)
E é o que faremos neste tutorial
Existem vários serviços de broquers disponíveis, uns gratuítos, outros pagos, o que vou utilizar é um gratuíto, disponibilizado pela empresa Blynk
 E mais um embarcado, o nodemcu:


A documentação dele voce pode acompanhar no seu própio site aqui

Baixe o aplicativo Blynk na play store no seu celular

Depois instale e faça o cadastro, ira te pedir emails e blabla e voce confirma.
Quando terminar de se registrar esta na hora de criar o projeto, no celular clique na caixa verde:

Depois escolha um nome e embaixo escolha o seu embarcado, entre as opções tem esp8266 e nodemcu, se voce estiver usando o nodemcu*como eu*escolha o nodemcu
No canto superior esquerdo do seu cel tem um desenho de uma porca sextavada, clique nela e será aberta esta tela:
clique em send email e no seu email aparecera o token:

voce pode usar ele neste código primário:
---------------------------------
#define BLYNK_PRINT Serial    // Comment this out to disable prints and save space
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>

// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
char auth[] = "5d454bdd4e7d4835907dc7a7fffe3320";//Seu token obtido pelo blynk

// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "Seu login";
char pass[] = "sua senha";

void setup()
{
  Serial.begin(9600);
  Blynk.begin(auth, ssid, pass);
}

void loop()
{
  Blynk.run();
}
-----------------------------------
Mas para facilitar ainda mais a vida de voces eu criei uma página Web quevoce pode colocar o seu 
token numa caixa de texto e dar o enter :)
 
 
Veja as scans da pagina antes deu colocar o código
 
  

e agora, o código:
----------------------
#include <EEPROM.h>
#include <ESP8266WebServer.h>
#define BLYNK_PRINT Serial    // Comment this out to disable prints and save space
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>

// ID de Configuração

int posicao=0;
int botaoreset=D0;
int led=D4;
// Estrutura de configuração da EEPROM


ESP8266WebServer server(80);


 



void configWifi()
{
String token="";
int i=0;


char valor=char(EEPROM.read(i));
while(valor!='\0'){
  valor=char(EEPROM.read(i));
   token +=valor;
  i++;
 
}


 
String taken="";
  String html = "<html><head><title>Configurar o token</title><center>";
  html += "<meta charset='UTF-8' language='pt-br'><style type='text/css' media='all'>";
html += "body{background-color:#527F76;color:#FFFF99;font-family:Verdana,'Times New Roman',Arial;font-size:15px;}";
html +=".btn{background-color:#2F2F4F;color:#E6E8FA;font-family:,'Times New Roman',Arial,Verdana;font-size:20px;}</style>";
    html += "</head><body>";
  html += "<h1>Eletronica e utilidades, uso do protocolo mqtt</h1>";
  html += "<form method=POST>";
  html += "<p>token: <input name=txttoken type=text value=\"";
 
 
  html += "\" /></p>";
  html+="<br><br><H1>Valor do token</h1>";

   html+="<br><br>";
  html +=(token);

  html+="<br><br>";

html += "<p>Clique em enviar</p>";
   html += "<p><input name=button1 class='btn' type=submit value=Enviar /></p></form>";
  html += "</body></center></html>";

  server.send(200, "text/html", html);
}

void configWifiSubmit()
{byte contador=0;
  char token[50]="";
  String html = "<html><head><title>Configurar o token submit</title><center>";
  html += "<meta charset='UTF-8' language='pt-br'><style type='text/css' media='all'>";
html += "body{background-color:#527F76;color:#FFFF99;font-family:Verdana,'Times New Roman',Arial;font-size:15px;}";
html +="input{background-color:#2F2F4F;color:#E6E8FA;font-family:,'Times New Roman',Arial,Verdana;font-size:20px;}</style>";

   html += "</head><body>";
  html += "<h1>configuração do token </h1>";

  html += "<p>Dados gravados com sucesso!</p>";

 String taken = server.arg("txttoken");
 taken.toCharArray(token,50);
  for(int i=0;i<sizeof(token);i++){
    contador=i;
    EEPROM.write(i,token[i]);
   
  }



  EEPROM.commit();
 
 
 
  html += "<p>token: <b>";
  html += token;
  html+= contador;
   html += "<form method=GET>";
  html += "<p><input name=button2 type=submit value=Voltar /></p></form>";
  html += "</body></center></html>";
 
  server.send(200, "text/html", html);


  ESP.restart();
}

void setup()
{
 

pinMode(botaoreset,INPUT);
pinMode(led,OUTPUT);

  // Iniciando Serial
  Serial.begin(9600);

  // Iniciando EEPROM
  EEPROM.begin(512);
  String token="";
char taken[50]="";
int i=0;

char valor=char(EEPROM.read(i));
while(valor!='\0'){
  valor=char(EEPROM.read(i));
   token +=valor;
  i++;
 
}

 

token.toCharArray(taken,50);
 
  if(digitalRead(botaoreset)==HIGH){
    digitalWrite(led,LOW);
 WiFi.begin("Seu login wifi", "sua senha wifi");
  IPAddress subnet(255, 255, 255, 0);
  WiFi.config(IPAddress(192,168,0,135),
  IPAddress(192,168,0,1), subnet);
 
  // Aguardando conectar na rede
  Serial.println("");
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print('.');
  }
  }
  if(digitalRead(botaoreset)==LOW){
 digitalWrite(led,HIGH);
 digitalWrite(led,HIGH);
Blynk.begin(taken, "Seu login wifi","sua senha wifi");

   
  }


 
  Serial.println("");
  Serial.print("Connected to ");
 
  Serial.print("sua rede ");
  Serial.println(WiFi.localIP());
 
  // Atribuindo urls para funções
  // Quando não especificado método, uma função trata todos

  // Chamada dos métodos de configuração
  server.on("/", HTTP_GET, configWifi);
  server.on("/", HTTP_POST, configWifiSubmit);
 
  // Iniciando servidor
  server.begin();
 
  // Apenas informando que servidor iniciou
  Serial.println("HTTP server started");
}

void loop()
{
  // No loop só precisa dessa função
  server.handleClient();
  if(digitalRead(botaoreset)==LOW){
   Blynk.run();
  }

}
-----------------
1° As explicações. Esse código opera de duas formas diferentes:
Com o web server ligado e com o protocolo mqtt ligado.
1° voce deverá ligado nas configurações do webserver, para isso pegue o pino D0 e ligue ele ao positivo por meio de um resistor de 10k conforme uma das imagens em anexo,só depois que você liga o aparelho na fonte.

Se fizer isso a luz azul dele irá ascender, denotando que ele está configurado como Webserver, nesse caso basta voce digitar o ip:192.168.0.135 que voce entrará na pagina de configuração do token, e lá no token digite o token que voce recebeu por email "melhor, dê control+c e control+v kkkkkkkkkkkkkkk".
 
Pronto, os dados foram gravados. Agora desligue o seu node e desfaça a gambiarra no pino 0,depois ligue o pino d0 direto no terra, depois volte a ligar o nodemcu .Assim o node entrará em modo "mqtt" e se conectará ao blynk server, e pronto, voce pode acionar leds, relays, de qualquer lugar do mundo :)
 
Pronto pessoal, e em breve o vídeo, espero que tenham gostado o/

Nenhum comentário: