Sistema de riego automático

Proyecto para poder regar plantas de manera automática, con un sensor de humedad del suelo y una pantalla OLED:

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// Pines
int sensorHumedad = A1;  // Pin analógico del sensor de humedad
int motor = 7;           // Pin digital para el motor o relé
int botonOn = 12;        // Pulsador para encender el sistema
int botonOff = 13;       // Pulsador para apagar el sistema

// Variables
int valorHumedad = 0;
bool sistemaActivo = false;  // Estado del sistema (apagado por defecto)
bool estadoBotonOnAnterior = HIGH;
bool estadoBotonOffAnterior = HIGH;
unsigned long ultimoTiempoBoton = 0;
const unsigned long retardoAntirrebote = 200;  // milisegundos

Adafruit_SSD1306 display(128, 64, &Wire, -1);

void setup() {
  Serial.begin(9600);
  pinMode(sensorHumedad, INPUT);
  pinMode(motor, OUTPUT);
  digitalWrite(motor, LOW);

  pinMode(botonOn, INPUT_PULLUP);   // Pulsador ON (usa resistencia interna)
  pinMode(botonOff, INPUT_PULLUP);  // Pulsador OFF

  // Inicializar pantalla OLED
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("No se encontró la pantalla OLED"));
    while (true);
  }

  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0, 0);
  display.println("Sistema apagado");
  display.display();
}

void loop() {
  unsigned long tiempoActual = millis();

  // Leer botones
  bool estadoBotonOn = digitalRead(botonOn);
  bool estadoBotonOff = digitalRead(botonOff);

  // Detectar si se presionó el botón ON (flanco descendente)
  if (estadoBotonOn == LOW && estadoBotonOnAnterior == HIGH && (tiempoActual - ultimoTiempoBoton) > retardoAntirrebote) {
    sistemaActivo = true;
    ultimoTiempoBoton = tiempoActual;
    Serial.println("Boton ON presionado: Sistema ACTIVADO");
  }

  // Detectar si se presionó el botón OFF (flanco descendente)
  if (estadoBotonOff == LOW && estadoBotonOffAnterior == HIGH && (tiempoActual - ultimoTiempoBoton) > retardoAntirrebote) {
    sistemaActivo = false;
    digitalWrite(motor, LOW);  // Apaga el motor si se apaga el sistema
    ultimoTiempoBoton = tiempoActual;
    Serial.println("Boton OFF presionado: Sistema APAGADO");
  }

  // Actualizar estado anterior de los botones
  estadoBotonOnAnterior = estadoBotonOn;
  estadoBotonOffAnterior = estadoBotonOff;

  // Mostrar estado actual
  display.clearDisplay();
  display.setTextSize(1);
  display.setCursor(0, 0);

  if (sistemaActivo) {
    display.println("Sistema: ACTIVO");
    valorHumedad = analogRead(sensorHumedad);
    Serial.print("Nivel de humedad: ");
    Serial.println(valorHumedad);

    display.print("Humedad: ");
    display.println(valorHumedad);

    if (valorHumedad < 400) {
      digitalWrite(motor, HIGH);
      display.setCursor(0, 20);
      display.println("Suelo seco");
      display.println("Motor encendido");
      Serial.println("Suelo seco, motor encendido");
    } else if (valorHumedad > 600) {
      digitalWrite(motor, LOW);
      display.setCursor(0, 20);
      display.println("Suelo humedo");
      display.println("Motor apagado");
      Serial.println("Suelo humedo, motor apagado");
    } else {
      digitalWrite(motor, LOW);
      display.setCursor(0, 20);
      display.println("Humedad media");
      display.println("Motor apagado");
      Serial.println("Humedad media, motor apagado");
    }
  } else {
    display.println("Sistema: APAGADO");
    display.setCursor(0, 20);
    display.println("Motor OFF");
    Serial.println("Sistema apagado manualmente");
  }

  display.display();
  delay(200);
}
2 Likes

there should be no else condition, otherwise motor = LOW if (valorHumedad >= 400

Tu tema ha sido movido a la sección en español del foro. Utiliza el inglés en las secciones en inglés del foro.

Moderador
Has publicado tu hilo en el foro en inglés usando español. Debes respetar el idioma de cada foro.
Si escribes en español debes postear aquí y si lo haces en el foro en inglés debes usar ese idioma.

Respecto del código no tengo mucho que opinar. Pero si con respecto al sensor de humedad de suelo. Ese sensor se suele degradar de una manera muy vertiginosa en menos de 1 mes.
Para evitarlo debes alimentarlo solo cuando vayas a medir y luego desconectarlo o se generará electrólisis y te quedarás sin contactos en poco tiempo.

1 Like