# 8 - Sensor Capacitivo de Humedad

## **Introducción:**&#x20;

Los sensores capacitivos de humedad del suelo son herramientas esenciales en la agricultura y jardinería, ya que permiten monitorear la humedad del suelo de manera eficiente. En este tutorial, aprenderás a conectar un sensor capacitivo de humedad del suelo a Arduino, leer sus valores y mostrarlos en el monitor serial, y luego mostrar los valores mapeados en una pantalla LCD I2C de 16x2.

**Lista de Materiales:**

* Arduino Uno
* Cable Arduino USB
* Sensor capacitivo de humedad del suelo
* Pantalla LCD I2C de 16x2
* Protoboard
* Cables de conexión

**Conexión del Sensor de Humedad del Suelo:** El sensor capacitivo de humedad del suelo generalmente tiene tres pines: VCC, GND y DATO.

* Conecta VCC a 5V en el Arduino
* Conecta GND a GND en el Arduino
* Conecta DATO al pin analógico A3 en el Arduino

## **Código:**

### **Paso 1:**&#x20;

**Lectura de la Humedad en el Monitor Serial**

```cpp
const int moistureSensorPin = A3;   // Pin del sensor de humedad

void setup() {
  pinMode(moistureSensorPin, INPUT);  // Configurar el pin del sensor como entrada
  Serial.begin(9600);                 // Inicializar la comunicación serial
}

void loop() {
  int moistureValue = analogRead(moistureSensorPin);  // Leer el valor del sensor

  Serial.print("Humedad del Suelo: ");
  Serial.println(moistureValue);

  delay(1000);  // Retardo de un segundo
}
```

Este código leerá la humedad del suelo y mostrará el valor en el monitor serial cada segundo.

### **Paso 2:**&#x20;

**Mostrar Valores Mapeados en una Pantalla LCD I2C**

Primero, instala la biblioteca `LiquidCrystal_I2C` en el IDE de Arduino.

Para agregar valores mínimos y máximos que definan el rango sobre el cual se mapearán las lecturas del sensor de humedad del suelo, puedes declarar dos variables al inicio del código. Estas variables representarán los límites inferior y superior del rango de lectura que esperas del sensor. Luego, puedes usar estas variables en la función `map()` para mapear las lecturas a un rango de 0 a 100.

```cpp
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

const int moistureSensorPin = A3;   // Pin del sensor de humedad

// Valores mínimos y máximos esperados del sensor de humedad
const int minValue = 300;  // Ajusta estos valores según las lecturas de tu sensor en seco y en húmedo
const int maxValue = 800;

// Configuración de la pantalla LCD I2C
LiquidCrystal_I2C lcd(0x27, 16, 2); // Asegúrate de usar la dirección correcta de tu LCD

void setup() {
  pinMode(moistureSensorPin, INPUT);  // Configurar el pin del sensor como entrada
  Serial.begin(9600);                 // Inicializar la comunicación serial
  lcd.init();                         // Iniciar la pantalla LCD
  lcd.backlight();                    // Encender la retroiluminación de la LCD
}

void loop() {
  int moistureValue = analogRead(moistureSensorPin);  // Leer el valor del sensor
  int mappedValue = map(moistureValue, minValue, maxValue, 0, 100); // Mapear el valor a un rango de 0 a 100

  // Asegurar que el valor mapeado se mantenga dentro del rango
  mappedValue = constrain(mappedValue, 0, 100);

  Serial.print("Humedad del Suelo: ");
  Serial.println(mappedValue);

  // Muestra el valor mapeado de la humedad en la pantalla LCD
  lcd.clear();                  // Limpia la pantalla
  lcd.setCursor(0, 0);          // Establece el cursor en la primera línea
  lcd.print("Humedad: ");
  lcd.print(mappedValue);
  lcd.print("%");

  delay(1000);  // Retardo de un segundo
}

```

Este código muestra la humedad del suelo mapeada a un rango de 0 a 100% en una pantalla LCD I2C. Asegúrate de ajustar la dirección I2C de la pantalla LCD si es necesario.

Para agregar un umbral (threshold) que indique si la planta está muy seca o feliz, y mostrar esta información en la pantalla LCD, puedes seguir estos pasos:

### **Paso 3:**

**Definir un Umbral y Mostrar el Estado de la Planta en la Pantalla LCD**

Primero, define un valor de umbral que determine si la planta está muy seca o no. Luego, usa este valor para decidir qué mensaje mostrar en la pantalla LCD.

Aquí está el código con el paso adicional:

