Cortar la electricidad de una cabina cuando está vacía

Pues el proyecto en principio me pareció simple, pero no lo es tanto.
Tengo una pequeña cabina insonorizada, de 2,40 m x 1 m, que utilizo para tocar música, evitando de esta manera enemistarme con los vecinos (y tocar a cualquier hora, que mis horarios de trabajo son como menos desordenados.

Un esquema de la cabina:

Es un espacio simple, el PC está por fuera de la cabina, por lo cual pensé en utilizar un sensor ultrasónico colocado en un rincón (círculo rojo en el esquema) de modo de medir las distancias en la diagonal de la cabina, así cuando está vacía mediría el rincón opuesto y en ese caso no haría nada, cuando la cabina está ocupada el sensor mide distancias menores y activa un relé (por las dudas un relé de alta potencia de 30A, que aunque es mucho, pero por las dudas) que dá corriente a todo lo que está dentro (la pantalla del PC, los altavoces, la luz, el extractor de aire, un pequeño ventilador para el verano).

He hecho pruebas con un sensor HC-SR04 pero el probema es que a veces aunque el objeto está delante, apaga el relé por un instante y luego vuelve a encenderlo.
Le puse un retraso de unos segundos para evitarlo pero espero que haya maneras más efectivas.
Pensé que agregando un segundo sensor tal vez se evite el problema, pero no quisiera comenzar con el proyecto y tener que tirar todo a la basura.

Pongo el sketch:

/*
  HC-SR04 conexiones: VCC al arduino 5v; GND al arduino GND
                      Echo al Arduino pin 6; Trig al Arduino pin 7
 */
#define Eco 6
#define Gatillo 7
#define Relay  12
long duracion, distancia;   
 
void setup() 
{                
  Serial.begin (9600);                  // inicializa el puerto seria a 9600 baudios
  pinMode(Eco, INPUT);                  // define el pin 6 como entrada (echo)
  pinMode(Gatillo, OUTPUT);             // define el pin 7 como salida  (triger)
  pinMode(Relay, OUTPUT);               // Define el pin 12 como salida al relé
}
  
void loop() 
{
  digitalWrite(Gatillo, LOW);
  delayMicroseconds(2);
  digitalWrite(Gatillo, HIGH);            // genera el pulso de trigger por 10 ms
  delayMicroseconds(10);
  digitalWrite(Gatillo, LOW);
  
  duracion = pulseIn(Eco, HIGH);
  distancia = (duracion/2) / 29;          // calcula la distancia en centimetros
  
  if (distancia > 200)                    // si la distancia es mayor 
    {Serial.println("Relay Apagado");
     digitalWrite(12, 0);delay(1000);}    // no mide nada
  else 
     {Serial.print(distancia);            // envia el valor de la distancia por el puerto serial
      Serial.println(" cm");              // le coloca a la distancia los centimetros "cm"
      digitalWrite(12, 1);                // en bajo el pin 12 
      Serial.println("Relay Encendido");
      delay(5000);}
}

Hola, no se si te servirá, pero en los sistemas de conexión/descongestione, de alumbrado por sensor de presencia, siempre se usa un retardo antes de activar o desactivar las luminarias, no se lo critico que es para ti el no tener retrasos en el apagado del suministro eléctrico, pero si es por ahorro de corriente, gastas mas en encender y apagar un equipo musical y alumbrado correspondiente que en mantenerlo encendido 30 segundos mas.

Lo mejor que puedes hacer es un doble sensor ultrasónico. Algo que detecte que entras o que sales.
Si entras enciende. Si sales apaga.

Asi que pones uno y pegado o separado otro de modo que no interfieran uno con otro.
Al detectar presencia uno, y luego el otro enciendes y cuando es al revés apagas.

Evidentemente lo que te dice Surbyte, aumentará la eficacia de los sensores, la cuestión es, si es imprescindible un apagado instantáneo de la corriente, yo no se que es lo que tienes conectado pero te recomiendo que no juegues con las conexiones - desconexiones rápidas, si no te es imprescindible el corte instantáneo, yo colocaría un retardo de al menos 20 segundos y si en ese plazo de tiempo no hay señales de presencia apagaría, en caso del encendido, no creo que sea necesario esto y puedes realizar el encendido instantáneo. Por supuesto la recomendación de Surbyte aumentara bastante la eficacia del sistema.

Como he puesto al principio, he pensado tanto en dos sensores (parecido a lo que aconseja surbyte) como en un retraso (en el sketch le puse 5 segundos, pero como opina elduino no hay problema en poner un retraso mayor).

La consulta la hago porque he observado en las pruebas que he hecho, que cuando el objeto a medir (en este caso yo) se mueve, aunque no salga del "cono" de 15º teórico de medición del sensor, por instantes desconecta el relé.

Seguramente con dos, o mejor con tres sensores y un condicional "||"que mantenga el relé cerrado mientras cualquiera de los sensores mida una distancia menor que la de referencia, debería funcionar.

surbyte:
Asi que pones uno y pegado o separado otro de modo que no interfieran uno con otro.
Al detectar presencia uno, y luego el otro enciendes y cuando es al revés apagas.

No sé si te he entendido bien, sería como poner uno en el marco de la puerta de entrada y el otro dentro, de modo que cuando se dá la secuencia "sensorPuerta ON seguido de sensorHabitación ON" se enciende hasta que se dé la secuencia "sensorHabitación OFF seguido de sensorPuerta ON" que entonces apagaría?

Si tienes problemas por sonido, tal vez algun rebote de alta frecuencia aunque lo dudo, usa barreras IR y no tendras problemas.

Si lo has solucionado con un pequeño retraso por que añadir otro sensor??

GO_zalo:
Si lo has solucionado con un pequeño retraso por que añadir otro sensor??

Es posible que lleves razón, pero bueno, en lugar de agregarle un sensor más le he puesto dos más.

El problema es que no sé qué estoy escribiendo mal en el sketch que el "if" no funciona, el condicional debe activar el relé si cualquiera de los tres sensores mide menos de una cierta distancia, pero no funciona (probablemente sea algo mal escrito), he hecho una captura de pantalla para mostrar la salida por el puerto serie y más abajo pongo el sketch tal cual está ahora mismo.

La imagen:

El Sketch:

/*Programa que activa un relé que conecta la entrada eléctrica a una cabina insonorizada.
 *Funciona con un Arduino Nano y tres sensores ultrasónicos, activando un relé cuando las
 *mediciones de alguno de los tres sensores detecta una distancia menor de la establecida
 *para la cabina vacía. Utilizo un cable de 6 hilos del tipo telefónico entre el Arduino 
 *y los tres sensores, utilizando un solo cable para el Trigger de los tres sensores.
 */

long distancia1; long distancia2; long distancia3;
long tiempo1; long tiempo2; long tiempo3;

void setup()
{
  Serial.begin(9600);
  pinMode(12, OUTPUT);    //Trigger CABLE BLANCO
  pinMode(8, OUTPUT);     //Relé
  pinMode(2, INPUT);      //Sensor1 Izquierdo CABLE AMARILLO
  pinMode(3, INPUT);      //Sensor2 Centro CABLE AZUL
  pinMode(4, INPUT);      //Sensor3 Derecha CABLE GRIS
}

void loop(){
  ActivaSensor();
  tiempo1=pulseIn(2, HIGH);   distancia1 = int(0.017*tiempo1);
  Serial.print("Distancia1 ");  Serial.print(distancia1); Serial.println(" cm");
  delay(10);
  ActivaSensor();
  tiempo2=pulseIn(3, HIGH);   distancia2 = int(0.017*tiempo2);
  Serial.print("Distancia2 ");  Serial.print(distancia2); Serial.println(" cm");
  delay(10);
  ActivaSensor();
  tiempo3=pulseIn(4, HIGH);   distancia3 = int(0.017*tiempo3);
  Serial.print("Distancia3 ");  Serial.print(distancia3);  Serial.println(" cm");

  if (distancia1 = 0)     // A veces los sensores dan cero en alguna medición (?)
    {distancia1 = 200;}   // y como el condicional activa el relé cuando cualquiera
  if (distancia2 = 0)     // de los tres sensores mida una distancia menor de la
    {distancia2 = 200;}   // establecida, lo cual puede suceder mientras no haya  
  if (distancia3 = 0)     // nadie en la cabina, en ese caso lo cambio a una distancia
    {distancia3=200;}     // mayor para que por ese sensor no se active el relé

  if ((distancia1<=120) || (distancia2<=120) || (distancia3<=120))
    {digitalWrite(8, 1);  Serial.println("Relay conectado");} 
  else
    {digitalWrite(8, 0);  Serial.println("Relay desconectado");}
  delay(5000);
}
void ActivaSensor()
{
digitalWrite(12,LOW);delayMicroseconds(5);
digitalWrite(12, HIGH);delayMicroseconds(10);
}

Dentro de un if debes usar == no un solo =

GO_zalo:
Dentro de un if debes usar == no un solo =

Pero eso es si solo quieres poner "igual", en el caso de "menor o igual es "<="

albertoG1:
Pero eso es si solo quieres poner "igual", en el caso de "menor o igual es "<="

No se a que viene está cita y respuesta, el menor o igual ya lo ha puesto bien

Ok, la pregunta sigue siendo porqué aunque no se cumple la condición, ejecuta igualmente lo que está dentro del condicional "if"

Disculpa GO_zalo, es que obsesionado con el if con los condicionales "||" no me dí cuenta que los que estaban mal escritos eran los tres if que ponñian a cero cada medición, por eso siempre se cumplía el if que venía a continuación, mia culpa.
Gracias, resuleto, a ver si termino la instalación con el relé y una fuente de alimentación y funciona todo.

Edito por que hemos cruzado reapuestas.

Ha sido una placer ayuda sería interesante tener una foto del mecanismo montado y de la sala si fuera posible

Gracias!

Quiza usando el sensor de presencia solo para activar el relé cableandolo con realimentacion a la bobina, para cuando entres a la habitacion solo se active, y un final de carrera o otro sensor de presencia fuera de la cabina que actue como desconexion.

Evitarias que el sensor este todo el rato monitorizando, ya contaras....

Mar1n0:
Quiza usando el sensor de presencia solo para activar el relé cableandolo con realimentacion a la bobina,

¿Lo de realimentar el relé, significa manteniendo un condicional que no vuelva a hacer mediciones pero mantenga en HIGH el pin de salida al relé?

Mar1n0:
para cuando entres a la habitacion solo se active, y un final de carrera o otro sensor de presencia fuera de la cabina que actue como desconexion.

Aquí el problema es que es una cabina que está dentro de una vivienda (en acústica es lo que se denomina "una caja dentro de otra caja", está dentro de la habitación - estudio) y donde se mueve mi familia contínuamente, y dos perros, o sea que se cortaría la corriente cada dos por tres.

Respondiendo a GO_zalo pongo primero el esquema de la cabina con la ubicación de los tres sensores y sus ángulos de captación (en principio fue la razón de poner tres porque he considerado que de lo contrario hay "zonas muertas" fuera del alcance de los sensores.

Ahí vá una foto de la colocación de los tres sensores:

Y el Arduino conectado a los 6 cables y el relé:

Son 3,5 m de cable, porque la entrada de 220 AC está casi en el fondo de la cabina (marcado en el esquema de la cabina).
Aún no he montado todo con su fuente de alimentación porque no quiero cometer errores, prefiero dar marcha atrás si hay opiniones que me orienten en una mejor solución.

La ubicación de los sensores esta mal
Los sensores y hablo de 2 deben estar en un punto tal que se detecte el ingreso/egreso de una persona.
imagina una puerta de pasillo, entonces colocas los dos sensores separados 10 cmts uno de otro de un lado de la puerta.

Quieres saber o contar que ingresa/sale de la habitación.
Mira el esquema.

Editado luego de la respuesta de AlbertoG1

Gracias surbyte, como siempre, eres la diplomacia llevada al súmum :grin: :grin: :grin: Es Broma (a propósito, a este foro le faltan smileys, son muy sosos).

Veo la lógica, pero siguiendo tu forma de expresarte, a menos que no te haya entenido (lo cual es perfectamente posible, jeje, especialmente porque no terminaste de escribir el primer párrafo), tu esquema está mal, si quiero sacar una partitura de la biblioteca se apaga la luz porque tengo que pasar en el otro sentido.

Creo que la solución sería poner un sensor que al entrar active el relé y como pone Mar1n0, ya no mida manteniendo el relé alctivado.
Un segundo relé, que podría ir en el marco de la puerta a cierta altura (mi mujer es más bajita que yo, y los perros también, claro) desactiven el relé al volver a pasar.

El defecto es que si llega a casa un amigo, le tengo que decir que no entre porque se apagará la luz, jajajaja.

Como siempre, lo mismo la solución es simple, pero ahora mismo no la veo, jeje

EL método que te suguiero no funciona como tu lo estas explicando sino de éste modo:

Tienes dos sensores sean barreras IR o ultrasónicos, separados una pequeña distancia tal que se detecte el cambio en uno u otro sentido.

Imagina (en mi esquema) que los dos sensores se llaman I y D.

Cuando interrumpes un sensor se pondrá en 1 y cuando no en 0.
Entonces una persona que entra hara

sensor I D
antes 0 0
entra 0 1
luego 1 1
luego 1 0
luego 0 0

Se ve entonces que hay una secuencia y ésta se repite si entra 1 o 20 personas.
En cambio si una persona sale la secuencia será

sensor I D
antes 0 0
entra 1 0
luego 1 1
luego 0 1
luego 0 0

Como ves son completamente diferentes y de nuevo... con este método sabras que hay 1 o N personas
Entonces si hay 1 persona enciendes la Luz pero mientras haya personas no la apagas.
Y claro no lo haces hasta que haya 0 personas.

Ahora esta mejor?

Es mas fácil verlo en un diagrama de tiempos pero es similar a como se detecta para donde gira un enconder.
Son dos ondas cuadradas defasadas. Cual este mas adelantada determina el sentido de desplazamiento del objeto.

Editado : lo encontré asi que mejoro la respuesta.

Aca se ve.. imagina que A es el sensor Derecho y B es el sensor IZQUIERDO.
Se ve claramente cada estado.

Eso es fácilmente programable y no tendras fallos.

Y por qué no implementas lo que comenta surbyte pero en la puerta de la cabina? De este modo cuando vayas a por una partitura no cruzaras los ultrasónicos.

Otra opción, aunque un poco mas cara es este sensor. Lo tienes en Rs/farnell/mouser por unos 35-50€. Es carete pero es un buen juguete, es un detector de presencia por niveles de temperatura, vamos una camara termográfica. Funcionan por i2C. Yo los estoy mirando para comprarlos para hacer una casa inteligente y la verdad que pintan bien, aun no los he probado para decirte que funcionan perfectamente pero pinta de ello tienen.

Con esto te detectaría mientras estuvieses en la cabina y al irte y decrementar la tempera se desconectaría todo.

Otro tema: Dices de cortar o dar alimentación a la cabina en función de tu presencia, también entraría esa toma de 220 dentro de la cabina? Porque sin alimentación los sensores no te van a detectar.

Un saludo!