Raspberry Pi, Python e regar plantas de interior

Não tenho relacionamento com plantas de interior. O fato é que eu esqueço de regá-los. Sabendo disso, comecei a refletir sobre o fato de que alguém, com certeza, já havia encontrado uma maneira de automatizar a irrigação. Como se viu, existem muitas maneiras. Ou seja, estamos falando de soluções baseadas em Arduino ou Raspberry Pi. Neste artigo, quero falar sobre como criei um sistema baseado no Raspberry Pi e Python, projetado para automatizar as estações de rega.



Componentes e recursos úteis


Gostaria imediatamente de observar que não sou especialista em eletrônica. Se eles me pedirem para desenhar um diagrama elétrico, ou contar detalhadamente sobre como qualquer componente eletrônico funciona, não consigo desenhar nada sensato ou dizer. Na verdade, eu fiz esse projeto apenas com conhecimentos básicos de eletricidade e apenas experimentando componentes. Peço que tenha muito cuidado ao trabalhar com eletricidade. E, se você sentir falta de conhecimento nessa área, sugiro pelo menos um pouco de compreensão disso.

Aqui está uma lista de componentes que eu usei no meu projeto.


Como participo do programa de afiliados da Amazon, os links acima são fornecidos. Se você passar por eles e comprar alguma coisa, vou ganhar um pouco.

Depois de obter todos os componentes necessários, é hora de fazer uma pesquisa. A seguir, é apresentada uma lista de recursos que me ajudaram a conectar corretamente os componentes eletrônicos e a entender os principais pontos relacionados ao seu funcionamento:


Aqui está um diagrama das portas GPIO do Raspberry Pi.


Diagrama da porta do Raspberry Pi GPIO

Conecte um relé ao Raspberry Pi


Comecei conectando um relé ao Raspberry Pi. Aqui está como fica.


Conexão do relé ao Raspberry Pi O

fio vermelho (fêmea-fêmea) vai do pino da placa de relé JD_VCC ao pino de 5V (pino nº 2) do Raspberry Pi. Um fio laranja (fêmea-fêmea) passa do pino da placa de relé do VCC para o pino de 3,3V (pino nº 1) do Raspberry Pi.


Pinos JD_VCC e VCC da placa de relé

Usando esses fios, fornecemos energia à placa de relé. Para poder controlar relés individuais, você precisa conectar a placa de relé e o Raspberry Pi com mais dois fios que se conectam aos pinos GND e IN1 da placa de relé.


Pinos GND e IN1 da placa de relé O

fio preto (fêmea-fêmea) é o cabo de aterramento que conecta o pino GND da placa de relé e o pino de terra no Raspberry Pi (conectei-o ao pino nº 34). Um fio branco (fêmea-fêmea) passa do pino IN1 da placa de relé para o pino nº 12 do Raspberry Pi. É esse fio branco que nos permite controlar programaticamente o relé, ligando e desligando os relés individuais localizados na placa.


Fios preto e branco conectados ao Raspberry Pi

Se você decidir reproduzir o meu projeto, poderá organizar o relé e o Raspberry Pi para se comunicar usando os pinos adequados. Mas lembre-se de que se o diagrama de conexão dos componentes do seu projeto for diferente do diagrama de conexão dos componentes do meu projeto, você precisará fazer as alterações apropriadas no meu código.

Conectando a fonte de alimentação ao relé


Depois de conectar a placa do relé ao Raspberry Pi, conectei a fonte de alimentação a um dos relés.

Não conecte a fonte de alimentação a uma tomada até concluir todas as operações de coleta de componentes do sistema. Esteja ciente do risco de choque elétrico.


Conexão da fonte de alimentação a um dos relés A

fonte de alimentação de 12V usada por mim vem com um adaptador ao qual é conveniente conectar os fios de conexão. Conectei o fio vermelho (macho-macho) ao conector “+” do adaptador e o cabo marrom (macho-macho) ao conector “-” do adaptador. Depois, conectei o cabo com o conector “Crocodile” (macho-fêmea) ao fio marrom.


Adaptador fornecido com a fonte de alimentação

A placa de relé possui quatro relés separados. Cada um deles possui três pinos aos quais os cabos podem ser conectados. No centro de cada relé, há um conector ao qual a saída positiva de uma fonte de energia externa está conectada. À esquerda, está o conector ao qual está conectada a entrada positiva do dispositivo ao qual a energia deve ser conectada.


