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;
- }
- }
- 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