```cpp
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

const int moistureSensorPin = A3;   // Pin del sensor de humedad

// Valores mínimos y máximos esperados del sensor de humedad
const int minValue = 300;  
const int maxValue = 800;

const int moistureThreshold = 40;  // Umbral de humedad del suelo (en porcentaje)

// Configuración de la pantalla LCD I2C
LiquidCrystal_I2C lcd(0x27, 16, 2); // Asegúrate de usar la dirección correcta de tu LCD

void setup() {
  pinMode(moistureSensorPin, INPUT);  // Configurar el pin del sensor como entrada
  Serial.begin(9600);                 // Inicializar la comunicación serial
  lcd.init();                         // Iniciar la pantalla LCD
  lcd.backlight();                    // Encender la retroiluminación de la LCD
}

void loop() {
  int moistureValue = analogRead(moistureSensorPin);  // Leer el valor del sensor
  int mappedValue = map(moistureValue, minValue, maxValue, 0, 100); // Mapear el valor a un rango de 0 a 100
  mappedValue = constrain(mappedValue, 0, 100);

  Serial.print("Humedad del Suelo: ");
  Serial.println(mappedValue);

  // Muestra el estado de la planta y la humedad en la pantalla LCD
  lcd.clear();                  // Limpia la pantalla
  lcd.setCursor(0, 0);          // Establece el cursor en la primera línea

  // Determinar si la planta está muy seca o feliz
  if (mappedValue < moistureThreshold) {
    lcd.print("Planta muy seca");
  } else {
    lcd.print("Planta feliz");
  }

  lcd.setCursor(0, 1);          // Mover el cursor a la segunda línea
  lcd.print("Humedad: ");
  lcd.print(mappedValue);
  lcd.print("%");

  delay(1000);  // Retardo de un segundo
}
```

En este código, se define un umbral de humedad (`moistureThreshold`) como el 40% de humedad. Si la humedad mapeada está por debajo de este umbral, se mostrará "Planta muy seca" en la pantalla LCD; de lo contrario, se mostrará "Planta feliz". La segunda línea de la pantalla LCD muestra el porcentaje de humedad mapeado.

Este tercer paso permite una interacción más intuitiva con el usuario, proporcionando una lectura rápida del estado de la planta además de la medición numérica de la humedad.

Por supuesto, puedo agregar esa funcionalidad al tutorial. Vamos a incluir una sección adicional donde se controlan dos LEDs conectados a los pines D12 y D13 del Arduino. Uno de estos LEDs se encenderá si la planta está muy seca, y el otro se encenderá si la planta está feliz.

### **Paso 4:**&#x20;

**Control de LEDs para Indicar el Estado de la Planta**

Incluiremos en el código la inicialización de los pines de los LEDs y la lógica para controlar su estado en función de la humedad del suelo.

```cpp
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

const int moistureSensorPin = A3;   // Pin del sensor de humedad
const int dryLedPin = 12;           // LED que indica que la planta está seca
const int happyLedPin = 13;         // LED que indica que la planta está feliz

// Valores mínimos y máximos esperados del sensor de humedad
const int minValue = 300;  
const int maxValue = 800;
const int moistureThreshold = 40;  // Umbral de humedad del suelo

// Configuración de la pantalla LCD I2C
LiquidCrystal_I2C lcd(0x27, 16, 2); 

void setup() {
  pinMode(moistureSensorPin, INPUT);  
  pinMode(dryLedPin, OUTPUT);        // Configurar el pin del LED seco como salida
  pinMode(happyLedPin, OUTPUT);      // Configurar el pin del LED feliz como salida
  Serial.begin(9600);                
  lcd.init();                        
  lcd.backlight();                   
}

void loop() {
  int moistureValue = analogRead(moistureSensorPin);  
  int mappedValue = map(moistureValue, minValue, maxValue, 0, 100);
  mappedValue = constrain(mappedValue, 0, 100);

  Serial.print("Humedad del Suelo: ");
  Serial.println(mappedValue);

  lcd.clear();                  
  lcd.setCursor(0, 0);          

  if (mappedValue < moistureThreshold) {
    lcd.print("Planta muy seca");
    digitalWrite(dryLedPin, HIGH);   // Encender el LED seco
    digitalWrite(happyLedPin, LOW);  // Apagar el LED feliz
  } else {
    lcd.print("Planta feliz");
    digitalWrite(dryLedPin, LOW);    // Apagar el LED seco
    digitalWrite(happyLedPin, HIGH); // Encender el LED feliz
  }

  lcd.setCursor(0, 1);          
  lcd.print("Humedad: ");
  lcd.print(mappedValue);
  lcd.print("%");

  delay(1000);  
}
```

Con esta adición, el sistema no solo proporcionará una retroalimentación visual en la pantalla LCD, sino que también indicará el estado de la planta a través de los LEDs. Este tipo de retroalimentación es útil para una rápida verificación visual del estado de la planta.

### **Conclusión:**&#x20;

Con este tutorial, has aprendido a leer la humedad del suelo con un sensor capacitivo y mostrar esos datos tanto en el monitor serial como en una pantalla LCD I2C, y controlar actuadores. Este conocimiento te permitirá integrar la monitorización de la humedad del suelo en tus proyectos de jardinería o agricultura automatizada.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://p-bit.powarsteam.com/arduino/ejercicios/8-sensor-capacitivo-de-humedad.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