Conexão de um relé separado

Conectei um cabo vermelho da fonte de alimentação (terminal positivo) ao contato central do relé. Depois, conectei o cabo laranja (macho-macho) ao conector esquerdo do relé e o cabo com o “crocodilo” (macho-fêmea) a este cabo.


Cabos vermelhos e laranja


Fonte de alimentação e adaptador


Relé e Raspberry Pi

Conectando uma bomba de água a um relé


Agora resta apenas conectar os "crocodilos" dos conectores à bomba de água. A ordem da conexão determina a direção do fluxo de água.

Então, eu precisava de água para entrar no canal esquerdo da bomba e sair do canal direito. Portanto, conectei o conector “crocodilo” do fio preto ao terminal da bomba, próximo ao qual há um ponto vermelho, e o outro “crocodilo” ao outro terminal da bomba. Se eu conectasse os “crocodilos” em uma ordem diferente - a água iria na direção oposta - do canal direito para a esquerda.


Conectando uma bomba de água a um relé


Sistema completo de irrigação: a água entra na bomba pelo canal esquerdo, sai pela direita e vai para a planta

O código


Então chegamos ao que eu sou realmente bom. Chegamos ao código. Para que o software funcionasse com as portas GPIO do Raspberry Pi, usei a biblioteca gpiozero . É fácil de usar, oculta muitos mecanismos de baixo nível do programador, que você geralmente precisa entender para quem quer trabalhar com pinos GPIO. A biblioteca está bem documentada.

Antes de escrever o código, você precisa conectar um monitor, mouse e teclado ao seu Raspberry Pi. Ou você precisa se conectar ao Raspberry Pi via SSH .

Depois de inserir o Raspberry Pi, vá para a pasta Desktope crie uma pasta lá run. Crie uma pasta nesta pasta classes. E na pasta, classescrie um arquivo Hardware.py. Deve ter o seguinte código:

from gpiozero import OutputDevice

class Relay(OutputDevice):
    def __init__(self, pin, active_high):
        super(Relay, self).__init__(pin, active_high)

Neste arquivo, acabei de declarar uma nova classe Relay, que é a descendente da classe OutputDevice .

Em seguida, na pasta, classescriei um novo arquivo TimeKeeper.py:

import datetime

class TimeKeeper:
    def __init__(self, current_time):
        self.current_time = current_time
        self.time_last_watered = None
    
    def set_current_time(self, updated_time):
        self.current_time = updated_time

    def set_time_last_watered(self, updated_time):
        self.time_last_watered = updated_time

    @staticmethod
    def get_current_time():
        now = datetime.datetime.now()
        return now.strftime("%I:%M:%S %p")

O objetivo desta aula é rastrear a hora atual e o momento em que a última rega foi realizada.

Assim, os arquivos Hardware.pye TimeKeeper.pyestão na pasta classes. Agora, fora desta pasta, eu crio um arquivo water_plant.py:

from classes import Hardware
from classes import TimeKeeper as TK
import schedule
import smtplib
import time
import ssl

# WATERING_TIME must be in "00:00:00 PM" format
WATERING_TIME = '11:59:50 AM'
SECONDS_TO_WATER = 10
RELAY = Hardware.Relay(12, False)
EMAIL_MESSAGES = {
    'last_watered': {
        'subject': 'Raspberry Pi: Plant Watering Time',
        'message': 'Your plant was last watered at'
    },
    'check_water_level': {
        'subject': 'Raspberry Pi: Check Water Level',
        'message': 'Check your water level!',
    }
}

def send_email(time_last_watered, subject, message):
    port = 465
    smtp_server = "smtp.gmail.com"
    FROM = TO = "YOUR_EMAIL@gmail.com"
    password = "YOUR_PASSWORD"

    complete_message = ''
    if time_last_watered == False:
        complete_message = "Subject: {}\n\n{}".format(subject, message)
    else:
        complete_message = "Subject: {}\n\n{} {}".format(subject, message, time_last_watered)
    
    context = ssl.create_default_context()
    with smtplib.SMTP_SSL(smtp_server, port, context=context) as server:
        server.login(FROM, password)
        server.sendmail(FROM, TO, complete_message)

def send_last_watered_email(time_last_watered):
    message = EMAIL_MESSAGES['last_watered']['message']
    subject = EMAIL_MESSAGES['last_watered']['subject']
    send_email(time_last_watered, subject, message)

