Sensor Barrera

Tengo un sensor barrera e18-d50nk , lo tengo puesto en el marco de la puerta del baño , lo que quiero es que cuando entro se prenda la luz y cuando salga se apague, el estado de la luz la leeo con bouncer mediente un rele 220 vac. Esto uso para la barrera...

if(barrera == 1 && value3 == 1)
{
if(digitalRead(6) == HIGH) digitalWrite(6, LOW); else digitalWrite(6, HIGH);
}
else if(barrera == 1 && value3 == 0)
{
if(digitalRead(6) == LOW) digitalWrite(6, HIGH); else digitalWrite(6, LOW);
}

pero solo funciona a veces, cuando se le da la gana. Donde esta el error? cualquier cosa paso mas info.

Moderador: Titulo editado. Eliminado "Ayuda.."

Imposible hacerlo con 1 sensor, necesitas dos.
Tienes que detectar una secuencia de S1 a S2 para una acción y la inversa para la contraria.

Con un sensor solo supones, porque imagina esto.
Tu entras, y se enciende pero luego entra alguien mas y se apaga, te vas tu se enciende, se va la otra persona y se apaga. O sea cualquier cosa.

En cambio este sería un posible

S1 S2 todo ocurre en tiemos diferentes
0 0 => no hace nada. Estado de reposo
1 0 => me preparo para encender
1 1 => ahora corta ambos sensores
0 1 => ya dejo de activar el S1
0 0 => se ha completado la secuencia y enciendo la luz

esta sería la secuencia opuesta

S1 S2 todo ocurre en tiemos diferentes
0 0 => no hace nada. Estado de reposo
0 1 => me preparo para apagar
1 1 => ahora corta ambos sensores
1 0 => ya dejo de activar el S2
0 0 => se ha completado la secuencia y apaga la luz

Qué opinas?

Esta muy bien lo que acotas, pero no era la pregunta. Mira poniendo este codigo asi:

if(barrera == 0 && auto6 == 1)
{
  if(digitalRead(6) == HIGH)
  digitalWrite(6, LOW);
  else
  digitalWrite(6, HIGH);
}

Paso la mano por la barrera y aveces prende y aveces no, algo esta fallando.. y no se que es.

Y si pongo este codigo simple funciona perfecto:

if(barrera == 0)
{
  digitalWrite(6, HIGH);
  else
  digitalWrite(6, LOW);
}

Esto hace que al pasar la mano por delante de la barrera esta encienda la luz y cuando la saco se apaga. , pero yo lo que quiero es que quede prendida y cuando vuelvo a pasar si esta prendida que apague.

Gracias por explicarte sobre que es cada cosa.

barrera es el sensor
auto6 no se qué es?
pin 6 controla la lampara por lo tanto auto6 debería ser el estado del rele?

barrera = digitalRead(11); lee el estado del sensor
auto6 es para habilitar la barrera 1 activada 0 apagada. Es decir para cuando no quiero utilizar la luz con la barrera de algun modo la tengo que desactivar.

pin6 controla la lampara del baño.

Si esto te funciona

// define un barreraAnt igual que barrera con el estado anterior
// las supongo bool 
bool barrera, barreraAnt = false;
bool estado, estadoAnt = false;

if (auto6) // si habilito barrera
    if (!barrera && barreraAnt) { // cambio de 1 a 0 en sensor
       estado = !estado;
}
barreraAnt = barrera;

if (estado != estadoAnt)   // hay cambio de estado, cambio la luz
    digitalWrite(6, LOW);
else
    digitalWrite(6, HIGH);

estadoAnt = estado;

Asi no me funciona nada...

int auto6 = 0;
void setup() {
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:
// define un barreraAnt igual que barrera con el estado anterior
// las supongo bool 
bool barrera, barreraAnt = false;
bool estado, estadoAnt = false;

if (auto6 == 1) // si habilito barrera
    if (!barrera && barreraAnt) { // cambio de 1 a 0 en sensor
       estado = !estado;
}
barreraAnt = barrera;

if (estado != estadoAnt)   // hay cambio de estado, cambio la luz
    digitalWrite(6, LOW);
else
    digitalWrite(6, HIGH);

estadoAnt = estado;

}

Definis

int auto6 = 0;

