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.
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:
Postar um comentário