Sensor de umidade do solo com Arduino – Higrômetro
Neste tutorial daremos o primeiro passo para desenvolver um sistema inteligente voltado para o monitoramento e controle das variáveis existentes em uma plantação. Começaremos aprendendo como usar o sensor de umidade do solo, também chamado de Higrômetro, em conjunto com um Arduino Nano.
[toc]
Sistemas automáticos na Agricultura
Plantas precisam de um solo de boa qualidade para crescerem de forma saudável e com qualidade, porém, existem vários tipos de situações ambientais que dificultam o seu crescimento, sendo algumas delas:
- Irradiação solar excessiva;
- Falta de nutrientes no solo;
- Solo com baixa umidade;
- Pragas;
- Entre outros.
Todas as situações descritas anteriormente podem gerar prejuízo. Por este motivo, faz-se necessária a utilização de, sistemas automáticos os quais vêm sendo cada vez mais explorados que auxiliem o agricultor no monitoramento de seus cultivos visando obter uma eficiência cada vez maior e consequentemente a redução da ocorrência de situações indesejadas
Sensor umidade do solo – Higrômetro
Neste tutorial, iremos utilizar o sensor de umidade do solo, para aferir a condutividade do solo através de uma haste com dois eletrodos existentes no mesmo. O princípio de funcionamento deste circuito é bem simples, pois, resume-se ao fato de que, através da aplicação de uma determinada corrente X nos eletrodos citados, é possível estimar o quão úmido ou seco o solo estará em virtude da condutividade do solo em ambos os casos. Basicamente, quando o solo estiver úmido, teremos uma condutividade melhor devido a absorção da água e isso resultará em um fluxo maior de corrente entre os dois eletrodos. Entretanto se o solo estiver seco, teremos pouca ou até nenhuma corrente entre os eletrodos.
O sensor é composto basicamente duas hastes que ficaram presas ao solo que iremos monitorar e um circuito comparador que irá nos retornar o nível de condutividade do solo. Este circuito é composto por um total de 6 pinos, sendo dois destes utilizados para conectar a haste de metal ao circuito de comparação. As outras 4 entradas possuem as funções de alimentar o circuito e retornar o nível de umidade do solo.
A determinação do nível de umidade do solo pode ser feita de duas formas, sendo elas:
- Um sinal digital que basicamente informa se o solo está seco ou não ( Menor precisão, porém não depende de um circuito ADC )
- Um sinal analógico que pode ser utilizado para estimar o quão úmido o solo está ( Maior precisão, porém dependerá de um circuito ADC )
Especificações do dispositivo
- Tensão de Operação: 3,3-5v
- Sensibilidade ajustável via potenciômetro
- Saída Digital TTL (D0) e Analógica(A0)
- Led indicador de detecção de umidade
Mãos à Obra – Medindo a umidade do solo utilizando o Arduino – Higrômetro
Componentes utilizados
Montando o projeto
Nesta primeira parte do tutorial, iremos apenas conectar o sensor de umidade, desta forma, iremos utilizar o seguinte esquema de ligação:
A montagem final do nosso sistema deve ser semelhante ao modelo abaixo
Veja só como ficou o nosso sistema inicial.
Antes de ligar o seu circuito, verifique se todas as conexões foram feitas corretamente. Um curto circuito causado por uma ligação errada pode danificar todo o seu projeto.
Programando
Com a parte física do nosso projeto montada, iremos agora partir para a parte de codificação do sistema. Nesta primeira versão não iremos utilizar nenhuma biblioteca em especial, porém iremos utilizar funções para leitura de dados analógicos e também iremos construir o nosso sistema de leituras de uma forma um pouco diferente como pode ser visto no código abaixo:
/* Nome: Sistema de aferição de umidade de solo - Higrômetro * Feito por: Danilo Almeida * Data: 7/11/2017 */ #define sensorUmidade A0 // Sensor de umidade de solo do módulo unsigned long tempoAnterior = 0; // Variável utilizada para guardar o tempo anterior unsigned long intervalo = 1000; // Intervalo de tempo em MS para cada leituraa void setup() { Serial.begin(9600); // Inicialização da comunicação serial } void loop() { unsigned long tempoAtual = millis(); // Realizamos a leitura atual do tempo em que o nosso Arduino Nano está ligado if (tempoAtual-tempoAnterior > intervalo){ // Pequena lógica para realizar leituras temporizadas sem parar o microcontrolador tempoAnterior =tempoAtual; // Guardamos o tempo anterior como o ultimo intervalo de tempo lido int leitura = analogRead(sensorUmidade); // Leitura dos dados analógicos vindos do sensor de umidade de solo if (leitura<=1023 && leitura>=682){ // Se a leitura feita for um valor entre 1023 e 682 podemos definir que o solo está com uma baixa condutividade, logo a planta deve ser regada Serial.println("Nível de Umidade Baixo"); }else{ if (leitura<=681 && leitura>=341){ // Se a leitura feita for um valor entre 681 e 341 podemos definir que o solo está com um nível médio de umidade, logo dependendo da planta pode ou não ser vantajoso regar Serial.println("Nível de Umidade Médio"); } else{ if (leitura<=340 && leitura>=0){ // Se a leitura feita for um valor entre 0 e 340 podemos definir que o solo está com um nível aceitável de umidade, logo talvez não seja interessante regar neste momento Serial.println("Nível de Umidade Alto"); } } } } }
Entendendo a Fundo
Software
– Definições e variáveis utilizadas no projeto
Inicialmente definimos todas as variáveis que iremos utilizar tanto para controlar as leituras que serão efetuadas quanto para realizar a leitura da entrada analógica do sistema. Neste trecho de código definimos as variáveis intervalo, tempoAnterior e criamos uma definição para o pino A0 do Arduino com o nome de sensorUmidade.
#define sensorUmidade A0 // Sensor de umidade de solo do módulo unsigned long tempoAnterior = 0; // Variável utilizada para guardar o tempo anterior unsigned long intervalo = 1000; // Intervalo de tempo em MS para cada leitura
– Função Setup – Inicialização da comunicação serial
Nesta primeira versão, iremos apenas verificar o nível de umidade do solo e com base nesta medição informar se o solo está úmido ou não. Para isso iremos utilizar a comunicação serial. Logo neste trecho de código basicamente inicializamos a comunicação serial do nosso Arduino.
void setup() { Serial.begin(9600); // Inicialização da comunicação serial }
– Função Loop – Usando a função millis para contar o tempo
Nossa função loop tem como objetivo realizar o processo de leitura dentro de cada intervalo de tempo definido na variável intervalo, porém diferente de como fazemos na maioria das implementações, não iremos utilizar o comando delay para sincronizar cada leitura realizada. Isso ocorre pois o comando delay “congela” o microcontrolador o impedindo de executar outras ações, como por exemplo ler um outro sensor, ou receber dados da porta serial. Com isso neste projeto iremos utilizar a função millis para sincronizar as leituras e não “congelar”o microcontrolador, possibilitando assim com que ele faça outras tarefas enquanto aguarda o tempo de realizar uma nova leitura.
O processo de sincronizar a leitura de forma não bloqueante é feito de uma maneira bem simples:
- Inicialmente armazenamos o tempo atual ( que é retornado pela função millis ).
unsigned long tempoAtual = millis(); // Realizamos a leitura atual do tempo em que o nosso Arduino Nano está ligado
- Com o tempo atual do microcontrolador armazenado, iremos agora realizar uma operação de subtração entre o tempo atual lido e o último tempo que armazenamos.
if (tempoAtual-tempoAnterior > intervalo)
- Se a subtração entre o tempo atual do microcontrolador e o último tempo armazenado for maior que o intervalo de tempo para cada leitura, significa que já é hora de realizar a leitura desejada, porém antes devo atualizar o meu tempo anterior já que realizei uma leitura.
tempoAnterior =tempoAtual; // Guardamos o tempo anterior como o ultimo intervalo de tempo lido
- Recomeçamos o processo no passo 1
– Leitura do nosso medidor de umidade de solo
Agora iremos realizar a leitura do nosso sensor de umidade de solo através da porta A0, esta leitura é feita através da função analogRead como mostra o código abaixo:
int leitura = analogRead(sensorUmidade); // Leitura dos dados analógicos vindos do sensor de umidade
Esta função basicamente retorna um valor numérico entre 0 e 1023, que representa o valor tem Volts lido do sensor de umidade. O valor está entre 0 e 1023 devido a resolução do circuito ADC que já vem integrado ao Arduíno, se você precisar de uma resolução maior, pode também utilizar circuitos ADC’s dedicados.
– Tomada de decisão baseada no valor medido pelo sensor de umidade
Já por fim ( porém não menos importante ), iremos mostrar através da porta serial, em qual intervalo de valores a sua leitura está contida. Para isso, basicamente dividimos o valor da resolução máxima do circuito ADC do Arduino 1024 valores por três, o que resulta em três estados chamados: umidade baixa, umidade média, umidade alta.
if (leitura<=1023 && leitura>=682){ // Se a leitura feita for um valor entre 1023 e 682 podemos definir que o solo está com uma baixa condutividade, logo a planta deve ser regada Serial.println("Nível de Umidade Baixo"); }else{ if (leitura<=681 && leitura>=341){ // Se a leitura feita for um valor entre 681 e 341 podemos definir que o solo está com um nível médio de umidade, logo dependendo da planta pode ou não ser vantajoso regar Serial.println("Nível de Umidade Médio"); } else{ if (leitura<=340 && leitura>=0){ // Se a leitura feita for um valor entre 0 e 340 podemos definir que o solo está com um nível aceitável de umidade, logo talvez não seja interessante regar neste momento Serial.println("Nível de Umidade Alto"); } } }
Desafio
Agora que temos o nosso projeto montado e funcionando tente melhorar um pouco o nível de medição do sistema. Divida o valor máximo do conversor ADC por um valor maior que três e crie mais ifs para que você seja capaz de identificar melhor o nível de umidade do solo.
Considerações Finais
Este tutorial teve como objetivo apresentar e ilustrar o funcionamento do sensor de umidade do solo, que por sua vez, tem uma aplicação bastante interessante e importante que é identificar em qual momento uma planta deve ser regada, para que dessa forma ela tenha uma qualidade de vida melhor e seja capaz de produzir e aumentar a qualidade de sua produção. Como dito anteriormente, este projeto será uma série onde iremos construir um sistema de monitoramento em tempo real do solo e do ambiente onde nossa plantação está. Espero que tenham gostado do conteúdo apresentado, sinta-se à vontade para nos dar sugestões, críticas ou elogios. Lembre-se de deixar suas dúvidas nos comentários abaixo.
Formado em Ciência da computação pela UFV-CAF em 2017 e atualmente cursando pós-graduação Stricto Sensu em Ciência da computação pela Universidade Federal de Viçosa, na área de arquitetura de computadores. É um entusiasta na área de sistemas embarcados e robótica.
33 Comments
Deixe uma pergunta, sugestão ou elogio! Estamos ansiosos para ter ouvir!Cancelar resposta
Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.
Primeiramente, muito obrigado! Muito bem explicado. Minha contribuição como agrônomo é comparar os valores obtidos pelo sensor com um tensiometro agrícola. Existem padrões estabelecidos de umidade utilizando o tensiometro.
Tudo ótimo Danilo? Gostei muito do projecto e da forma como explicas, pareabéns!!
Como evitar a degradação precoce do sensor??
Bom dia jovem, Gostaria de saber se você teria um projeto utilizando este sensor de umidade, junto com um display 16×2 e utilizando um modulo relê para ativação automatica de um irrigador ou valvula solenoide.
No caso os equipamentos utilizados seriam:
1-Sensor de Umidade;
2-Valvula Solenoide;
3-Modulo Relê;
4-Display LCD 16×2 (para mostrar a umidade da terra em tempo real)
Como você faria para isolar o sensor ?
Quantos metros o sensor percorre?
Se fosse o caso de uma plantação quantos seria necessário?
seria possivel ligar varios sensores em uma mesma porta e o arduino entregar uma media? por exemplo sou agricultor precisava de pelo menos 4 sensores para ter uma boa noçao de cada parte da plantaçao e entao o arduino ligaria uma bomba dagua… essa parte e facil mais a parte de varios sensores nao entendo muito bem
Deivid, no seu caso eu recomendaria que você conectasse cada um dos sensores em portas diferentes e realizasse o calculo da média no próprio código.
Boa noite, tenho duvidas como devo afinar o sensor. Testei num copo com agua e deu um valor aproximado a 520 e sem nenhum contacto da 1024. Estes valores são normais?
Em teoria sim Michel, aqui obtive a mesma relação, quanto mais alto o valor lido do ADC menos úmido o ambiente estava, já quando ocorre um aumento na umidade esse valor normalmente diminui.
Quanto a durabilidade a sensor ou a implementação as hastes de inox, conseguiu álbum progresso? Estou com um projeto parecido, e essa questão me empacou. Se puder compartilhar algum material, agradeço!
Estou meio sem tempo para dar andamento nesse projeto, então ainda não consegui progresso V.R Lemos :/
Boa tarde Danilo, sabe em qual unidade de medida o sensor trabalha ?
Boa tarde Antônio, o sensor vai te retornar um valor analógico que pode ser mapeado de 100% ( muito úmido ) até 0% ( baixa úmidade )
Bom dia, comunico que suas medidas estão invertidas, você trata 80% de umidade aonde deveria ser 20%, o código correto é:
if (leitura=682){ // Se a leitura feita for um valor entre 1023 e 682 podemos definir que o
solo está com uma baixa condutividade, logo a planta deve ser regada
Serial.println(“Nível de Umidade Alto”);
}else{
if (leitura=341){ // Se a leitura feita for um valor entre 681 e 341 podemos definir que o solo
está com um nível médio de umidade, logo dependendo da planta pode ou não ser vantajoso regar
Serial.println(“Nível de Umidade Médio”);
}
else{
if (leitura=0){ // Se a leitura feita for um valor entre 0 e 340 podemos definir que o solo
está com um nível aceitável de umidade, logo talvez não seja interessante regar neste momento
Serial.println(“Nível de Umidade Baixo”);
}
}
}
Bom dia Gilberto, quando fiz este tutorial o sensor que dispunha retornava o valor “invertido”, e como isso se tratava de um padrão na época na maioria deles mantive o mesmo padrão.
Até que distância o sensor alcança?
Quantos sensores por hectares?
Por possuir uma haste de tamanho reduzido possivelmente ele só vai conseguir pegar o seu entorno Gabriel.
Qual a sondagem do sensor???
Primeiramente ótimo trabalho.
Os valores analógicos que são passados para a placa já estão em porcentagem de umidade no solo? Ou é necessário algum tipo de conversão?
Olá Rigles, os dados lidos do ADC são brutos. Porém existe uma relação direta entre o nível de umidade do solo e o valor lido do sensor. Quanto menor o valor lido, mais úmido pode ser considerado o solo, e quanto maior menos úmido.
Através de uma regra de três simples determinei as tensões recebidas nos pinos analógicos.
ex: 5v = 1023 então 2,5 v = 511.
Se pegarmos esses valores e usar os mesmos para descobrir a resistência elétrica do solo teríamos :
U = R x I
R = 5v – 2,5 v / 0,004 A obs : 0,004 A corrente nos pinos do arduino.
R= 625 ohms
Agr vamos considerar o valor lido = 390.
390= 1,906 v
então:
R = 773 homs
Teoricamente quando maior a umidade no solo maior a condutibilidade elétrica e menor a resistência, ent porque temos maior resistência em valores lidos menores, sendo que quanto menor o valor lido maior a umidade no solo????
Opa blz?
Seguinte queria saber se é possível e se for. Me passa um rumo +- pra onde ir. Gostaria de medir a umidade de cordo com a profundidade necessária. Ex: preciso medir a uumidad do solo a 40 cm de profundidade, existe uma maneira de aumentar esse sensor ou algo do tipo?
Você pode utilizar uma haste maior e isolar a haste para que a leitura seja feita apenas na distância desejada. É até recomendado a construção de uma haste própria devido a corrosão que o material sofre ao ficar em contato com o solo.
Bom dia Danilo, fiquei muito interessado nesse sistema de monitoramento … eu estou começando a ler sobre Arduino e o meu conhecimento ainda é muito pequeno. Gostaria de me aprofundar e poder utilizar.
Minhas duvidas iniciais seriam: 1 – Como programar ? existe alguma forma de digitar o programa ? seria através de um computador ? como transmitir o programa para o kit ?
Enfim como eu poderia iniciar o conhecimento em Arduino ? voce recomenda alguma leitura básica inicial ?
Muito obrigado,
Cesar Augusto
Olá César Augusto, aqui no portal, existe uma apostila básica por onde você pode começar os seus estudos.
https://portal.vidadesilicio.com.br/apostila-arduino-basico/
Acredito que seja um bom ponto de partida. Além disso existem ótimos tutoriais no youtube.
Obrigado pela atenção dispensada!
Você teria ideia de onde eu pesquisar como fabricar ou comprar hastes mais resistentes? Será que hastes em inox funcionária bem?
Você tem algum artigo como enviar as informações através de transmissores sem fio como sugerido
Qual distância segura máxima que eu poderia instalar os sensores através de fio?
Atenciosamente
Marcelo
Acredito que uma haste em inox funcionaria bem. Porém é preciso analisar e ver como seria o comportamento. Para comunicação você pode utilizar um transmissor de rádio RF433 que possui um tutorial neste link (https://portal.vidadesilicio.com.br/modulo-rf-433mhz-comunicacao-arduinos/) porém se a distância for maior recomendo utilizar o módulo nrf24l01
Bom dia
Gostei muito desse projeto!
Sou formado em engenharia mecânica e sou também agricultor
Possuo pequena propriedade no seminário da Bahia onde tenho irrigação de 2 ha de maracujá
Além de procurar economizar água por motivo ecológico tenho também preocupação com a frequência de irrigação
Além de colocar a quantidade necessária de água para planta temos que coloca-la de modo fracionado. Fazendo uma analogia com o ser humano: sabemos que temos de ingerir no mínimo 2 litros de água por dia porém não tomamos todo de uma só vez e sim durante o dia. O mesmo deve ser com a planta
A solução seria colocar 2 sensores de umidade em um ponto representativo da roça, sendo um sensor próximo ao solo que deverá acionar a irrigação quando o solo estiver seco e outro a 20 cm de profundidade que comandará o fechamento da irrigação indicando solo úmido
Dúvidas:
1- esses sensores serão instalados de forma contínua no solo. Irão resistir?
2- quais as distâncias máximas entre os sensores e o Arduino e entre o arduíno e a válvula de acionamento elétrico que libera a água de irrigação?
3- que fio utilizar?
Atenciosamente
Marcelo Rocha
Fico bastante feliz que tenha gostado do projeto Marcelo. O grande problema desses sensores é realmente a durabilidade das hastes que ficam fixadas ao solo. Em um primeiro momento sim, elas ficariam instaladas de forma continua, porém vendo alguns outros trabalhos a respeito disso, pude notar que o pessoal costuma fazer medições pontuais ao invés de contínua, o que de certa forma aumenta a durabilidade. Porém para um projeto ao nível que deseja acredito que a produção de uma haste capaz de resistir a degradação seria a melhor opção. Já na questão da distância por se tratar de uma grandeza analógica a possibilidade de ruído é bem alta. Uma solução seria você criar nós de leitura que enviassem a informação através de algum transmissor sem fio de baixo consumo. Dessa forma você poderia afixar ele em um local e deixar lá funcionando.
Muito bacana mesmo, goto da forma como explica o código na parte: “Entendendo a Fundo”. Parabéns pelo trabalho.
Fico bastante feliz que tenha gostado e que esse código tenha lhe ajudado. Muito obrigado pelo feedback :)
Gostei. Estou ansioso para ver e monitoramento WiFi, via ESP8266
Fico feliz que tenha gostado, aguarde que logo logo teremos a segunda parte :D