Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* Este sketch aciona o sistema de irrigação
- O sistema é ligado automaticamente a cada tempo calculado por
- numero de segundos / 40 segundos
- Está programado para ligar a cada 86400 segundos (24 Horas) 2160 ciclos de 40 segundos
- O valor é definido para variavel count.
- O sistema fica ligado pelo tempo definido pela variavel Tempo em usegundos.
- A tecla ajuste deine o horario de inicio do ciclo de aguar.
- Sistema rodando a partir de 09/06/2017
- modificado em 17/10/2018
- Salvar ciclo e duração na EEPROM
- Corrigir o problema de manual
- */
- extern "C" // rotina para usar o timer do ESP
- {
- #include "user_interface.h"
- }
- os_timer_t mTimer;
- #include <EEPROM.h> // Biblioteca do EEPROM
- #include <EEPROM.h> // Biblioteca do EEPROM
- #include <NTPClient.h> // Biblioteca do NTP.
- //#include <ESP8266WiFi.h> // Biblioteca do WiFi.
- #include <WiFiUdp.h> // Biblioteca do UDP.
- int countAuto = 1; // Contador de tempo entre ciclos
- int countManual = 1; // Contador de tempo entre ciclos
- int somaMinu = 0; // Contreole de minutos fora da internet
- int horaD = 0; // Hora de ligar
- int minD = 0; // Minuto de ligar
- int acertoHora = 0; // Para acertar hora da internet
- int acertoMin = 0; // Para acertar hora da internet
- int tempo = 2; // Tempo de agua ligada
- long cicloAgua = 2880; // Intervalo entre aguadas
- #include <ESP8266WebServer.h> // Bibioteca para Servidor Web ESP8266
- #include "setting.h" // Minhas credenciais
- ESP8266WebServer server(80); // Instancia server
- String A_1 = "<!DOCTYPE HTML><html><head><meta http-equiv='refresh' content='1;URL=/Controle'/></head><h3><center> Controle de Agua V05</center></h3>";
- String A_2 = "</p></center><h3><BR></h3><html>\r\n";
- String Al = ""; // Agua ligada
- String Ad = ""; // Agua desligada
- String Ail = "";
- String Aid = "";
- String agua; // Seleciona opcao de Agua
- String hora; // Seleciona opcao de Hora
- String minu ; // Seleciona opcao de Min
- String duracao; // Seleciona opcao de Duracao
- String ciclo; // Seleciona opcao de Ciclo
- #define Saida1 2 // GPIO Port para ligar Controle do triac (Pino 2 do MOC3023)
- const int Switch1 = 4; // GPIO Port para ligar o interruptor
- byte Switch1_atual = 0; // Variavel para staus de GPIO (Status do interruptor)
- bool flagAgua = LOW; // Controle de acao manual
- bool salva = LOW; // Controle de salvar programacao na EEPROM
- bool acertei = LOW; // Controle do acerto pela internet
- int salvaDados = 0; // Controle do savamento dos dados na EEPROM
- String horario = ""; // Variavel para horario da internet
- WiFiUDP UDP; // Cria um objeto "UDP".
- const char* NTPServerName = "ntp.br"; // Define o servidor NTP utilizado
- NTPClient timeClient(UDP, "a.st1.ntp.br", -3 * 3600, 60000); // Cria um objeto "NTP" e corrige fuso
- IPAddress timeServerIP;
- //---------------------------
- void tCallback(void *tCall) // Rotina chamada pelo interrupt de timer
- {
- countAuto++; // Incrementa contador de tempo automatico
- countManual++; // Incrementa contador de tempo manual
- salvaDados++; // Incrementa controle salvamento dos dados
- somaMinu++; // Incrementa minutos fora da internet
- }
- //---------------------------
- void usrInit(void) // Rotina de interrupt
- {
- os_timer_disarm(&mTimer);
- os_timer_setfn(&mTimer, tCallback, NULL);
- os_timer_arm(&mTimer, 30000, true); // Interrupt a cada 30.000ms (30 seg)
- }
- //---------------------------------------
- void setup(void)
- {
- EEPROM.begin(100); // Inicia a EEPROM
- EEPROM.get(0, tempo); // Recupera dados da EEPROM
- EEPROM.get(4, cicloAgua);
- usrInit(); // Ativar a interrupcao
- Al += A_1; // Monta tela pra informar que a luz
- Al += "<p><center><a href=\"/Controle?agua=off \"><button style=\"background-color: rgb(255, 0, 0);height: 80px; width: 200px;\"><h2> ON</h2></button></a>";
- Al += "<p><center><a href=\"/Controle?duracao=off \"><button style=\"background-color: rgb(0,255, 0);height: 50px; width: 200px;\"><h2>Duracao-1M</h2></button> </a>";
- Al += "<a href=\"/Controle?duracao=on \"><button style=\"background-color: rgb(0, 0,255);height: 50px; width: 200px;\"><h2>Duracao+1M</h2></button></a>";
- Al += "<p><a href=\"/Controle?ciclo=off \"><button style=\"background-color: rgb(0,255, 0);height: 50px; width: 200px;\"><h2>Ciclo-1H</h2></button> </a>";
- Al += "<a href=\"/Controle?ciclo=on \"><button style=\"background-color: rgb(0, 0,255);height: 50px; width: 200px;\"><h2>Ciclo+1H</h2></button></a>";
- Ad += A_1; // Monta tela pra informar que a luz
- Ad += "<p><center><a href=\"/Controle?agua=on \"><button style=\"background-color: rgb(0, 255, 0);height: 80px; width: 200px;\"><h2> OFF</h2></button></a>";
- Ad += "<p><center><a href=\"/Controle?duracao=off \"><button style=\"background-color: rgb(0,255, 0);height: 50px; width: 200px;\"><h2>Duracao-1M</h2></button> </a>";
- Ad += "<a href=\"/Controle?duracao=on \"><button style=\"background-color: rgb(0, 0,255);height: 50px; width: 200px;\"><h2>Duracao+1M</h2></button></a>";
- Ad += "<p><a href=\"/Controle?ciclo=off \"><button style=\"background-color: rgb(0,255, 0);height: 50px; width: 200px;\"><h2>Ciclo-1H</h2></button> </a>";
- Ad += "<a href=\"/Controle?ciclo=on \"><button style=\"background-color: rgb(0, 0,255);height: 50px; width: 200px;\"><h2>Ciclo+1H</h2></button></a>";
- pinMode(Switch1, INPUT_PULLUP); // Define GPIO5 como entrada e liga o resistor de pullup
- Switch1_atual = digitalRead(Switch1); // Atualisa status de GPIO
- pinMode(Saida1, OUTPUT); // Define GPIO como saida
- digitalWrite(Saida1, LOW); // Liga GPIO
- Serial.begin(115200); // Inicialisa o serial port em 115200
- Serial.println(" ");
- Serial.print("tempo: ");
- Serial.println(tempo);
- Serial.print("cicloAgua: ");
- Serial.println(cicloAgua);
- WiFi.begin(ssid, password); // Conecta wifi
- while (WiFi.status() != WL_CONNECTED)
- {
- delay(250);
- Serial.print('.');
- }
- Serial.println(" ");
- UDP.begin(123); // Inicia protocolo UDP
- if (!WiFi.hostByName(NTPServerName, timeServerIP)) // Conecta no servidor NTP
- {
- Serial.println("DNS lookup failed. Rebooting.");
- Serial.flush();
- ESP.reset();
- }
- Serial.print("IP do servidor NTP:\t");
- Serial.println(timeServerIP);
- timeClient.begin(); // Inicia o NTP.
- timeClient.forceUpdate(); // Forca atualizacao da hora
- Serial.printf("IP DHCP %s, UDP port %d\n", WiFi.localIP().toString().c_str());
- horario = timeClient.getFormattedTime(); // Armazena na váriavel HORA, o horario atual.
- Serial.println(horario);
- WiFi.begin(ssid, password); // Inicialisa o wifi
- IPAddress subnet(255, 255, 255, 0); // Acrescentei para fixar o IP 12/5/2017
- // WiFi.config(IPAddress(192, 168, 0, 27), IPAddress(192, 168, 0, 1), subnet); // Idem Em uso
- WiFi.config(IPAddress(192, 168, 0, 44), IPAddress(192, 168, 0, 1), subnet); // Idem Geste
- Serial.println(""); // Imprime
- while (WiFi.status() != WL_CONNECTED) // Aguarda conexão
- {
- delay(500); // Delay
- Serial.print("."); // Imprime . enquanto não conecta
- }
- Serial.println(""); // Imprime
- Serial.print("Connected to ");
- Serial.println(ssid);
- Serial.print("IP address: ");
- Serial.println(WiFi.localIP());
- server.on("/", []() // Ao requeste
- { server.send(200, "text/html", Al); // Executa o HTML Al (Agua ligada)
- });
- server.on("/Controle", []() // Ao requeste /Agua
- {
- agua = server.arg("agua"); // Recupera o valor do parametro Agua enviado
- hora = server.arg("hora"); // Recupera o valor do parametro Hora enviado
- minu = server.arg("minu"); // Recupera o valor do parametro Min enviado
- duracao = server.arg("duracao"); // Recupera o valor do parametro Duracao enviado
- ciclo = server.arg("ciclo"); // Recupera o valor do parametro Ciclo enviado
- if (agua == "off") digitalWrite(Saida1, LOW); // Se o valor de Agua e off desliga a saida
- if (agua == "on") // Se o valor de Agua e on
- {
- digitalWrite(Saida1, HIGH); // Liga a saida
- countManual = 0; // Zera contador de tempo em maual
- }
- horaD = countAuto / 120; // Atualiza horario
- minD = (countAuto / 2) - (horaD * 60); // Atualiza minutos
- if (countAuto < 0) countAuto = 0; // Se Count for negativo, zera
- if (duracao == "on") // Aumentar duracao
- {
- tempo = tempo + 1; // Se o valor de Duracao e on muda intervalo ligado
- salva = HIGH; // Libera salvar na EEPROM
- salvaDados = 0; // Zera tempo de salvamento
- }
- if (duracao == "off") // Diminuir duracao
- {
- tempo = tempo - 1; // Se o valor de Duracao e off muda intervalo ligado
- salva = HIGH; // Libera salvar na EEPROM
- salvaDados = 0; // Zera tempo de salvamento
- }
- if (tempo < 0) tempo = 0; // Se Tempo for negativo, zera
- if (ciclo == "on") // Aumentar ciclo
- {
- cicloAgua = cicloAgua + 120; // Se o valor de Ciclo e on muda Ciclo de ligar
- salva = HIGH; // Libera salvar na EEPROM
- salvaDados = 0; // Zera tempo de salvamento
- }
- if (ciclo == "off") // Diminuir ciclo
- {
- cicloAgua = cicloAgua - 120; // Se o valor de Ciclo e offn muda Ciclo de ligar
- salva = HIGH; // Libera salvar na EEPROM
- salvaDados = 0; // Zera tempo de salvamento
- }
- if (cicloAgua <= 0) cicloAgua = 2880; // Se CicloAgua for negativo, muda pra 2880 (2880 = 24 H)
- if (cicloAgua > 2880) cicloAgua = 120; // Se CicloAgua for maior que 2880, muda pra 120 (120 = 1 H)
- if (digitalRead(Saida1) == HIGH) // Se a saida esta ligada, carrega a pagina "ligada"
- {
- Ail += Al; // Monta tela nova Agua ligada
- Ail += "<p><h2><center>Hora: " + String(acertoHora) + ":" + String(acertoMin) + " Decorrida: " + String(horaD) + ":" + String(minD) + " </p>";
- Ail += "<p><center>Duracao: " + String((float)tempo / 2) + " Ciclo " + String(cicloAgua / 120) + " </h2></p>";
- Ail += A_2;
- server.send(200, "text/html", Ail); // Mostra Agua ligada
- Ail = ""; // Limpa valor de temperatura e umidade
- }
- if (digitalRead(Saida1) == LOW) // Se a saida esta desligada, carrega a pagina "desligada"
- {
- Aid += Ad; // Monta tela nova Agua desligada
- Aid += "<p><h2><center>Hora: " + String(acertoHora) + ":" + String(acertoMin) + " Decorrida: " + String(horaD) + ":" + String(minD) + " </p>";
- Aid += "<p><center>Duracao: " + String((float)tempo / 2) + " Ciclo " + String(cicloAgua / 120) + " </h2></p>";
- Aid += A_2;
- server.send(200, "text/html", Aid); // Mostra Agua desligada
- Aid = ""; // Limpa valor de temperatura e umidade
- }
- delay(100); // Delay
- });
- server.begin(); // Inicaliza servidor
- Serial.println("HTTP server started"); // Imprime
- calctempo(); // Busca tempo na internet
- }
- //--------------------------------------------------
- void loop(void)
- {
- if (somaMinu >= 2) // Se passou 1 minuto
- {
- acertoMin++; // Incrementa minuto
- somaMinu = 0; // Zera contador de minuto
- }
- if (acertoMin >= 60) // Se passou 1 hoa
- {
- acertoHora++; // Incrementa hora
- acertoMin = 0; // Zera contador de minutoera
- if (acertoHora >= 24) // Se passaram 24 horas
- {
- acertoHora = 0; // Zera hora
- }
- }
- if (acertoHora == 23) // Se está no horario de acertar
- {
- if (acertei == LOW) // Se ainda nao acertou
- {
- acertei = HIGH; // Informa que acertou
- calctempo(); // Acerta
- }
- }
- if (acertoHora == 0) // Se hora incial
- {
- acertei = LOW; // Libera acerto
- }
- server.handleClient(); // Executa instancia
- if (countAuto >= cicloAgua) // Se atingiu o Tempo do ciclo
- {
- digitalWrite(Saida1, HIGH); // Liga agua
- countAuto = 0; // Zera contador de tempo de ciclo
- }
- if (flagAgua == LOW) // Se esta em automatico
- {
- if (countAuto >= tempo) // Se passou o tempo de aguar
- {
- digitalWrite(Saida1, LOW); // Desliga a agua
- }
- }
- if (countManual == 0) // Se manual foi zerado
- {
- digitalWrite(Saida1, HIGH); // Liga agua
- flagAgua = HIGH; // Indica manual mode
- }
- if (flagAgua == HIGH and countManual >= tempo) // Se esta em manual e atingiu contagem amnual
- {
- digitalWrite(Saida1, LOW); // Desliga a agua
- flagAgua = LOW; // Indica automatico
- }
- if (flagAgua == HIGH and agua == "off") // Se esta em manual e foi desligado
- {
- digitalWrite(Saida1, LOW); // Desliga a agua
- flagAgua = LOW; // Indica automatico
- countManual = 50; // Impede novo acionamento maunal
- }
- if (salvaDados >= 1) // Se tempo de salvar passou
- {
- if (salva == HIGH) // Se ainda nao salvou
- {
- calctempo(); // Calcula tempo da intenete
- // EEPROM.put(0, tempo); // Salva
- // EEPROM.put(4, cicloAgua);
- // EEPROM.commit();
- salva = LOW;
- Serial.print("tempo: "); // Imprime
- Serial.println(tempo);
- Serial.print("cicloAgua: ");
- Serial.println(cicloAgua);
- }
- }
- yield(); // Um putosegundo soh pra respirar
- }
- //---------------------------------------------
- void calctempo() // Recalcula tempo da internet
- {
- horario = timeClient.getFormattedTime(); // Obtem horario da internet
- // horario = "22:59:50"; // Debug
- String horaNet = horario.substring(0, 2); // Separa hora de horario
- String minNet = horario.substring(3, 5); // Separa minuto de horario
- acertoHora = horaNet.toInt(); // Transforma string em int
- acertoMin = minNet.toInt(); // Transforma string em int
- int calcAtual = acertoHora * 60 + acertoMin; // Cacula tempo em 1/2 segundos
- int calcCiclo = cicloAgua / 2; // Calcula Ciclos
- int result = 0; // Calculo dos periodos
- Serial.print(" calcAtual :"); Serial.println(calcAtual); // Debug
- Serial.print(" calcCiclo :"); Serial.println(calcCiclo); // Debug
- if (calcAtual >= calcCiclo) // Verifica se horario é maior que ciclo
- {
- result = calcAtual - calcCiclo; // Se for subtri um ciclo
- }
- else
- result = calcAtual; // Se nao for considera tempo decorrido
- Serial.print(" result :"); Serial.println(result); // Debug
- while (result > calcCiclo) // Equanto resultado for maior que ciclo
- {
- result = result - calcCiclo; // Subtrai ciclo de resultado
- Serial.print(" result :"); Serial.println(result); // Debug
- }
- Serial.print(" result :"); Serial.println(result); // Debug
- countAuto = result * 2; // Contador automatico igual ao resultado * 2
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement