terça-feira, 9 de janeiro de 2018

Implementando um temporizador WIFI, com o NodeMcu.

Olá, hoje resolvi demonstrar como gravar o NodeMcu pela interface do arduino, para isto criei um servidor web que mantém um um led aceso conforme um tempo configurado na pagina web que está rodando dentro do próprio modulo, veja que do mesmo modo que é gravado o modulo ESP8266 também é gravado o NodeMcu(o que muda é fisicamente,pois o NodeMcu já vem com todo o hardware necessário para seu funcionamento o que reduz custos e facilita a montagem, principalmente para leigos em eletrônica ),veja que o tempo não é muito preciso pois usa delay de rotinas.
       Este é só o começo da serie de projetos que virão a partir do NodeMcu, em breve postarei novos códigos com mais recursos,por hora fiquem com este exemplo.

O código fonte:

#include <dummy.h>
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>//caso use o modo servidor
#include "FS.h"
WiFiServer server(80);//usa porta 80
const int  LED_STATUS = 2; // led de status(estou usando o led que já vem no modulo esp. 
const int  ANALOGICA = A0; // porta analogica

//////////////reles/////////////////////////////
const int RELE1 = 5; // neste exemplo vou usar apenas o rele 1
const int RELE2 = 4;
const int RELE3 = 10;
const int RELE4 = 15;

int tempo_pisca_led=500;
long liga_timer=0;
int tempo = 1;//padrão 1s

///////////////////////////////////////////////////////////////////
//////////configurações principais
///////////////////////////////////////////////////////////////////
void setup() 
{
  Serial.begin(115200);
  conf_pinos();  
  setupWiFi();
}
/////////////////////////////////////////////////////////////////////
///rotina prinicpal
/////////////////////////////////////////////////////////////////////
void loop() 
{
  rot_geral();
 // checa se tem algum dispositivo conectado!
  WiFiClient client = server.available();
  if (!client) 
  {return;}

  // Lê a primeir linha dos dados recebidos pelo pacote ethernet
  String req = client.readStringUntil('\r');
  client.flush(); //limpa buffer de recepção
  Serial.println("recebeu pag.");
  // prepara pagina ethenet
  String buf = "";//cria uma string para colocar a pagina web
  //vai adicionando linhas a string criada
  buf += "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\n";
  buf += "<h1> Servidor Web com ESP8266 </h1>";
  buf += "<h3> Temporizador - configure um tempo de 00 a 60 segundos.</h3>";
  buf += "<h3> coloque os numero no formato XX(por exemplo 1 = 01..</h3>";
  buf += "<h3><p>Iniciar: <a href=\"?b1_on\"><button>ON</button></a> <a href=\"?b1_off\"><button>OFF</button></a></p><br></h3>"; 
  buf += "<form><h3>Segundos: <input type=text name=\"tempo\"\"value=\"mm\"size=3 maxlength=2></h3>";  
  buf += "<h3><input type=\"submit\"  value=\"Configurar. \"></h3>"; 
  buf += "</form><marquee direction=\"right\"> Microcontroladores-c - Temporizador Web </marquee></html>\n";
  client.print(buf);//envia os dados pela wifi
  client.flush();  
  ///avalia o retorno da pagina HTTP
  if (req.indexOf("b1_on") != -1)
    {
      liga_timer=tempo*5;//pois como o pisca é mais rapido e leva 200 ms por incremento deve multiplicar por 5
      Serial.println("Acionou timer tempo:");
      Serial.print(liga_timer,DEC);
    }
  if (req.indexOf("b1_off") != -1)
    {
      liga_timer=0;
      digitalWrite(RELE1, LOW);
      Serial.println("rele desligado!");
    }  
  if(req.indexOf("tempo=") != -1)
  {
    int pos = req.lastIndexOf("tempo=");
    Serial.println("tempo");
    Serial.print('=');
    Serial.print(req[pos+6]);
    Serial.print(req[pos+7]);    
    if((char_to_int(req[pos+6]))*10 + char_to_int(req[pos+7])<61) 
    { tempo = (char_to_int(req[pos+6]))*10 + char_to_int(req[pos+7]) ; 
      Serial.println("foi gravado :");    
      Serial.print(tempo,DEC);
    } //se tempo menor que 60 atualiza valor   
  } 
  //cliente desconectado
  // a cada requisição a pagina é enviada e o cliente é desconectado
}   
 
unsigned int char_to_int(char val)
 {
    int valor =0;
    if((val>47)||(val<58))
    {
      valor = val-48;
    }    
    return(valor);
 }
 
void rot_geral()
{
      if(liga_timer>0)
      {          
          liga_timer--;
          if(liga_timer == 0)
          {
            // fim do tempo
            digitalWrite(RELE1, LOW);
            Serial.println("rele desligado!");
          }
          else
          {
            digitalWrite(RELE1, HIGH);// liga rele 
          }
          digitalWrite(LED_STATUS,HIGH);      
          delay(100);
          digitalWrite(LED_STATUS,LOW);
          delay(100);
      }
      else
      {
          digitalWrite(LED_STATUS,HIGH);      
          delay(tempo_pisca_led);
          digitalWrite(LED_STATUS,LOW);
          delay(tempo_pisca_led);
      }
     return;
}

 
  ////////////////////////////////////////////////////////////////////
//configura os pinos
////////////////////////////////////////////////////////////////////
void conf_pinos()
{  
  pinMode(9, INPUT);//sempre será entrada
  pinMode(LED_STATUS, OUTPUT);
  digitalWrite(LED_STATUS, LOW);
  pinMode(RELE1, OUTPUT);
  digitalWrite(RELE1, LOW);
  pinMode(RELE2, OUTPUT);
  digitalWrite(RELE2, LOW);
  pinMode(RELE3, OUTPUT);
  digitalWrite(RELE3, LOW);
  pinMode(RELE4, OUTPUT);
  digitalWrite(RELE4, LOW);
   return;
}

/////////////////////////////////////////////////////////////////////////
// Parâmetros da WiFi  //
////////////////////////////////////////////////////////////////////////
void setupWiFi()
{
    //////////////////////
    // definições da WiFi  //
    //////////////////////
  const char* WiFi_Senha = "123456789";//senha que você quer usar(deve ser em branco(aberta) ou maior que 8 caráteres,senão não funciona e não troca o nome da wifi)
  const char*  WiFi_Nome = "Microcontroladores-c";//nome que você quer dar a sua rede 
  IPAddress ip(192,168,50,4);//ok
  IPAddress gateway(192,168,50,1);//ok
  IPAddress subnet(255,255,255,0);//ok
  //////inicializa a wifi//////////////////////////////////////////////    
  uint8_t mac[WL_MAC_ADDR_LENGTH];
  WiFi.softAPmacAddress(mac);//mac qualquer pra testar
  WiFi.softAPConfig(ip, gateway, subnet);
  WiFi.softAP(WiFi_Nome, WiFi_Senha); 
 // WiFi.mode(WIFI_AP);//modo acess point(cliente)   
   WiFi.mode(WIFI_AP_STA);//modo acess point e servidor  
   WiFi.begin();  
   server.begin();   
}

A demonstração do código funcionando pode ser visto no vídeo abaixo :

Até a próxima!