Sensor umidade de solo e Raspberry Pi – Parte 2

Em um tempo não muito distante, mostramos como usar a saída digital do sensor de umidade de solo. Mas concordemos, não é muito legal usar somente a saída digital, além de ter que ficar ajustando o potenciometro pra cada planta ou jardim que queremos.

Nesse artigo vamos mostrar como usar a saída analógica do sensor. Não vamos mais receber um simples ‘Por favor, me molhe!’, mas um valor baseado na umidade do solo. Como a Raspberry Pi não contém entradas analógicas, vamos usar um conversor A/D.

Materiais necessários

  • Raspberry Pi
  • Sensor de umidade de solo
  • Conversor A/D (nesse caso, foi usado um ADC0832, da Texas Instruments).

Conectando o sensor

  • Conecte ponta de prova ao sensor.

  • Conecte o pino de terra (GND – pino 9) à placa.
  • Conecte o pino de 3.3V (pino 1) à placa.
  • Conecte o pino de saída analógica (A0) ao protoboard.

  • Conecte o pino do canal 0 do ADC no protoboard, na mesma trilha da saída analógica.
  • Conecte o pino de terra (GND – pino 6) ao conversor ADC.
  • Conecte o pino de 5.0V (pino 2) ao conversor ADC.
  • Conecte o pino CS do ADC ao pino 12 (GPIO18) da RPi.
  • Conecte o pino CLK do ADC ao pino 18 (GPIO24) da RPi.
  • Conecte o pino DATA do ADC ao pino 16 (GPIO23) da RPi.

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

Programação

Precisamos fazer a leitura do conversor A/D. Esse sensor possui uma forma peculiar de acessar, o que está descrito no código abaixo.

import RPi.GPIO as GPIO
import time
 
ADC_CS = 12
ADC_CLK = 18
ADC_DIO = 16
 
def setup():
    GPIO.setwarnings(False)
    GPIO.setmode(GPIO.BOARD)    # Fisical location
    GPIO.setup(ADC_CS, GPIO.OUT)
    GPIO.setup(ADC_CLK, GPIO.OUT)
 
def destroy():
    GPIO.cleanup()
 
def get_result():
    GPIO.setup(ADC_DIO, GPIO.OUT)
    GPIO.output(ADC_CS, 0)
 
    GPIO.output(ADC_CLK, 0)
    GPIO.output(ADC_DIO, 1)
    time.sleep(0.000002)
    GPIO.output(ADC_CLK, 1)
    time.sleep(0.000002)
    GPIO.output(ADC_CLK, 0)
 
    GPIO.output(ADC_DIO, 1)
    time.sleep(0.000002)
    GPIO.output(ADC_CLK, 1)
    time.sleep(0.000002)
    GPIO.output(ADC_CLK, 0)
 
    GPIO.output(ADC_DIO, 0)
    time.sleep(0.000002)
 
    GPIO.output(ADC_CLK, 1)
    GPIO.output(ADC_DIO, 1)
    time.sleep(0.000002)
    GPIO.output(ADC_CLK, 0)
    GPIO.output(ADC_DIO, 1)
    time.sleep(0.000002)
 
    GPIO.setup(ADC_DIO, GPIO.IN)
    data1 = 0
    for i in range(0, 8):
        GPIO.output(ADC_CLK, 1)
        time.sleep(0.000002)
        GPIO.output(ADC_CLK, 0)
        time.sleep(0.000002)
 
        data1 = data1 << 1 | GPIO.input(ADC_DIO)
 
    data2 = 0
    for i in range(0, 8):
        data2 = data2 | GPIO.input(ADC_DIO) << i
        GPIO.output(ADC_CLK, 1)
        time.sleep(0.000002)
        GPIO.output(ADC_CLK, 0)
        time.sleep(0.000002)
 
    GPIO.output(ADC_CS, 1)
    GPIO.setup(ADC_DIO, GPIO.OUT)
 
    if data1 == data2:
        return data1
    else:
        return 0
 
setup()
 
try:
    while True:
        data = get_result()
        v = data * 5.0 / 255.0
        print('ADC value: {:.2f} V'.format(v))
        time.sleep(1.5)
except KeyboardInterrupt:
    pass
 
destroy()

Copie o código acima em um arquivo (vamos aqui chamá-lo de adc.py). Para funciona, rode a seguinte linha de comando:

$ python adc.py

Provavelmente, terá uma saída parecida com isso:

Para calibrar os valores (assim como fizemos quando usamos a saída digital), use um copo d-água. Anote o valor quando o sensor estiver fora e também quando o sensor estiver submerso (não afunde o sensor totalmente na água, coloque apenas até a metade, já é suficiente).

Agora o código dá pra ser alterado para mostrar mensagens de uma forma um pouco mais precisas e legais, mas isso fica pra você!

Deixe uma resposta

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