domingo, 23 de setembro de 2018

Sistema de Irrigação Doméstica Utilizando Netduino - Parte 3

Continuando o projeto do sistema de irrigação para o jardim chegamos na fase de realizar alguns testes para definir a estratégia de configuração da lógica, especialmente no que se trata da lógica liga a iluminação do sol.



Os horários mais propícios para irrigação são: ao final do dia e no inicio da manhã quando o sol ainda não está tão quente. No Rio de Janeiro não é diferente, irrigar as plantas ao sol do meio dia pode ser um grande erro e acabar por acabar com a minha horta e todo o meu jardim.

Pensando assim é fundamental determinar algumas situações:

1. Determinar o melhor horário para realizar a irrigação;
2. Determinar se é necessário realizar a irrigação;
3. Por quanto tempo realizar a irrigação;

Peguei muitas dicas sobre a horta no site: http://comofazerumahorta.com.br/irrigacao/

Essas três perguntas devem ser respondidas em um código implementado, seguindo vou detalhar cada uma e as experiências que fiz para determinar o processo lógico de controle.



Determinado o horário de irrigação

O horário de irrigação é composto por duas variáveis: sol + calor, o primeiro passo é determinar o sol, exatamente o momento em que o sol se põe, para isso utilizaremos um sensor LDR, este sensor eu conectei com um divisor resistivo e estudei o comportamento da exposição do sensor ao sol durante alguns dias amostrando em 30 segundos e salvando no cartão microSD

A análise não é muito complexa, note que as variações são grandes e regulares, devido a Lua é possível que nos ciclos de 20 em 20 dias o valor minimo e máximo tenham variações, Os parâmetros são 0,25 pu e 0,75 pu. em uma janela de 1 a 2 horas deve ter uma variação estável de um inicial superior a 0,75 pu para um valor válido menor que 0,25 em uma sequência estável de queda contínua.


Determinando o momento exato da troca de que se considera dia e de quando se estabelece a noite podemos montar um schmitt trigger completo. Como esse é um código reaproveitável resolvi fazer um biblioteca com uma lógica em C# específica para tratar os sensores analógicos como um comparador de banda schmitt trigger.

using System;
using System.Threading;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;


namespace Customization.Analog
{

    public class SchmittTrigger
    {
        public Microsoft.SPOT.Hardware.AnalogInput _AnalogInputPin;

        public double _OnValue;
        public double _OffValue;
        public int CycleOn;
        public int CycleOff;

        public int CountOn;
        public int CountOff;

        public SchmittTrigger(Microsoft.SPOT.Hardware.AnalogInput AnalogInputPin, double OnValue, int TimeOn, double OffValue, int TimeOff, int InterruptTime = 1)
        {
            _AnalogInputPin = AnalogInputPin;
            
            _OnValue = OnValue;
            _OffValue = OffValue;

            CycleOn = TimeOn / InterruptTime;
            CycleOff = TimeOff / InterruptTime;


        }

        public void ProcessAnalogSignal(object o)
        {
           double value = _AnalogInputPin.Read();

           if (value >= _OnValue)
           {
               CountOn++;
               CountOff = 0;
           }
           else if (value <= _OffValue)
           {
               CountOff++;
               CountOn = 0;
           }
           else
           {
               CountOn = 0;
               CountOff = 0;
           }

           if (CountOn > CycleOn)
           {
               On = true;
               Off = false;

               CountOn--;
               return;
           }

           if (CountOff > CycleOff)
           {
               Off = true;
               On = false;

               CountOff--;
               return;
           }

           On = false;
           Off = false;
        }
        public bool On = false;

        public bool Off = false;  
    }
}

Notadamente a classe é bem simples, na declaração associasse o canal A/D, os patamares de ativação e desativação e os ciclos de ativação e desativação.

Para função funcionar corretamente periodicamente  deve-se chamar a função ProcessAnalogSignal(). Essa função faz a leitura do A/D e a contagem dos ciclos para resumir a ativação e a desativação do sinal.

O que é interessante é que através dessa função é possível sintetizar toda a complexidade de um sinal analógico em um sinal digital que identifica se há luz ou não.

myGardenLdr = new Customization.Analog.SchmittTriggerInv(AnalogLDR, 0.7, 6, 0.2, 6);

Então, para ler o sensor LDR fiz uma função invertida em que o valor é lido em p.u. do valor absoluto do A/D. Se maior que 0.7 durante 6 ciclos é considerado "Ligado", o sensor está iluminado e é dia, o valor permanece assim até que o sensor atinga um valor inferior a 0.2 durante 6 cilos onde se concluí que é noite.

Estabelecido o processo de leitura do sensor trata-se do método de irrigação.

Método de Irrigação

O método pelo qual vai ser realizada a ativação da saída é o modos operante do sistema de irrigação. Pelos estudos e pelas experiências o melhor efeito é quando a irrigação é feita pelo menos uma vez por dia e no inicio da manhã. A irrigação no fim da tarde e a noite não tem um efeito desejado principalmente porque as plantas passam por um período de stress hídrico durante o dia e a noite, onde não é feita fotossíntese, a planta recebe água o que favorece a proliferação de pulgões, cochonilhas e fungos no geral. 

Por esse motivo a marcação de dia é tão importante, o objetivo principal é irrigar pela manhã com um volume de água suficiente para infiltrar até as raízes das plantas sem causar encharcamento do solo.  Fiz muitas experiências de tempo de irrigação e cheguei a conclusão que 20 minutos é suficiente para os meus vasos de plantas.

Depois de algumas semanas de teste observei que pela metade da tarde, devido ao sol intenso  o solo acabava sendo seco e isso prejudicava muito o desenvolvimento das plantas. 

Estudo mais afundo o tema, concluí que o ideal é que ocorra regas constantes principalmente nos dias com exposição mais intensa ao sol. nestes casos pequenas regas que mantenham o solo superficialmente úmido preservando a temperatura da terra nos vasos. No geral, o ideal é que a planta tenha exposição plena ao sol na sua fase de maturação e que tenha água em quantidade tal que a terra sempre fique levemente úmida.

Por outro lado, nos dias em que ocorre chuva a chuva pode estar associada ao clima mais frio mas não diretamente ligada a exposição ao sol.

Solução

A solução para conseguir ter resultados mais satisfatórios foi incluir um sensor de temperatura nessa mesma filosofia do LDR com um schmitt trigger. Então, incluí um PT100 dentro da própria caixa do sensor.

Tive que observar algumas semanas de operação para verificar a que nível chegavam as temperaturas num dia quente em um dia frio a fim de estabelecer um critério de ativação de dois modos de irrigação ao longo do dia.

A ideia é que para um dia normal ocorra irrigação de duas em duas horas após a inicialização do sistema, irrigação de 20 minutos, ocorra irrigações de 7 minutos afim de manter o solo úmido.

Para fazer essas ativações baseadas em tempo resolvi criar algumas funções de contagem de tempo em ciclos chamas de TON - Time do go On e TP - Time Pulse. Com essas funções fica bem mais fácil na lógica final de ativação.

--------------------------------------------------------------------------------------------------------------------
CÓDIGO COMPLETO - Download