4 Relés controlados por sesnsores ultrasonicos y pulsadores. Funciona perfecto!

[code]
                                                                // Definición de distancia mínima y máxima aceptable
#define minDistance 50                                          
#define maxDistance 200                                         

const int trigPins[4] = {2, 4, 6, 8};                           // Pines de disparo para los sensores ultrasónicos
const int echoPins[4] = {3, 5, 7, 9};                           // Pines de eco para los sensores ultrasónicos
const int relayPins[4] = {10, 11, 12, 13};                      // Pines de control para los relés
const int buttonPins[4] = {A0, A1, A2, A3};                     // Pines de entrada para los botones

const int relayTimes[4] = {10000, 2000, 2000, 2000};            // Tiempos de activación para los relés

boolean relayStates[4] = {HIGH, HIGH, HIGH, HIGH};              // Estados iniciales de los relés (HIGH para desactivarlos)
unsigned long previousMillis[4] = {0, 0, 0, 0};                 // Almacena el tiempo anterior para cada sensor
unsigned long timeWithinRange[4] = {0, 0, 0, 0};                // Tiempo dentro del rango aceptable para cada sensor
bool withinRangeFlags[4] = {false, false, false, false};        // Indica si el sensor está dentro del rango aceptable
bool buttonPressedFlags[4] = {false, false, false, false};      // Indica si el botón está presionado para cada sensor

const unsigned long minTimeWithinRange = 500;                   // Tiempo mínimo dentro del rango aceptable para activar el relé

void setup() {
  Serial.begin(9600);                                           // Inicializa la comunicación serial a 9600 baudios

  for (int i = 0; i < 4; i++) {                                 // Configuración de los pines
    pinMode(relayPins[i], OUTPUT);                              // Los pines de los relés se configuran como salida
    pinMode(trigPins[i], OUTPUT);                               // Los pines de disparo se configuran como salida
    pinMode(echoPins[i], INPUT);                                // Los pines de eco se configuran como entrada
    pinMode(buttonPins[i], INPUT_PULLUP);                       // Los pines de botón se configuran como entrada con pull-up
  }
}

void loop() {
  for (int i = 0; i < 4; i++) {                                 // Iteración sobre cada sensor
    digitalWrite(trigPins[i], LOW);                             // Se envía un pulso de bajo nivel al pin de disparo
    delayMicroseconds(2);                                       // Pequeña pausa
    digitalWrite(trigPins[i], HIGH);                            // Se envía un pulso de alto nivel al pin de disparo
    delayMicroseconds(10);                                      // Pulso de 10 microsegundos
    digitalWrite(trigPins[i], LOW);                             // Se vuelve a establecer el pin de disparo a bajo nivel
    unsigned long duration = pulseIn(echoPins[i], HIGH);        // Se mide la duración del eco
    unsigned long distance = duration / 58.2;                   // Se calcula la distancia en centímetros

    Serial.print("SENSOR ");                                    // Imprime el número del sensor
    Serial.println(i + 1);                                      // (i + 1) para que los sensores comiencen desde 1
    Serial.print(" Distance = ");                               // Imprime la distancia medida por el sensor
    Serial.println(distance);                                   // Imprime la distancia medida
    Serial.print(" Relay State = ");                            // Imprime el estado del relé
    Serial.println(relayStates[i] ? "HIGH" : "LOW");            // Imprime "HIGH" si la salida de relé está en +5V , de lo contrario, "LOW"
    Serial.print(" Button State = ");                           // Imprime el estado del botón
    Serial.println
    (buttonPressedFlags[i] ? "    PRESSED" : "RELEASED");       // Imprime "PRESSED" si el botón está presionado o "RELEASED"
    Serial.println();                                           // Línea en blanco
    
    if (distance >= minDistance && distance <= maxDistance) {    // Si la distancia está dentro del rango aceptable
      timeWithinRange[i] += 500;                                 // Se incrementa el tiempo dentro del rango
      if (timeWithinRange[i] >= minTimeWithinRange) {            // Si el tiempo dentro del rango es suficiente
        withinRangeFlags[i] = true;                              // Se establece el indicador de rango dentro del rango
      }
    } else {                                                     // Si la distancia está fuera del rango aceptable
      timeWithinRange[i] = 0;                                    // Se reinicia el tiempo dentro del rango
      withinRangeFlags[i] = false;                               // Se indica que el sensor está fuera del rango
    }

    buttonPressedFlags[i] = digitalRead(buttonPins[i]) == LOW;   // Se comprueba si el botón está presionado

    if (withinRangeFlags[i] || buttonPressedFlags[i]) {          // Si el sensor está dentro del rango o el botón está presionado
      relayStates[i] = LOW;                                      // Se activa el relé (nivel bajo)
      previousMillis[i] = millis();                              // Se guarda el tiempo actual
    }

    if (relayStates[i] == LOW && millis() - previousMillis[i] >= relayTimes[i]) { // Si el relé está activado y ha pasado el tiempo requerido
      relayStates[i] = HIGH;                                     // Se desactiva el relé (nivel alto)
    }
  }

  for (int i = 0; i < 4; i++) {                                  // Iteración sobre cada relé
    digitalWrite(relayPins[i], relayStates[i]);                  // Se actualiza el estado del relé
  }

  delay(500);                                                    // Pequeña pausa antes de la próxima iteración
}

[/code]

Hola, comparto éste proyecto que funciona de maravilla para controlar salidas de relés con sensores de distancia y pulsadores. Dejo el manual y el código.

Saludos!

Descripción General:

Este código actúa sobre cuarto relés, cuatro sensores ultrasónicos y cuatro botones.

Los relés se activan cuando los sensores ultrasónicos miden que la distancia está dentro de un rango definido o cuando se presiona el botón asociado.

El estado de los sensores, relés y botones se muestra en el monitor serial.

Además, se pueden ajustar los tiempos de activación de los relés, así como las distancias mínima y máxima aceptables.

Manual de Uso:

  1. Configuración de Hardware:
  • Conecta los sensores ultrasónicos a los pines de disparo (trigPins) y eco (echoPins).
  • Conecta los relés a los pines de control (relayPins).
  • Conecta los botones a los pines de entrada (buttonPins).
  1. Ajuste de Parámetros:
  • Para modificar las distancias mínima y máxima aceptables, modifica los valores de minDistance y maxDistance.
  • Para ajustar los tiempos de activación de los relés, modifica los valores en el arreglo relayTimes.
  1. Visualización de Datos:
  • Abre el monitor serial a una velocidad de 9600 baudios para ver los datos.
  • La distancia medida por cada sensor, el estado del relé correspondiente y el estado del botón asociado se imprimirán en el monitor serial.
  • Habrá una línea en blanco entre cada conjunto de datos para una mejor visualización.
  1. Interacción:
  • Si la distancia medida por un sensor está dentro del rango aceptable o el botón asociado está presionado, el relé correspondiente se activará.
  • El relé permanecerá activado durante el tiempo especificado en relayTimes y luego se desactivará automáticamente.
  • Si la distancia medida está fuera del rango aceptable, el relé se desactivará inmediatamente.
  1. Pausa entre Iteraciones:
  • Se incluye una pequeña pausa de 500 milisegundos entre iteraciones en el bucle principal para un funcionamiento más suave.

CONEXIONES:

const int trigPins[4] = {2, 4, 6, 8};                           // Pines de disparo para los sensores ultrasónicos
const int echoPins[4] = {3, 5, 7, 9};                           // Pines de eco para los sensores ultrasónicos
const int relayPins[4] = {10, 11, 12, 13};                      // Pines de control para los relés
const int buttonPins[4] = {A0, A1, A2, A3};                     // Pines de entrada para los botones

AJUSTE DE TIEMPOS:
en este caso el primer relé se activa por 10 segundos y los demás por 2

const int relayTimes[4] = {10000, 2000, 2000, 2000};            // Tiempos de activación para los relés

AJUSTE DE RANGO DE DISTANCIA DE DISPARO:

 // Definición de distancia mínima y máxima aceptable                                                             
#define minDistance 50                                          
#define maxDistance 200                                        

Todo bien, parece una tarea escolar y qué debes hacer o qué no hace el código porque pones un código y colocas una serie de indicaciones y la pregunta cuál es?

Gracias Surbyte, no le hace falta nada al codigo o al manual, sólo lo quise compartir por si a alguien le sirve, quizá entendi mal pero creía que es la costumbre de los que usan Arduino compartir los códigos.
Si no sirve aquí o hay que ponerlo en otro lado me avias que lo borro.
Hoy me hice la cuenta en el foro y es la primera vez que escribo codigo, por eso la ignorancia
Saludos

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.