def send_check_water_level_email():
    message = EMAIL_MESSAGES['check_water_level']['message']
    subject = EMAIL_MESSAGES['check_water_level']['subject']
    send_email(False, subject, message)

def water_plant(relay, seconds):
    relay.on()
    print("Plant is being watered!")
    time.sleep(seconds)
    print("Watering is finished!")
    relay.off()

def main():
    time_keeper = TK.TimeKeeper(TK.TimeKeeper.get_current_time())
    if(time_keeper.current_time == WATERING_TIME):
        water_plant(RELAY, SECONDS_TO_WATER)
        time_keeper.set_time_last_watered(TK.TimeKeeper.get_current_time())
        print("\nPlant was last watered at {}".format(time_keeper.time_last_watered))
        # send_last_watered_email(time_keeper.time_last_watered)

# schedule.every().friday.at("12:00").do(send_check_water_level_email)

while True:
    # schedule.run_pending()
    time.sleep(1)
    main()

Aqui você pode alterar os valores das variáveis WATERING_TIMEe SECONDS_TO_WATERos que lhe parecem adequados. A primeira variável determina a que horas regar as plantas. O segundo define a duração da rega.

Além disso, criei aqui um mecanismo para enviar notificações e lembretes por email. Graças a esse mecanismo, o proprietário do sistema de irrigação recebe um e-mail toda vez que o sistema é ligado e rega as plantas. Além disso, toda sexta-feira, ele recebe uma carta lembrando que precisa verificar o suprimento de água para irrigação. No código, a chamada dos métodos correspondentes é comentada; como resultado, o programa pode funcionar normalmente sem configurações relacionadas a email. Se você deseja ativar esses lembretes, faça o seguinte:

  1. Você deve digitar na linha FROM = TO = «YOUR_EMAIL@gmail.com»e password = «YOUR_PASSWORD»seu endereço de e-mail e senha do Gmail.
  2. Remova o comentário das seguintes linhas:

    •  # send_last_watered_email (time_keeper.time_last_watered)
    • # schedule.every (). friday.at ("12:00"). do (send_check_water_level_email)
    • # schedule.run_pending ()
  3. Você precisa ir aqui , faça login na sua conta do Gmail e ative o botão nesta página. Caso contrário, ao tentar enviar um email usando o Gmail, você receberá uma mensagem de erro. 

Além disso, é importante observar que meu sistema de lembretes funciona apenas com contas do Gmail.

Agora que tudo está pronto para o trabalho, você deve obter a seguinte estrutura de arquivos e pastas:

run
├── classes
│ ├── Hardware.py
│ └── TimeKeeper.py
└── water_plant.py

Uma pasta runpode realmente ser colocada em qualquer lugar. Eu decidi deixar na pasta Desktop.

Não me senti atraído pela perspectiva de me conectar ao Raspberry Pi toda vez que tive que iniciá-lo water_plant.py. Gostaria que esse script fosse executado automaticamente quando o Raspberry Pi estiver ativado. Isso, por exemplo, tornaria mais fácil desligar o sistema, movê-lo para outro local, ligá-lo e não precisar se preocupar com nada. Para implementar esse cenário atraente, precisamos de uma equipe crontab.

Abra a janela do terminal no Raspberry Pi e digite o seguinte comando:

sudo crontab -e

Em resposta, o sistema deve produzir algo semelhante ao mostrado na figura a seguir.


Configurando Tarefas Cron

Adicione a seguinte linha neste arquivo:

@reboot python3 /home/pi/Desktop/run/water_plant.py

Em seguida, esse arquivo deve ser salvo usando a combinação de teclas Ctrl+Xdigitando Ye pressionando Enter.

Na linha acima, damos ao Raspberry Pi as seguintes instruções: "Toda vez que você reiniciar, execute o arquivo water_plant.pylocalizado na pasta runque está na pasta Desktop". Se sua pasta runestiver localizada de uma maneira diferente, edite esse comando de acordo.

Sumário


Veja o código do projeto aqui . Se desejar, você pode clonar imediatamente seu repositório com este comando:

git clone https://github.com/AlanConstantino/rpi-plant-project.git

Isso é tudo! Agora você sabe como criar um sistema de irrigação automatizado para plantas de interior com base no Raspberry Pi. Ela sabe como regar as plantas a cada 24 horas e pode enviar notificações e lembretes por e-mail ao proprietário.

Queridos leitores! Como você desenvolveria um sistema de rega automático para plantas em casa?


All Articles