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

El marco de la puerta es estrecho como para poner dos sensores, creo que el único sitio posible sería a la derecha de la entrada:

Mediría solo en caso de distancias cortas, o sea por ejemplo colocado a la altura de la cabeza, solo cuando las distancias medidas sean aprox de 40 o 50 cm (considerar que el espacio es pequeño y al moverme dentro de la cabina podría activar la secuencia muchas de veces)

surbyte:
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.

Pregunta 1: ¿Cuál es la distancia MÍNIMA posible entre ambos sensores para poder registrar esa secuencia?

Pregunta 2: Supongo que también habrá que guardar una cierta distancia entre la librería y el primer sensor, lo mismo entre el marco y el segundo sensor (bueno, eso seguramente se obtiene probando, pero lo digo de cara a que el espacio solo tiene 23 cm y cada sensor HC-SR04 mide 4,5 cm de ancho).

Pregunta 3: Para programarlo usarían la función millis()? (Si alguien quiere poner un pequeño ejemplo se apreciaría, jeje)

Y si entras acompañado de alguien?

El marco de la puerta es estrecho como para poner dos sensores

y si lo implementas con films resistivos? Pones uno fuera de la cabina, a la entrada, ha de ser bastante grande, en plan alfombrilla, y otro justo detrás de la puerta, dentro de la cabina.

De esta manera en vez de ultrasonidos detectas la secuencia al pisarlo.

elduino:
Y si entras acompañado de alguien?

Antes que nada aclaro que suelo ser bastante despistado, pero entiendo que si entran dos, siguiendo a surbyte, pues registra dos entradas, hasta que no registre dos salidas no corta al relé.

Danicap:
y si lo implementas con films resistivos? Pones uno fuera de la cabina, a la entrada, ha de ser bastante grande, en plan alfombrilla, y otro justo detrás de la puerta, dentro de la cabina.
De esta manera en vez de ultrasonidos detectas la secuencia al pisarlo.

Uy uy uy! creo que se me escapa tanta sofisticación, jaja. Es broma, claro. También me recomendaste ese sensor de temperatura.

