AMB electrónica Bolivia

Sistema de tendedero con sensor de lluvia

tendedero automatico

Si alguna vez has tenido que salir corriendo a recoger la ropa tendida por una lluvia repentina, sabes lo frustrante que es. En este proyecto, aplicaremos principios sencillos de automatización utilizando un Servomotor SG90 y un Sensor de Lluvia YL-83 para crear un Tendedero Automático a Escala.

Componentes Necesarios 

Para construir este modelo funcional, necesitarás los siguientes elementos. Haz clic en los enlaces para conseguir tus componentes en nuestra tienda y empezar hoy mismo:

  • 1x Arduino Uno o Nano: Nuestro microcontrolador.

  • 1x Servomotor SG90: Nuestro actuador principal para el movimiento del tendedero.

  • 1x Sensor de Lluvia YL-83: Detecta la humedad. Usaremos su salida digital (DO).

  • 1x Protoboard: Para conexiones limpias y organizadas.

  • Cables Jumper: Para las conexiones entre componentes.

  • Materiales para la Maqueta: Cartón, palitos o plástico para simular la estructura móvil del tendedero.

¡Consejo Pro! Recuerda que el Servomotor SG90 es un componente clave, y puedes aprender más sobre su funcionamiento básico y pinout en nuestra

El Circuito: Conexión Paso a Paso

El montaje es sencillo. Conectaremos el sensor de lluvia para que actúe como un interruptor digital y el servomotor al pin PWM para controlar la posición.

diagrama tendedero

Conexión del Sensor de Lluvia (Input)

El módulo del Sensor de Lluvia (YL-83 viene con un comparador que nos permite usar la salida digital (DO), lo cual simplifica la lógica de programación a un simple estado HIGH (seco) o LOW (mojado).

  • VCC (Módulo): 5V (Arduino)

  • GND (Módulo): GND (Arduino)

  • DO (Salida Digital): Pin Digital 2 (Arduino)

Conexión del Servomotor SG90 (Output)

El SG90 necesita una conexión de 5V y un pin PWM para la señal.

  • Cable Rojo (VCC): 5V (Arduino)

  • Cable Marrón (GND): GND (Arduino)

  • Cable Naranja/Amarillo (Señal): Pin Digital 9 (Arduino)

Código Arduino: Lógica de Programación

Nuestra lógica de programación se basará en una simple máquina de estados: el tendedero estará en estado ABIERTO (posición 0°) hasta que el sensor de lluvia cambie el estado a CERRADO (posición 180°).

1. Variables y Constantes

Declaramos las posiciones angulares como constantes. Como expertos, evitamos usar números mágicos directamente en el código para mejorar la legibilidad y el mantenimiento.

2. Funciones setup() y loop()

En el setup(), inicializamos el servo en la posición ABIERTO (asumiendo que el clima está bien por defecto). El loop() se encargará de la lógica de detección y movimiento.

3. Explicación de la Lógica Clave

 

El corazón de este código reside en la optimización dentro del loop().

Programación Limpia: La condición if (miServo.read() != POS_CERRADO) es crucial. Esto evita que el servomotor reciba constantemente el comando de moverse a una posición donde ya se encuentra. Si el servo ya está cerrado, no hay necesidad de enviarle el comando de cierre repetidamente, lo que reduce el consumo de energía y la vibración innecesaria,

				
					#include <Servo.h>

// 1. Declaración de Objetos y Pines
Servo miServo; // Crear el objeto Servo
const int pinSensorLluvia = 2; // Pin digital conectado a la salida DO del YL-83

// 2. Definición de Estados del Servo (Posiciones en grados)
const int POS_ABIERTO = 0;   // Tendedero fuera (Seco)
const int POS_CERRADO = 180; // Tendedero dentro (Lluvia)

// --- VARIABLES DE CONTROL ---
// Usamos una variable para rastrear el último estado conocido
// Esto mejora la robustez y evita enviar comandos repetidos.
int estadoActualTendedero = POS_ABIERTO; 

void setup() {
  // Inicialización del Servo en el Pin 9 (PWM)
  miServo.attach(9);
  
  // Inicialización del Sensor de Lluvia (YL-83 DO)
  // IMPORTANTE: Lo configuramos como INPUT simple.
  // La mayoría de estos módulos son 'Activos en Bajo' (LOW al mojar).
  pinMode(pinSensorLluvia, INPUT); 
  
  // Inicializar el tendedero en posición abierta
  miServo.write(POS_ABIERTO); 
  
  Serial.begin(9600);
  Serial.println("Tendedero Automatico Inicializado. Posicion: ABIERTO.");
}

void loop() {
  // Leer el estado digital del sensor de lluvia
  int estadoLluvia = digitalRead(pinSensorLluvia);
  
  // ----------------------------------------------------
  // Lógica de Tendedero Cerrado (Prioridad: Detección de Lluvia)
  // ----------------------------------------------------
  
  // Condición de Lluvia: El sensor digital está en LOW (o 0)
  if (estadoLluvia == LOW) {
    if (estadoActualTendedero != POS_CERRADO) {
      // Actuar: Cerrar el tendedero
      miServo.write(POS_CERRADO);
      estadoActualTendedero = POS_CERRADO; // Actualizar estado
      Serial.println("¡Lluvia Detectada! -> Cerrando Tendedero.");
      delay(1500); // Pausa para permitir el movimiento completo
    }
  } 
  
  // ----------------------------------------------------
  // Lógica de Tendedero Abierto
  // ----------------------------------------------------
  
  // Condición de Seco: El sensor digital está en HIGH (o 1)
  else {
    if (estadoActualTendedero != POS_ABIERTO) {
      // Actuar: Abrir el tendedero
      miServo.write(POS_ABIERTO);
      estadoActualTendedero = POS_ABIERTO; // Actualizar estado
      Serial.println("Cielo Despejado -> Abriendo Tendedero.");
      delay(1500);
    }
  }
}
				
			

Resultados y Próximos Pasos

Una vez cargado el código y conectado el circuito, puedes simular la lluvia dejando caer unas gotas de agua sobre el sensor. El servomotor debe moverse rápidamente a la posición de cierre (180°). Al secar el sensor, el servomotor regresará automáticamente a la posición inicial (0°).

Scroll al inicio