Sensor umidade de solo e Raspberry Pi – Parte 1

Neste artigo vamos mostrar como usar um sensor de umidade de solo para notificar quando a sua planta precisar ser regada. Muito útil caso você seja um pouco esquecido de suas amigas do reino vegetal.

O sensor é composto por uma ponta de prova e uma placa de alimentação (que contém mais alguns componentes, como resistores, LEDs e um comparador). A placa contém duas saídas, uma saída analógica e uma saída digital, que nada mais é do que um comparador. Esse sensor basicamente funciona como um potenciômetro. O que ele faz é simplesmente alimentar a ponta de prova com uma tensão e medir o valor real. Dependendo da umidade do solo, esse valor vai variar já que a resistência da ponta de prova em contato com o solo também vai variar (aposto que se lembrou das aulas do ensino médio, não?).

Para este tutorial, vamos usar a saída digital para nos informar quando a planta vai precisar ser molhada ou não.

Materiais necessários

  • Raspberry Pi (no nosso caso, vamos usar uma do modelo 3)
  • Sensor de umidade de solo

Conectando o sensor

  • Conecte a ponta de prova a placa do sensor.

  • Conecte o pino de terra (GND – pino 9) à placa.
  • Conecte o pino de 3.3V (pino 1) à placa.
  • Conecte o pino D0 (saída digital) ao pino 11 (GPIO17).

Nota: Caso tenha alguma dúvida com relação ao GPIO, leia esse artigo.

Ajustando o potenciômetro

Você pode verificar a saída digital funcionando com o uso de um copo d’água. Coloque a ponta de prova dentro da água (cuidado para não espirrar água, estamos trabalhando com eletricidade, afinal. Se necessário, chame um adulto).

Ao se afundar um pouco, o segundo LED deve acender indicando que a umidade cresceu. Se você ajustar o potenciômetro, você vai verificar que o nível que o sensor tem que ficar vai mudar. Ajuste no nível que você deseja.

Programando

Agora chegou a hora divertida. O código em si é simples: vamos monitorar a saída digital do sensor. Nesse caso, quando a saída digital for igual a 1 (LED aceso), significa que a umidade atingiu o valor esperado. Caso for igual a 0 (LED apagado), significa umidade abaixo do esperado.

A biblioteca RPi.GPIO do Python tem uma funcionalidade muito interessante. É o chamado event_callback, que vai chamar uma função definida por nós toda vez que houver uma mudança em um pino. Isso faz com que não precisemos nos precisar em ficar verificando o nível do GPIO o tempo todo:

def callback(channel):
    if GPIO.input(channel):
        print('Por favor, me molhe!')
    else:
        print('OK, chega de água')

Simplesmente cadastramos essa função na biblioteca e depois configuramos o pino:

# Set things up
channel = 17
GPIO.setmode(GPIO.BCM)
GPIO.setup(channel, GPIO.IN)
 
# Vamos cadastrar a função de callback para o nosso pino
GPIO.add_event_detect(channel, GPIO.BOTH, bouncetime=300)
GPIO.add_event_callback(channel, callback)

Código completo:

#!/usr/bin/python
import RPi.GPIO as GPIO
import time
 
# Esta é nossa função de callback. Ela vai ser chamada toda vez que uma mudança for detectada no pino GPIO correspondente.
def callback(channel):
    if GPIO.input(channel):
        print('OK, chega de água')
    else:
        print('Por favor, me molhe!')
 
 
# Set things up
channel = 17
GPIO.setmode(GPIO.BCM)
GPIO.setup(channel, GPIO.IN)
 
# Vamos cadastrar a função de callback para o nosso pino
GPIO.add_event_detect(channel, GPIO.BOTH, bouncetime=300)
GPIO.add_event_callback(channel, callback)
 
# Loop infinito para manter o script rodando
while True:
    time.sleep(0.1)

Rodando

Salve o código em um arquivo (no nosso caso, soil.py) e rode:

(venv) pi@raspberrypi:~/Documents/soil $ nano soil.py
(venv) pi@raspberrypi:~/Documents/soil $ python soil.py
OK, chega de água
OK, chega de água
Por favor, me molhe!
OK, chega de água
Por favor, me molhe!
OK, chega de água
Por favor, me molhe!
OK, chega de água
^CTraceback (most recent call last):
  File "soil.py", line 24, in <module>
    time.sleep(0.1)
KeyboardInterrupt
(venv) pi@raspberrypi:~/Documents/soil $

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *