Raspberry Pi, Python y riego de plantas de interior

No tengo relación con las plantas de interior. El hecho es que me olvido de regarlos. Sabiendo esto, comencé a reflexionar sobre el hecho de que alguien, con seguridad, ya había encontrado una manera de automatizar el riego. Al final resultó que, hay muchas maneras. Es decir, estamos hablando de soluciones basadas en Arduino o Raspberry Pi. En este artículo quiero hablar sobre cómo creé un sistema basado en Raspberry Pi y Python, diseñado para automatizar las plantas de riego.



Componentes y recursos útiles


Inmediatamente me gustaría señalar que no soy en absoluto un experto en electrónica. Si me piden que dibuje un diagrama eléctrico o que cuente en detalle cómo funciona cualquier componente electrónico, no puedo dibujar nada sensato ni decirlo. De hecho, hice este proyecto solo con conocimientos básicos de electricidad y solo experimentando con componentes. Le pido que tenga mucho cuidado al trabajar con electricidad. Y, si siente una falta de conocimiento en esta área, sugiero al menos un poco de comprensión de esto.

Aquí hay una lista de componentes que utilicé en mi proyecto.


Participo en el programa de afiliados de Amazon, por lo que se proporcionan los enlaces anteriores. Si los revisas y compras algo, ganaré un poco.

Después de obtener todos los componentes que necesito, es hora de investigar un poco. La siguiente es una lista de recursos que me ayudaron a conectar correctamente los componentes electrónicos y comprender los puntos principales con respecto a su funcionamiento:


Aquí hay un diagrama de los puertos GPIO de la Raspberry Pi.


Diagrama de puerto GPIO Raspberry Pi

Conecte un relé a la Raspberry Pi


Comencé conectando un relé a la Raspberry Pi. Así es como se ve.


Conexión del relé a la Raspberry Pi El

cable rojo (hembra-hembra) va desde el pin de la placa de relé JD_VCC al pin de 5V (pin No. 2) del Raspberry Pi. Un cable naranja (hembra-hembra) conduce desde el pin de la placa de relé VCC al pin de 3.3V (pin No. 1) de la Raspberry Pi.


Pines JD_VCC y VCC de la placa de relés

Con estos cables, suministramos energía a la placa de relés. Para poder controlar relés individuales, debe conectar la placa de relés y la Raspberry Pi con dos cables más que se conectan a los pines GND e IN1 de la placa de relés.


Pines GND e IN1 de la placa de relé El

cable negro (hembra-hembra) es el cable de tierra que conecta el pin GND de la placa de relé y el pin de tierra en la Raspberry Pi (lo conecté al pin No. 34). Un cable blanco (hembra-hembra) conduce desde el pin IN1 de la placa de relés hasta el pin No. 12 de la Raspberry Pi. Es este cable blanco el que nos permite controlar mediante programación el relé, activando y desactivando los relés individuales ubicados en el tablero.


Cables blancos y negros conectados a la Raspberry Pi

Si decide reproducir mi proyecto, puede organizar el relé y la Raspberry Pi para que se comuniquen utilizando los pines adecuados. Pero tenga en cuenta que si el diagrama de conexión de los componentes de su proyecto es diferente del diagrama de conexión de los componentes de mi proyecto, deberá realizar los cambios apropiados en mi código.

Conexión de la fuente de alimentación al relé


Después de conectar la placa de relé a la Raspberry Pi, conecté la fuente de alimentación a uno de los relés.

No enchufe la fuente de alimentación a una toma de corriente hasta que haya completado todas las operaciones de recolección de componentes del sistema. Tenga en cuenta el riesgo de descarga eléctrica.


Conexión de la fuente de alimentación a uno de los relés La

fuente de alimentación de 12 V utilizada por mí viene con un adaptador al que es conveniente conectar los cables de conexión. Conecté el cable rojo (macho-macho) al conector del adaptador "+" y el cable marrón (macho-macho) al conector del adaptador "-". Luego conecté el cable con el conector "Crocodile" (hembra-macho) al cable marrón.


Adaptador que viene con la fuente de alimentación

La placa de relés tiene cuatro relés separados. Cada uno de ellos tiene tres pines a los que se pueden conectar los cables. En el centro de cada relé hay un conector al que está conectada la salida positiva de una fuente de alimentación externa. A la izquierda está el conector al que está conectada la entrada positiva del dispositivo al que se va a conectar la alimentación.


Al conectar un relé separado,

conecté un cable rojo desde la fuente de alimentación (terminal positivo) al contacto central del relé. Luego conecté el cable naranja (macho-macho) al conector izquierdo del relé y conecté el cable con el "cocodrilo" (hembra-macho) a este cable.


Cables rojos y naranjas


Fuente de alimentación y adaptador


Relé y Raspberry Pi

Conectar una bomba de agua a un relé


Ahora solo queda conectar los conectores “cocodrilos” a la bomba de agua. El orden de su conexión determina la dirección del flujo de agua.