Es que me hace ilusión utilizar los ultrasónicos (mentira, es que ya los compré, y no sé si conoces ese dicho que dice "difícil cambiar de caballo en medio del río".

Es que es una pequeña cabina que ocupa 1/3 de una habitación de mi vivienda (el estudio) y alrededor se mueve mi familia y dos perros que cuando ven algo en el suelo lo interpretan como un juguete o en el peor de los casos (son dos machos, sé lo que digo) lo mean.

Ahora mismo creo que la mejor opción son dos sensores que sigan la secuencia que puso más arriba surbyte de "secuencia encendido" más "contador de personas" más "secuencia de apagado" menos "contador de personas". Cuando el contador dá cero se apaga.

Luego, leyendo los consejos y opiniones que han puesto, se me ha ocurrido que quizá una opción váida, especialmente considerando el tamaño pequeño del habitáculo, que hace que accidentalmente haga mediciones erróneas al moverse dentro de ella, sería poner uno o dos sensores lo más cerca posible entre ellos (cuánto?) en un sitio donde pasando la mano cerca, a unos pocos centímetros primero active el relé y al siguiente paso de la mano lo desactiva, y colocado en un sitio donde no se pueda pasar tan cerca. Capisce?

Es que me hace ilusión utilizar los ultrasónicos

Ya se como me dices jejeje, otra idea que se me acaba de ocurrir... y si pones los ultrasonidos en el techo de la cabina apuntando al suelo? ahi podrías hacer la secuencia de entrada/salida perfectamente justo delante de la puerta.

Danicap:
y si pones los ultrasonidos en el techo de la cabina apuntando al suelo? ahi podrías hacer la secuencia de entrada/salida perfectamente justo delante de la puerta.

Si, ya lo había pensado, en caso de poner dos sensores que midan la entrada, cuenten y luego apaguen cuando el conteo dé cero, es el mejor sitio, es del mismo material que los muros, a 2,20 m de alto, el problema es que si has mirado las medidas de la cabina (2,40 m x 1 m) y si le restas 60 cm del escritorio y 25 cm de la librería, te queda un espacio de poco más de metro y medio (y estrecho) para moverse, que tampoco es un lugar para moverse mucho, claro, en general estoy sentado en un taburete alto, pero y si inadvertidamente al ir hacia la librería (o al regresar al taburete), con el hombro se activa el sensor de alguna manera que, o cuente más personas y al salir no corte, o que reste y corte estando dentro?

La idea de pasar la mano a pocos cm de uno o dos sensores (en un sentido para encender y en el sentido contrario para apagar) creo que vá siendo la más práctica en relación al problema del pequeño espacio.
Sería como tener un interruptor general pero que se active solo con pasar la mano.
Esperaría que algún buen samaritano me pusiera un par de líneas de programación, sería utilizando millis() para saber si se activa primero uno y luego el otro?
Por las dudas repito lo que pregunté más arriba, cuál es la distancia mínima de separación entre ambos sensores para que no se interfieran?

Por las dudas repito lo que pregunté más arriba, cuál es la distancia mínima de separación entre ambos sensores para que no se interfieran?

Con unos 10cm te debe dar de sobra.

Esperaría que algún buen samaritano me pusiera un par de líneas de programación, sería utilizando millis() para saber si se activa primero uno y luego el otro?

Lo puedes hacer habilitando flags, no te hacen falta millis para nada

if (sensor1 && !flag2)  //Se activa el 1 sensor sin haberse activado el 2 (inicio secuencia de entrada)
{
    flag1 = 1;
}
if (sensor2 && !flag1)  //Se activa el 2 sensor sin haberse activado el 1 (inicio secuencia de salida)
{
    flag2 = 1;
}
if (sensor1 && flag2)  //Secuencia de entrada - se acciona 1 y luego 2
{
    flag1 = 0;
    flag2 = 0;
    encender();
}
if (sensor2 && flag1)  //Secuencia de salida - Se acciona 2 y luego 1
{
    flag1 = 0;
    flag2 = 0;
    apagar();
}

Algo así, habría que revisarlo y darle una vuelta que lo he hecho rápido.

Y si entras acompañado de alguien?

Lo preguntaba, ante la duda de si el sistema será lo suficientemente preciso, y al ir juntos no los contara como uno.

elduino:
Y si entras acompañado de alguien?

Si entran dos juntos no va a detectar dos sino uno y al salir alguno de los dos, apagará las luces.
FALLO!!!

Asi que aprenderás a no entrar abrazado con alguien o simplemente se cortes y lo dejas pasar. Sin saber el acompañante cual es la razón pero tu si.

Otro método es mas elaborado. Vi un sistema que no recuerdo bien pero croe que se llama Domoticz (luego confirmo). Pues entre las cosas que puedes usar estan las cámaras Web y esto es algo que una camara Web con el programa aparopiado sabrá contar sin fallas. No importa como pases la puerta no va a errar cuantas personas lo hicieron, ahora escapa a Arduino. Hablo de PC/Mac/Linux o bien un Rpi.

Gracias por el código Danicap, me lo estudiaré.

Finalmente creo que lo mejor es poner dos ultrasónicos juntitos, en un sitio donde inadvertidamente no se pueda pasar muy cerca, y activarlos pasando la mano a 4 o 5 cm, en un sentido para activar y en el opuesto para desactivar.
Empezaré a hacer las pruebas y ya lo postearé, incluso con fotitos de la cajita chula que le pienso hacer en madera :wink:

surbyte:
Asi que aprenderás a no entrar abrazado con alguien o simplemente se cortés y lo dejas pasar. Sin saber el acompañante cual es la razón pero tu si.

Por aquí se suele decir "mariconadas las justas", jajaja.

Además, con los dos sensores, si vienes con alguien que no conoce la cabina, se impresiona doblemente, primero porque está íntegramente tapizada con alfombra roja (no es por gusto, estaba en oferta en el Leroy Merlín, jeje) y segundo porque pasando la mano se enciende todo.
Y ya ni qué decir cuando me escucha tocar Jazz con mi saxo, pero eso ya es para presumir aquí, espero surbyte que por esto no me mandes el post a la sección "Humor y Debate", que ya te conozco... jaja!!!

Danicap, podrías ampliarme un poco el tema de los flags?
Es que le doy vueltas al tema y no me aclaro.
Surbyte, se entiende tu explicación de los estados por los que pasa el sensor Izq y el Dcho pero pones que es fácilmente programable pero no logro implementarlo en el sketch.
Si creo una variable de 8 bits, según tu explicación del post #18 en una dirección sería "01111000"
y el la opuesta "10110100", según como se van activando los dos sensores, con la función bitWrite() podría ir reemplazando las posiciones del byte y luego según el estado apagar o encender el relé.
Pero hasta ahí llego...

A ver si algo así podría funcionar, lo que sucede es que he puesto unos delays() suponiendo que debe pasar un tiempo mínimo entre medición y medición, en relación con la velocidad con que se mueve la mano por delante de los dos sensores, que se activan cuando miden 5 cm o menos:

long distanciaIzq; 
long distanciaDcho; 
long tiempoIzq; 
long tiempoDcho; 
byte condicion = 0b11111111;

void setup()
{
  Serial.begin(9600);
  pinMode(12,OUTPUT);     //Trigger CABLE BLANCO
  pinMode(8, OUTPUT);     //Relé CABLE GRIS
  pinMode(2, INPUT);      //Sensor1 Izquierdo CABLE AMARILLO
  pinMode(3, INPUT);      //Sensor2 Centro CABLE AZUL
}
void loop()
{
  ActivaSensor();
  tiempoIzq=pulseIn(2, HIGH);   distanciaIzq = int(0.017*tiempoIzq);
  Serial.print("distanciaIzq ");  Serial.print(distanciaIzq); Serial.println(" cm");
  delay(10);
  ActivaSensor();
  tiempoDcho=pulseIn(3, HIGH);   distanciaDcho = int(0.017*tiempoDcho);
  Serial.print("distanciaDcho ");  Serial.print(distanciaDcho); Serial.println(" cm");
  delay(10);
 
  if (distanciaIzq<=5)  {bitWrite(condicion,7,1);}
  else                  {bitWrite(condicion,7,0);}
  if (distanciaDcho<=5) {bitWrite(condicion,6,1);}
  else                  {bitWrite(condicion,6,0);}
  delay(x);
  if (distanciaIzq<=5)  {bitWrite(condicion,5,1);}
  else                  {bitWrite(condicion,5,0);}
  if (distanciaDcho<=5) {bitWrite(condicion,4,1);}
  else                  {bitWrite(condicion,4,0);}
  delay(x);
  if (distanciaIzq<=5)  {bitWrite(condicion,3,1);}
  else                  {bitWrite(condicion,3,0);}
  if (distanciaDcho<=5) {bitWrite(condicion,2,1);}
  else                  {bitWrite(condicion,2,0);}
  delay(x);
  if (distanciaIzq<=5)  {bitWrite(condicion,1,1);}
  else                  {bitWrite(condicion,1,0);}
  if (distanciaDcho<=5) {bitWrite(condicion,0,1);}
  else                  {bitWrite(condicion,0,0);}

  if (condicion=0b10110100;)
    {digitalWrite(8, 1);  Serial.println("RELAY CONECTADO");}
  elseif (condicion=0b01111000;)
    {digitalWrite(8, 0);  Serial.println("RELAY DESCONECTADO");}
  delay(1000);
}
void ActivaSensor()
{
digitalWrite(12,LOW);delayMicroseconds(5);
digitalWrite(12, HIGH);delayMicroseconds(10);
digitalWrite(12, LOW);
}

Podrá ser así?

El código es mas simple si se quiere y lleva la cuenta de lo que entra y lo que sale.
Dos sensores S1 y S2, en tu caso tu tendras un umbral de detección que dirá que hay un objeto que lo interfiera a cierta distancia.

Llamo S1 al primer Sensor y S2 al segundo
Como te indiqué la tabla de verdad solo debemos ver transiciones de ambos sensores ponderados o sea con peso binario.
Si S1 es el menos significativo y S2 el mas Significativo tendremos

S2 S1
0 0 = 0 en decimal
0 1 = 1 en decimal
1 0 = 2 en decimal
1 1 = 3 en decimal

Veamos ahora el código
Un código rápido pero debería trabajar con algun ajuste del umbral

#include <NewPing.h> // https://bitbucket.org/teckel12/arduino-new-ping/downloads/
 
#define TRIGGER_PIN1 12
#define ECHO_PIN1    11

#define TRIGGER_PIN2 10
#define ECHO_PIN2     9

#define MAX_DISTANCE 200
bool S1, S2;
byte estado = 0, anterior;
byte cantPersonas = 0;
 
NewPing sonar1(TRIGGER_PIN1, ECHO_PIN1, MAX_DISTANCE);
NewPing sonar2(TRIGGER_PIN2, ECHO_PIN2, MAX_DISTANCE);
 
void setup() {
  Serial.begin(115200);
}
 
void loop() {
  char buffer[20];
  
  anterior = estado;
  if (sonar1.ping_cm() < 100) 
      S1 = 1; // hay objeto
  else 
      S1 = 0; // no hay objeto

  if (sonar2.ping_cm() < 100) 
      estado = 2+S1; // hay objeto
  else 
      estado = S1; // no hay objeto      

  // Serial.print("Ping: ");
  // Serial.print(sonar.ping_cm());
  // Serial.println("cm");

  if (anterior == 2 && estado == 3) {
     cantPersonas++;
     sprintf(buffer, "Hay %d personas", cantPersonas);
     Serial.println(buffer);

  }
  if (anterior == 3 && estado == 2) {
     cantPersonas--;
     sprintf(buffer, "Hay %d personas", cantPersonas);
     Serial.println(buffer);
  }
}

Pues después de estar haciendo pruebas con los sensores colocados en diferentes sitios, he llegado a la conclusión que para un espacio tan pequeño, la mejor solución es colocar dos sensores que se activan al mismo tiempo al acercar la mano (distancia menor de 10 ó 12 cm), y activan un relé hasta que los sensores vuelven a registrar esas distancias mínimas.

En teoría podría funcionar con un solo sensor, pero he visto que a veces dá mediciones erróneas, incluso cero (no sé la razón) y con dos sensores elimino el problema, por lo menos en las pruebas que he hecho, de varias horas así ha sido.

He elegido un sitio donde no sea posible acercar inadvertidamente un objeto, en mi caso, entre la parte interna del marco de la puerta (en la parte alta), y el mueble librero, donde hay una distancia entre los sensores y la librería de 23 cm, al pasar la mano a menos de 12 cm se activa/desactiva el relé.

Agradezco a los compañeros como surbyte o Danicap, que me ofrecieron soluciones más "sesudas" pero creo que la que he elegido es práctica (y espero que segura).

De todas formas, supongo que alguna de las alternativas servirá para otros compañeros que busquen resolver problemas similares.

Y por si puede ser de utilidad para alguien, pongo el sketch, que en realidad es simple:

/*Programa que activa un relé que conecta la entrada eléctrica a una cabina insonorizada.
 *Funciona con un Arduino Nano y dos sensores ultrasónicos HC-SR04, activando un relé cuando
 *las mediciones de ambos 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 sensores
*/

#define Gatillo1 11     //Trigger del sensor 1 (cable blanco)
#define Gatillo2 12     //Trigger del sensor 2 (cable gris)
#define Relay 8         //El pin que activa el relé
#define Eco1 2          //Echo del sensor 1 (pin 2 cable amarillo)
#define Eco2 3          //Echo del sensor2 (pin 3 cable azul)
long Distancia1; 
long Distancia2; 
long Tiempo1; 
long Tiempo2;
int ActivarRelay=0;     //Muestra el estado del relé (0 apagado, 1 encendido)

void setup()
{
  Serial.begin(9600);             //Comienzo de la comunicación serie
  pinMode(Gatillo1, OUTPUT);      //Trigger1 CABLE BLANCO
  pinMode(Gatillo2, OUTPUT);      //Trigger2 CABLE GRIS
  pinMode(Relay, OUTPUT);         //CABLE ROJO (+) Y CABLE VERDE (-)
  pinMode(Eco1, INPUT);           //Sensor1 Izquierdo CABLE AMARILLO
  pinMode(Eco2, INPUT);           //Sensor2 Centro CABLE AZUL
  digitalWrite(Relay, 0);         //Inicia el programa con el relé apagado
}

void loop()
{
  ActivarSensores(1);//Función que activa los 2 sensores (si el argumento es 1 imprime
  if ((Distancia1<12 && Distancia2<12) || (ActivarRelay==1))
    {ActivarRelay=1;digitalWrite(Relay, 1);Serial.println("220v ON");delay(1000);}
  else
    {Serial.println("220v OFF");delay(1000);}
  ActivarSensores(0); 
  if ((Distancia1<10 && Distancia2<10) && (ActivarRelay==1) )
    {digitalWrite(Relay, 0);  Serial.println("220v OFF");ActivarRelay=0;delay(1000);}
}

void ActivarSensores(int x)
{
digitalWrite(Gatillo1, 0);delayMicroseconds(3);
digitalWrite(Gatillo1, 1);delayMicroseconds(10);
digitalWrite(Gatillo1, 0);
Tiempo1=pulseIn(Eco1, 1);   Distancia1 = int(0.017*Tiempo1);
delay(10);
digitalWrite(Gatillo2, 0);delayMicroseconds(3);
digitalWrite(Gatillo2, 1);delayMicroseconds(10);
digitalWrite(Gatillo2, 0);
Tiempo2=pulseIn(Eco2, 1);   Distancia2 = int(0.017*Tiempo2);

if (Distancia1 == 0)     // Alguna vez los sensores dan cero en alguna 
  {Distancia1 = 30;}     // medición (?) 
if (Distancia2 == 0)     // En ese caso lo cambio a la distancia que mide
  {Distancia2 = 30;}     // de forma habitual

if (x==1)
  {Serial.print("Distancia 1 --> ");  Serial.print(Distancia1); Serial.println(" cm");
   Serial.print("Distancia 2 --> ");  Serial.print(Distancia2); Serial.println(" cm");}
}

Lleva 10 días funcionando sin problema, tenía alguna reserva pensando que por efecto de alguna interferencia o ruido electromagnético podría activarse solo el arduino, o por influencia del equipo de audio de la cabina podía desactivar inadvertidamente el relé, pero como digo, lo he probado y vá bien,
("hombre de poca fé" jaja).
Leyendo hace unos días en relación a interferencias y ruidos, podría haber utilizado un solo sensor promediando por ejemplo 100 mediciones, de manera de minimizar alguna medición "desviada", pero bueno, ya está y funciona sin fallos.

Hi,
Yo tengo una sugerencia en vez de usar un detector de distancia porque no usas un detector de movimiento de cuerpo. Lo que se conoce como "Mini IR Infrared Pyroelectric PIR Body Motion Human Sensor Detector Module" Este sensor detecta movimientos. Cada ves que el sensor detecta movimentos envie una senal. Tambien mientras hay movimiento el sensor extiende la senal de salida. En tu pojecto lo puedes usar midiendo el timpo que ocuren los movimintos. Por ejemplo si no hay movimiento dentro de 15 minutos significa que no hay nadie en el cuarto y apagas las luces. Adjunto hay un link para que veas lo que te estoy sugeriendo.