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