Entonces, necesitaba agua para entrar en el canal izquierdo de la bomba y salir del canal derecho. Por lo tanto, conecté el conector de "cocodrilo" del cable negro al terminal de la bomba, cerca del cual hay un punto rojo, y el otro "cocodrilo" al otro terminal de la bomba. Si conectara los "cocodrilos" en un orden diferente, el agua iría en la dirección opuesta, desde el canal derecho hacia el izquierdo.


Conectar una bomba de agua a un relé


Sistema de riego completo: el agua ingresa a la bomba a través del canal izquierdo, sale de la derecha y va a la planta

El código


Así que llegamos a lo que soy realmente bueno. Llegamos al código. Para que el software funcione con los puertos GPIO de Raspberry Pi, utilicé la biblioteca gpiozero . Es fácil de usar, oculta una gran cantidad de mecanismos de bajo nivel del programador, que generalmente debe comprender para alguien que quiere trabajar con pines GPIO. La biblioteca está bien documentada.

Antes de escribir el código, debe conectar un monitor, mouse y teclado a su Raspberry Pi. O necesita conectarse a la Raspberry Pi a través de SSH .

Después de ingresar a Raspberry Pi, vaya a la carpeta Desktopy cree una carpeta allí run. Crea una carpeta en esta carpeta classes. Y en la carpeta, classescree un archivo Hardware.py. Debe tener el siguiente código:

from gpiozero import OutputDevice

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

En este archivo, acabo de declarar una nueva clase Relay, que es descendiente de la clase OutputDevice .

Luego, en la carpeta, classescreé un nuevo archivo 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")

El propósito de esta clase es rastrear la hora actual y el momento en que se realizó el último riego.

Entonces, los archivos Hardware.pyy TimeKeeper.pyestán en la carpeta classes. Ahora, fuera de esta carpeta, creo un archivo 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()

Aquí puede cambiar los valores de las variables WATERING_TIMEy SECONDS_TO_WATERlas que le parezcan adecuadas. La primera variable determina a qué hora regar las plantas. El segundo establece la duración del riego.

Además, creé aquí un mecanismo para enviar notificaciones y recordatorios por correo electrónico. Gracias a este mecanismo, el propietario del sistema de riego recibe un correo electrónico cada vez que se enciende el sistema y riega las plantas. Además, todos los viernes recibe una carta que le recuerda que debe verificar los suministros de agua de riego. En el código, se comenta la llamada de los métodos correspondientes, como resultado, el programa puede funcionar normalmente sin configuraciones relacionadas con el correo electrónico. Si desea habilitar estos recordatorios, haga lo siguiente:

  1. Debe ingresar en la línea FROM = TO = «YOUR_EMAIL@gmail.com»y password = «YOUR_PASSWORD»su dirección de correo electrónico y contraseña de Gmail.
  2. Descomente las siguientes líneas:

    •  # 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. Debe ir aquí , iniciar sesión en su cuenta de Gmail y activar el interruptor en esta página. De lo contrario, cuando intente enviar un correo electrónico utilizando Gmail, recibirá un mensaje de error. 

Además, es importante tener en cuenta que mi sistema de recordatorio solo funciona con cuentas de Gmail.

Ahora que todo está listo para el trabajo, debería obtener la siguiente estructura de archivos y carpetas:

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

Una carpeta runse puede colocar en cualquier lugar. Decidí dejarlo en la carpeta Desktop.

No me atraía la posibilidad de conectarme a Raspberry Pi cada vez que tenía que iniciarlo water_plant.py. Me gustaría que este script se ejecute automáticamente cuando Raspberry Pi esté activado. Esto, por ejemplo, facilitaría apagar el sistema, moverlo a otro lugar, encenderlo y no tener que preocuparse por nada. Para implementar este escenario atractivo, necesitamos un equipo crontab.

Abra la ventana de terminal en la Raspberry Pi e ingrese el siguiente comando:

sudo crontab -e

En respuesta a esto, el sistema debería generar algo parecido a lo que se muestra en la siguiente figura.


Configuración de tareas cron

Agregue la siguiente línea a este archivo:

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

Entonces este archivo debe guardarse usando la combinación de teclas Ctrl+Xingresando Yy presionando Enter.

En la línea anterior, le damos a Raspberry Pi las siguientes instrucciones: "Cada vez que reinicie, ejecute el archivo water_plant.pyubicado en la carpeta runque está en la carpeta Desktop". Si su carpeta runse encuentra en una forma diferente, edite este comando en consecuencia.

Resumen


Ver el código del proyecto aquí . Si lo desea, puede clonar inmediatamente su repositorio con este comando:

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

¡Eso es todo! Ahora ya sabe cómo crear un sistema de riego automatizado para plantas de interior basado en Raspberry Pi. Ella sabe cómo regar las plantas cada 24 horas y puede enviar notificaciones y recordatorios por correo electrónico a su propietario.

¡Queridos lectores! ¿Cómo desarrollarías un sistema de riego de plantas automatizado en el hogar?


All Articles