.. note::

    ¡Hola, bienvenido a la Comunidad de Aficionados a Raspberry Pi, Arduino y ESP32 de SunFounder en Facebook! Profundiza en Raspberry Pi, Arduino y ESP32 con otros entusiastas.

    **¿Por qué unirse?**

    - **Soporte de expertos**: Resuelve problemas posventa y desafíos técnicos con ayuda de nuestra comunidad y equipo.
    - **Aprender y compartir**: Intercambia consejos y tutoriales para mejorar tus habilidades.
    - **Vistas previas exclusivas**: Obtén acceso anticipado a anuncios de nuevos productos y avances.
    - **Descuentos especiales**: Disfruta de descuentos exclusivos en nuestros productos más nuevos.
    - **Promociones festivas y sorteos**: Participa en sorteos y promociones de fiestas.

    👉 ¿Listo para explorar y crear con nosotros? Haz clic en [|link_sf_facebook|] y únete hoy!

.. _py_plant_monitor:

6.8 Monitor de Plantas
===============================

¡Bienvenido al proyecto Monitor de Plantas!

En este proyecto, utilizaremos una placa ESP32 para crear un sistema que nos ayude a cuidar de nuestras plantas. Con este sistema, podemos monitorear la temperatura, humedad, humedad del suelo y niveles de luz de nuestras plantas, y asegurarnos de que reciban el cuidado y atención que necesitan para prosperar.

**Componentes Requeridos**

Para este proyecto, necesitamos los siguientes componentes.

Es definitivamente conveniente comprar un kit completo, aquí está el enlace:

.. list-table::
    :widths: 20 20 20
    :header-rows: 1

    *   - Nombre	
        - ELEMENTOS EN ESTE KIT
        - ENLACE
    *   - Kit de Inicio ESP32
        - 320+
        - |link_esp32_starter_kit|

También puedes comprarlos por separado en los enlaces a continuación.

.. list-table::
    :widths: 30 20
    :header-rows: 1

    *   - INTRODUCCIÓN DEL COMPONENTE
        - ENLACE DE COMPRA

    *   - :ref:`cpn_esp32_wroom_32e`
        - |link_esp32_wroom_32e_buy|
    *   - :ref:`cpn_esp32_camera_extension`
        - |link_esp32_extension_board|
    *   - :ref:`cpn_breadboard`
        - |link_breadboard_buy|
    *   - :ref:`cpn_wires`
        - |link_wires_buy|
    *   - :ref:`cpn_resistor`
        - |link_resistor_buy|
    *   - :ref:`cpn_dht11`
        - |link_dht11_buy|
    *   - :ref:`cpn_lcd`
        - |link_i2clcd1602_buy|
    *   - :ref:`cpn_pump`
        - \-
    *   - :ref:`cpn_l293d`
        - \-
    *   - :ref:`cpn_button`
        - |link_button_buy|
    *   - :ref:`cpn_photoresistor`
        - |link_photoresistor_buy|
    *   - :ref:`cpn_soil_moisture`
        - |link_soil_moisture_buy|

**Esquemático**

.. image:: ../../img/circuit/circuit_6.8_plant_monitor_l293d.png

El sistema utiliza un sensor DHT11 para medir los niveles de temperatura y humedad del entorno circundante. 
Mientras tanto, un módulo de humedad del suelo se utiliza para medir el nivel de humedad del suelo y un fotoresistor se utiliza para 
medir el nivel de luz. Las lecturas de estos sensores se muestran en una pantalla LCD, y se puede controlar una bomba de agua 
usando un botón para regar la planta cuando sea necesario.

IO32 tiene una resistencia interna de pull-down de 1K, y por defecto, está en un nivel lógico bajo. Cuando se presiona el botón, se establece una conexión a VCC (alto voltaje), resultando en un nivel lógico alto en IO32.


**Conexión**

.. note::

    Se recomienda aquí insertar la batería y luego deslizar el interruptor en la placa de expansión a la posición ON para activar el suministro de la batería.


