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:
  1. boolean dentro;  
  2.     time_t horaAtual = sntp.time() % (24L*60L*60L);  
  3.     if (horaDesliga > horaLiga) {  
  4.       dentro = (horaAtual > horaLiga) &&  
  5.                (horaAtual < horaDesliga);  
  6.     } else {  
  7.       dentro = (horaAtual > horaLiga) ||  
  8.                (horaAtual < horaDesliga);  
  9.     }  
  10.     if (ligado && !dentro) {  
  11.       digitalWrite (sonoff_RELE, LOW);  
  12.       ligado = false;  
  13.     } else if (!ligado && dentro) {  
  14.       digitalWrite (sonoff_RELE, HIGH);  
  15.       ligado = true;  
  16.     }  
  17.   }  
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:
  1. ESP8266WebServer webserver(80);  
  2.   
  3.   // Inicia webserver no setup()  
  4.   webserver.on("/", trataCliente);  
  5.   webserver.begin();  
  6.   
  7.   // Trata o cliente em loop()  
  8.   if (WiFi.status() == WL_CONNECTED) {  
  9.     webserver.handleClient();  
  10.   }  
  11.   
  12. // Trata uma conexão ao servidor web  
  13. void trataCliente() {  
  14.   // Trata parametros  
  15.   for (int i = 0; i < webserver.args(); i++) {  
  16.     if (strcmp(webserver.argName(i).c_str(), "liga") == 0) {  
  17.       horaLiga = parseHora(webserver.arg(i).c_str());  
  18.     } else if (strcmp(webserver.argName(i).c_str(), "desliga") == 0) {  
  19.       horaDesliga = parseHora(webserver.arg(i).c_str());  
  20.     }  
  21.   }  
  22.   // monta e envia uma página html  
  23.   String pagina;  
  24.   // ...  
  25.   webserver.send(200, "text/html", pagina);  
  26. }  

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:
  1. // Configurações do WiFi  
  2. char *ssid = "DQuadros";  
  3. char *passwd = "*****";  
  4. IPAddress ipserver = IPAddress(192,168,15,201);  
  5. IPAddress netmask = IPAddress(255,255,255,0);  
  6. IPAddress gateway = IPAddress(192,168,15,1);  
  7. IPAddress dns = IPAddress(192,168,15,1);  
  8.   
  9.   // Conecta a rede WiFi  
  10.   WiFi.mode (WIFI_STA);  
  11.   WiFi.begin (ssid, passwd);  
  12.   WiFi.config(ipserver, dns, gateway, netmask);  
  13.   while (WiFi.status() != WL_CONNECTED) {  
  14.     delay(100);  
  15.   }  

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: