terça-feira, março 17, 2020

Sonoff Basic: Transformando num Timer Controlado via Browser

No meu último post sobre o Sonoff Basic transformei o coitado num pisca-pisca, trocando o firmware de fábrica pelo exemplo Blink do Arduino. Neste post vou transformá-lo em algo mais útil: um timer que você programa através de um browser (de dentro da sua rede local).


O Timer

A parte de timer do meu projeto é bastante simples: ligar e desligar o relê conforme a hora atual:
boolean dentro;
    time_t horaAtual = sntp.time() % (24L*60L*60L);
    if (horaDesliga > horaLiga) {
      dentro = (horaAtual > horaLiga) &&
               (horaAtual < horaDesliga);
    } else {
      dentro = (horaAtual > horaLiga) ||
               (horaAtual < horaDesliga);
    }
    if (ligado && !dentro) {
      digitalWrite (sonoff_RELE, LOW);
      ligado = false;
    } else if (!ligado && dentro) {
      digitalWrite (sonoff_RELE, HIGH);
      ligado = true;
    }
  }
Esta rotina utiliza quatro variáveis:
  • ligado: que indica se o relê está ligado
  • horaLiga: que é a hora (em segundos) que o relê deve ser ligado
  • horaDesliga: que é a hora (em segundos) que o relê deve ser desligado
  • horaAtual: que é a hora atual (em segundos)
É preciso tomar o cuidado de distinguir o caso em que liga às 7:00 e desliga às 19:00 (por exemplo) do caso em que liga às 19:00 e desliga às 7:00. Num caso o horário de ficar ligado está entre os dois horários e no outro está antes e depois dos horários.

A horaAtual é obtida da internet, usando o código de SNTP do meu projeto de contagem regressiva.

O Servidor Web

Vamos desmitificar um pouco o que é um servidor web. Ele nada mais é que um programa que aceita conexões TCP na porta 80 e troca mensagens (linhas de texto) com um browser. A definição das mensagens consiste no HyperText Transfer Protocol (HTTP). Sites e aplicações web são normalmente construídas sobre várias camadas que criam abstrações de alto nível sobre isto. No caso do ESP8266 temos a biblioteca ESP8266WebServer que é uma camada bastante fina, mas suficiente para nossa aplicação.

Ao acessar o o endereço IP do nosso Sonoff,  mostra se o relê está ligado e as horas programadas. Parâmetros 'liga' e 'desliga' na requisição permitirão alterar as horas programadas. Por exemplo, sendo 192.168.0.222 o endereço IP do nosso Sonoff, e digitando na linha de endereço do browser:
  • "http://192.168.0.222":  mostra se o relê está ligado e as horas programadas
  • "http://192.168.0.222/?liga=8:00&desliga=10:00" altera a hora de ligar para 8:00 e a hora de desligar para 10:00
O código (simplificado) para fazer isto é o seguinte:
ESP8266WebServer webserver(80);

  // Inicia webserver no setup()
  webserver.on("/", trataCliente);
  webserver.begin();

  // Trata o cliente em loop()
  if (WiFi.status() == WL_CONNECTED) {
    webserver.handleClient();
  }

// Trata uma conexão ao servidor web
void trataCliente() {
  // Trata parametros
  for (int i = 0; i < webserver.args(); i++) {
    if (strcmp(webserver.argName(i).c_str(), "liga") == 0) {
      horaLiga = parseHora(webserver.arg(i).c_str());
    } else if (strcmp(webserver.argName(i).c_str(), "desliga") == 0) {
      horaDesliga = parseHora(webserver.arg(i).c_str());
    }
  }
  // monta e envia uma página html
  String pagina;
  // ...
  webserver.send(200, "text/html", pagina);
}

Conectando ao WiFi

Vamos usar um endereço fixo para o Sonoff na nossa rede local. Tome cuidado de escolher um endereço que não esteja sendo usado por outro equipamento e fora da região usada para DHCP. O código para isto fica assim:
// Configurações do WiFi
char *ssid = "DQuadros";
char *passwd = "*****";
IPAddress ipserver = IPAddress(192,168,15,201);
IPAddress netmask = IPAddress(255,255,255,0);
IPAddress gateway = IPAddress(192,168,15,1);
IPAddress dns = IPAddress(192,168,15,1);

  // Conecta a rede WiFi
  WiFi.mode (WIFI_STA);
  WiFi.begin (ssid, passwd);
  WiFi.config(ipserver, dns, gateway, netmask);
  while (WiFi.status() != WL_CONNECTED) {
    delay(100);
  }

O Código Completo

Eu coloquei acima somente as partes mais interessantes. O código completo pode ser baixado do github em https://github.com/dquadros/SonoffTimer

Nenhum comentário: