SMDByte LAB 1 · Humedad del suelo con OLED

Construye una estación de humedad de suelo con ESP32-C3, sensor capacitivo y pantalla OLED. Pulsa el botón para iniciar las mediciones; púlsalo otra vez para pausarlas. El valor también se envía al monitor serie del computador y en la pantalla OLED.

Qué aprenderás

Leer una señal analógica, calibrar dos puntos del sustrato, mostrar datos por I2C y gestionar un pulsador con antirrebote.

Componentes disponibles en SMDByte

Vista frontal completa del prototipo LAB 1 con ESP32-C3, OLED, pulsador y sensor capacitivo
Montaje frontal del LAB 1. Usa la siguiente tabla para las conexiones eléctricas.

Conexiones del prototipo

Componente Terminal ESP32-C3
Sensor capacitivo GND GND
Sensor capacitivo VCC 3V3
Sensor capacitivo AOUT GPIO4 (ADC)
OLED GND GND
OLED VDD 3V3
OLED SDA GPIO6
OLED SCL GPIO10
Pulsador Una terminal GPIO5
Pulsador Otra terminal GND
Reverso real de la placa perforada con sus soldaduras y cables
Reverso real del prototipo. Sigue la tabla de terminales y comprueba cada continuidad antes de energizar.

Comprueba las etiquetas impresas en tus módulos. Con USB desconectado, verifica continuidad y que 3V3 no esté en corto permanente con GND. Mantén la electrónica y el conector de la sonda fuera del sustrato húmedo.

Calibración usada en esta prueba

En este montaje se midieron aproximadamente 3400 ADC en seco y 1500 ADC en húmedo. El aviso inicial «Revisar riego» aparece si ADC > 2450. El porcentaje está interpolado y limitado a 0–100 entre esos dos valores: no es un porcentaje absoluto de agua ni indica por sí mismo que toda planta necesite riego. Calibra con tu propio sustrato.

Programa Arduino

Instala las bibliotecas Adafruit GFX y Adafruit SSD1306. Selecciona la placa ESP32-C3 correspondiente y abre el monitor serie a 115200 baudios.

Ver código completo del LAB 1Cerrar código⌄
Arduino · ESP32-C3Desliza para revisar el código
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

const int SENSOR = 4, BOTON = 5, SDA_OLED = 6, SCL_OLED = 10;
const int SECO = 3400, HUMEDO = 1500, UMBRAL = 2450;
Adafruit_SSD1306 oled(128, 64, &Wire, -1);
bool activo = false;
int ultima = HIGH, estable = HIGH;
unsigned long cambio = 0, muestra = 0;

void setup() {
  Serial.begin(115200);
  pinMode(BOTON, INPUT_PULLUP);
  analogReadResolution(12);
  Wire.begin(SDA_OLED, SCL_OLED);
  if (!oled.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println("OLED no detectada en 0x3C");
    while (true) delay(1000);
  }
  oled.clearDisplay(); oled.display();
  oled.ssd1306_command(SSD1306_DISPLAYOFF);
  Serial.println("Listo: pulsa para iniciar");
}

void loop() {
  unsigned long ahora = millis();
  int valorBoton = digitalRead(BOTON);
  if (valorBoton != ultima) cambio = ahora;
  if (ahora - cambio > 45 && valorBoton != estable) {
    estable = valorBoton;
    if (estable == LOW) {
      activo = !activo;
      if (activo) {
        oled.ssd1306_command(SSD1306_DISPLAYON);
        muestra = ahora - 1000;
        Serial.println("Medicion iniciada");
      } else {
        oled.clearDisplay(); oled.display();
        oled.ssd1306_command(SSD1306_DISPLAYOFF);
        Serial.println("Medicion pausada");
      }
    }
  }
  ultima = valorBoton;
  if (!activo || ahora - muestra < 1000) return;
  muestra = ahora;
  int adc = analogRead(SENSOR);
  int porcentaje = constrain(map(adc, SECO, HUMEDO, 0, 100), 0, 100);
  bool revisarRiego = adc > UMBRAL;
  Serial.printf("ADC=%d | Humedad estimada=%d%% | %s\n",
                adc, porcentaje, revisarRiego ? "Revisar riego" : "Humedad adecuada");
  oled.clearDisplay(); oled.setTextColor(SSD1306_WHITE);
  oled.setTextSize(1); oled.setCursor(0, 0); oled.print("HUMEDAD DEL SUELO");
  oled.setTextSize(2); oled.setCursor(0, 17); oled.print(porcentaje); oled.print("%");
  oled.setTextSize(1); oled.setCursor(0, 43);
  oled.print(revisarRiego ? "REVISAR RIEGO" : "HUMEDAD ADECUADA");
  oled.setCursor(0, 55); oled.print("ADC: "); oled.print(adc);
  oled.display();
}

Prueba funcional

Simulación de pantalla OLED según el código: 50%, HUMEDAD ADECUADA y ADC 2450
Ejemplo visual de la pantalla según el código: 50% y ADC 2450. Lectura simulada; los valores reales dependen del sensor y del sustrato.
  1. Al conectar el USB, la pantalla queda apagada y el monitor serie indica que el LAB está listo.
  2. Pulsa una vez: aparecen el valor ADC, un porcentaje estimado y el estado del sustrato en pantalla y por USB.
  3. Introduce solo la parte sensible de la sonda en tierra. Observa cómo cambia el valor respecto a la lectura en seco.
  4. Pulsa otra vez: se pausan las lecturas y se apaga la OLED. El ESP32-C3 continúa conectado al USB.