Pense que auto6 la cambiabas de algun modo.

y luego el codigo pregunta por 1, cuando queres que funcione?

Si auto6 no vale 1 esto nunca se ejecuta

if (auto6 == 1) // si habilito barrera
    if (!barrera && barreraAnt) { // cambio de 1 a 0 en sensor
       estado = !estado;
}

y jamás cambia de estado.

Tampoco funciona asi, no veo que declares el ping 11 = barrera.

void setup() {
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:
// define un barreraAnt igual que barrera con el estado anterior
// las supongo bool 
bool barrera, barreraAnt = false;
bool estado, estadoAnt = false;

if (!barrera && barreraAnt) { // cambio de 1 a 0 en sensor
estado = !estado;
}
barreraAnt = barrera;

if (estado != estadoAnt)   // hay cambio de estado, cambio la luz
    digitalWrite(6, LOW);
else
    digitalWrite(6, HIGH);

estadoAnt = estado;

}

Yo te di el código general porque vos no diste ningún código completo, diste unas líneas de código sin variables inicializadas.

Lee el estado de la barrera antes!

Asi seria mi codigo completo.

int barrera = 0;
int barreraAnt = 0;
int estado = 0;
int estadoAnt = 0;

void setup() {
  // put your setup code here, to run once:
pinMode(11, INPUT);
pinMode(6, OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
barrera = digitalRead(11);
if (!barrera && barreraAnt) { // cambio de 1 a 0 en sensor
estado = !estado;
}
barreraAnt = barrera;

if (estado != estadoAnt)   // hay cambio de estado, cambio la luz
    digitalWrite(6, LOW);
else
    digitalWrite(6, HIGH);

estadoAnt = estado;
}

Tambien probe asi pero no tengo resultados... en algo le estoy errando...

ool estado, estadoAnt = false;
bool barrera, barreraAnt = false;

barrera = digitalRead(11);

if (!barrera && barreraAnt) { // cambio de 1 a 0 en sensor
estado = !estado;
barreraAnt = barrera;
}

if (estado != estadoAnt){

    digitalWrite(6, LOW);
    estadoAnt = estado;
}

A ver dime que hace esto

#define LAMPARA   6
#define BARRERA   11

bool barrera     = 0;
bool barreraAnt  = 0;
bool estado       = 0;
bool estadoAnt    = 0;

void setup() {
  // put your setup code here, to run once:
  pinMode(BARRERA, INPUT);
  pinMode(LAMPARA, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  barrera = digitalRead(BARRERA);
  if (!barrera && barreraAnt) { // cambio de 1 a 0 en sensor
      estado = !estado;
      Serial.println(estado?"Barrera ON": "Barrera OFF");
  }
  barreraAnt = barrera;

  if (estado != estadoAnt)   // hay cambio de estado, cambio la luz
      digitalWrite(LAMPARA, LOW);
  else
      digitalWrite(LAMPARA, HIGH);

  estadoAnt = estado;
}

Ahora si! perfecto.

Dime, si hubieras empezado dando todo el código desde el vamos cuantos post crees que hubieramos demorado en resolver esto?

Debes explicarte mejor, y aportar toda la información, no imagines que el error esta en tal o cual parte, porque por esa razón no lo puedes resolver y vienes al foro a pedir consejo.
Y a nosotros tener algo parcial tampoco nos sirve porque nos faltan piezas.

Ahora re lee tu hilo y dime si pudiste hacerlo mejor o no?

Te comento la barrera la monte en el marco de la puerta, pero me di cuenta que al mover la puerta se activa, porque no es un laser, trabaja con angulo, entonces lo puso en el centro de la puerta pero tendria que colocar un espejo en la puerta y que se active cuando pàso y corto la señal entre la barrera y el espejo, pero este sensor nose si se puede hacer algo asi, sino tendre que comprar otro...

Toma una foto para que se entienda.

La señal de la barrera pega contra la puerta, de esta manera siempre esta encendida, por eso te decia de poner una barrera con receptor de punto a punto para que cuando pase y corte la señal se active la luz.

Nunca pensé que estaba de ese modo.
O sea lo usas a modo de switch.

Si, cuando entro corto señal y prende la luz, cuando salgo corto señal y apaga luz.