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);
}
