[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:
- 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).
- Ajuste de Parámetros:
- Para modificar las distancias mínima y máxima aceptables, modifica los valores de
minDistanceymaxDistance. - Para ajustar los tiempos de activación de los relés, modifica los valores en el arreglo
relayTimes.
- 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.
- 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
relayTimesy luego se desactivará automáticamente. - Si la distancia medida está fuera del rango aceptable, el relé se desactivará inmediatamente.
- 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.