.. image:: ../../img/wiring/6.8_plant_monitor_l293d_bb.png
    :width: 800

**Código**

.. note::

    * Abre el archivo ``6.8_plant_monitor.py`` ubicado en el camino ``esp32-starter-kit-main\micropython\codes``, o copia y pega el código en Thonny. Luego, haz clic en "Ejecutar script actual" o presiona F5 para ejecutarlo.
    * Asegúrate de seleccionar el intérprete "MicroPython (ESP32).COMxx" en la esquina inferior derecha. 



.. code-block:: python

      from machine import ADC, Pin
      import time
      import dht
      from lcd1602 import LCD

      # DHT11
      dht11 = dht.DHT11(Pin(13))

      # Humedad del suelo
      moisture_pin = ADC(Pin(14))
      moisture_pin.atten(ADC.ATTN_11DB)

      # Fotoresistor
      photoresistor = ADC(Pin(35))
      photoresistor.atten(ADC.ATTN_11DB)

      # Botón y bomba
      button = Pin(32, Pin.IN)

      motor1A = Pin(27, Pin.OUT)
      motor2A = Pin(26, Pin.OUT)

      # Configuración del LCD I2C1602
      lcd = LCD()

      # Rotar la bomba
      def rotate():
      motor1A.value(1)
      motor2A.value(0)

      # Detener la bomba
      def stop():
      motor1A.value(0)
      motor2A.value(0)

      estado_del_boton = False

      # Definir la función de callback del botón para alternar el estado del botón
      def button_callback(pin):
      global estado_del_boton
      estado_del_boton = not estado_del_boton

      # Adjuntar la función de callback del botón al borde ascendente del pin del botón
      button.irq(trigger=Pin.IRQ_RISING, handler=button_callback)

      pagina = 0
      temp = 0
      humi = 0
            
      try:
      while True:
            
            # Si el botón está presionado y el estado del botón es Verdadero
            if estado_del_boton:
                  print("rotar")
                  rotate()

            # Si el botón está presionado de nuevo y el estado del botón es Falso
            if not estado_del_boton:
                  print("detener")
                  stop()
            time.sleep(2)

            # Limpiar la pantalla LCD
            lcd.clear()
            
            # Alternar el valor de la variable pagina entre 0 y 1
            pagina=(pagina+1)%2
            
            # Cuando la pagina es 1, mostrar temperatura y humedad en el LCD1602
            if pagina is 1:
                  try:
                  # Medir temperatura y humedad
                  dht11.measure()

                  # Obtener valores de temperatura y humedad
                  temp = dht11.temperature()
                  humi = dht11.humidity()
                  except Exception as e:
                  print("Error: ", e)         

                  # Mostrar temperatura y humedad
                  lcd.write(0, 0, "Temp: {}\xDFC".format(temp))
                  lcd.write(0, 1, "Humi: {}%".format(humi))

            # Si la pagina es 0, mostrar la humedad del suelo y luz
            else:
                  luz = photoresistor.read()
                  humedad = moisture_pin.read()

                  # Limpiar la pantalla LCD
                  lcd.clear()

                  # Mostrar el valor de la humedad del suelo y luz
                  lcd.write(0, 0, f"Humedad: {humedad}")
                  lcd.write(0, 1, f"Luz: {luz}")

      except KeyboardInterrupt:
      # Detener el motor cuando se captura KeyboardInterrupt
      stop()



* Cuando el código está ejecutando, el LCD I2C1602 muestra alternativamente temperatura y humedad, así como valores analógicos de humedad del suelo e intensidad de luz, con un intervalo de 2 segundos.
* Presiona el botón para iniciar la bomba de agua, y presiónalo de nuevo para detener la bomba de agua.

.. note:: 

    Si el código y la conexión son correctos, pero el LCD aún no muestra ningún contenido, puedes ajustar el potenciómetro en la parte trasera para aumentar el contraste.

