Barrera de altura 3 fotocélulas

Buenas tardes.
Soy nuevo en el tema de Arduino y estoy intentado crear un proyecto para que con unas fotocélulas genere un código de salida.
Es para un medidor de altura.

El problema que tengo es que cuando se tapan 2 de las fotocélulas se me encienden los leds asignados a las 2 fotocélulas a la vez y querría que solo se encendiera la de mayor altura.

¿Es posible hacerlo?¿ Y donde puedo conseguir algún tutorial que me explique sobre ese tipo de programación?

Gracias de antemano y espero no meter la pata con esta pregunta.

Cuando enciendas el primero dile que también apague el segundo, cuando enciendas el segundo que apague los otros dos y cuando enciendas el tercero que apague el segundo, (subida y bajada).

Esto es cuestión de lógica y de pensar, ningún tutorial te lo va ha enseñar, en ellos te enseñaran los diversos comandos existentes con algún sencillo ejemplo de aplicación, pero el resto esta en tu mente.

Un buen tutorial, al menos con el que empecé: 30 PROYECTOS CON ARDUINO.

Gracias por contestar.
El problema que tengo es que si voy tapando 1 a 1 todo perfecto, en el momento que tapo las 2 o las 3 se fotocélulas me da todas las señales a la vez.
No sé si puedo pasar el código y le echéis un ojo.

Pasalo.


 

/**

   Arduino Electronic Safe

 

   Barrera fotoeletrica 3 señales

 

*/

 

const int LEDD0=2;

const int LEDD1=3;

const int LEDD2=4;

const int LEDD3=5;

const int LEDD4=6;

const int LEDD5=7;

const int LEDD6=8;

const int LEDout=13;

const int BOTON50=10;

const int BOTON320=11;

const int BOTON455=12;

int val;

void setup(){

pinMode(LEDD0,OUTPUT);

pinMode(LEDD1,OUTPUT);

pinMode(LEDD2,OUTPUT);

pinMode(LEDD3,OUTPUT);

pinMode(LEDD4,OUTPUT);

pinMode(LEDD5,OUTPUT);

pinMode(LEDD6,OUTPUT);

pinMode (LEDout,OUTPUT);

pinMode(BOTON50, INPUT);

pinMode(BOTON320, INPUT);

pinMode(BOTON455, INPUT);}

 

void loop(){

  /*altura 50*/

val=digitalRead(BOTON50);

if  (val==HIGH){

digitalWrite(LEDD0,HIGH);

digitalWrite(LEDD1,HIGH);

digitalWrite(LEDD2,HIGH);

digitalWrite(LEDD3,HIGH);

digitalWrite(LEDout,HIGH);

}

else { digitalWrite(LEDD0,LOW);

digitalWrite(LEDD1,LOW);

digitalWrite(LEDD2,LOW);

digitalWrite(LEDD3,LOW);

digitalWrite(LEDout,LOW);

}

/*altura 320*/

val=digitalRead(BOTON320);

if  (val==HIGH){

digitalWrite(LEDD5,HIGH);

digitalWrite(LEDD6,HIGH);

digitalWrite(LEDout,HIGH);

}

else { digitalWrite(LEDD5,LOW);

digitalWrite(LEDD6,LOW);

digitalWrite(LEDout,LOW);

}

/*altura 455*/

val=digitalRead(BOTON455);

if  (val==HIGH){

digitalWrite(LEDD1,HIGH);

digitalWrite(LEDD2,HIGH);

digitalWrite(LEDD4,HIGH);

digitalWrite(LEDD5,HIGH);

digitalWrite(LEDD6,HIGH);

digitalWrite(LEDout,HIGH);

}

else { digitalWrite(LEDD1,LOW);

digitalWrite(LEDD2,LOW);

digitalWrite(LEDD4,LOW);

digitalWrite(LEDD5,LOW);

digitalWrite(LEDD6,LOW);

digitalWrite(LEDout,LOW);

}

/*altura 50 Y 320*/

val=digitalRead(BOTON50);

val=digitalRead(BOTON320);

if  (val==HIGH){

digitalWrite(LEDD5,HIGH);

digitalWrite(LEDD6,HIGH);

digitalWrite(LEDout,HIGH);

}

else { digitalWrite(LEDD5,LOW);

digitalWrite(LEDD6,LOW);

digitalWrite(LEDout,LOW);

}

/*altura 50,320 y 455*/

val=digitalRead(BOTON50);

val=digitalRead(BOTON320);

val=digitalRead(BOTON455);

if  (val==HIGH){

digitalWrite(LEDD1,HIGH);

digitalWrite(LEDD2,HIGH);

digitalWrite(LEDD4,HIGH);

digitalWrite(LEDD5,HIGH);

digitalWrite(LEDD6,HIGH);

digitalWrite(LEDout,HIGH);

}

else { digitalWrite(LEDD1,LOW);

digitalWrite(LEDD2,LOW);

digitalWrite(LEDD4,LOW);

digitalWrite(LEDD5,LOW);

digitalWrite(LEDD6,LOW);

digitalWrite(LEDout,LOW);

}

/*altura 50 y 455*/

val=digitalRead(BOTON50);

val=digitalRead(BOTON455);

if  (val==HIGH){

digitalWrite(LEDD1,HIGH);

digitalWrite(LEDD2,HIGH);

digitalWrite(LEDD4,HIGH);

digitalWrite(LEDD5,HIGH);

digitalWrite(LEDD6,HIGH);

digitalWrite(LEDout,HIGH);

}

else { digitalWrite(LEDD1,LOW);

digitalWrite(LEDD2,LOW);

digitalWrite(LEDD4,LOW);

digitalWrite(LEDD5,LOW);

digitalWrite(LEDD6,LOW);

digitalWrite(LEDout,LOW);

}

/*altura 320 y 455*/

val=digitalRead(BOTON320);

val=digitalRead(BOTON455);

if  (val==HIGH){

digitalWrite(LEDD1,HIGH);

digitalWrite(LEDD2,HIGH);

digitalWrite(LEDD4,HIGH);

digitalWrite(LEDD5,HIGH);

digitalWrite(LEDD6,HIGH);

digitalWrite(LEDout,HIGH);

}

else { digitalWrite(LEDD1,LOW);

digitalWrite(LEDD2,LOW);

digitalWrite(LEDD4,LOW);

digitalWrite(LEDD5,LOW);

digitalWrite(LEDD6,LOW);

digitalWrite(LEDout,LOW);

}

}

Has subido el código mal léete Las normas del foro punto 7. Edita tu post.

Creo q ahora está bien.
Tengo el link de un simulador.

No entiendo esa asignacion de leds, ¿ el 3 y 7 no lo usas?.
No se, yo asignaria 0, 1 y 2 para 50m. 3, 4 y 5 para 320m, 6 y 7 para 430.
Veo confusa esa asignacion

Es un poco confuso pero tiene un sentido.
Es para sustituir un barrera de infrarrojos que mide la altura de unas cajas. Tiene 96 diodos leds para dar un código GRAY (parecido a binario).
Yo solo necesito 3 alturas pero tienen su codificación.
La asignación de LED7 se puede eliminar y el LED3 si se usa lo q pasa que hay un error.
Las 3 alturas comparten alguna de las salidas LED.
El problema es que si se tapan 2 de ellas se encienden las de 1 y las de otra.
Edito código para quitar errores

Esto:

val=digitalRead(BOTON50);
val=digitalRead(BOTON320);
val=digitalRead(BOTON455);

Anque parece funcionar, la ultima lectura machaca las dos anteriores. Es preferible crear un par de variables mas para compararlas dentro de los if.
Si te entendi bien:

/**
  Barrera fotoeletrica 3 señales
*/
const int LEDD0 = 2;
const int LEDD1 = 3;
const int LEDD2 = 4;
const int LEDD3 = 5;
const int LEDD4 = 6;
const int LEDD5 = 7;
const int LEDD6 = 8;
const int LEDD7 = 9;
const int LEDout = 13;
const int BOTON50 = 10;
const int BOTON320 = 11;
const int BOTON455 = 12;

int val_50, val_320, val_455;

void setup() {
  pinMode(LEDD0, OUTPUT);
  pinMode(LEDD1, OUTPUT);
  pinMode(LEDD2, OUTPUT);
  pinMode(LEDD3, OUTPUT);
  pinMode(LEDD4, OUTPUT);
  pinMode(LEDD5, OUTPUT);
  pinMode(LEDD6, OUTPUT);
  pinMode(LEDD7, OUTPUT);
  pinMode(LEDout, OUTPUT);

  pinMode(BOTON50, INPUT);
  pinMode(BOTON320, INPUT);
  pinMode(BOTON455, INPUT);
}

void loop() {
  // Lectura fotoresistencias
  val_50 = digitalRead(BOTON50);
  val_320 = digitalRead(BOTON320);
  val_455 = digitalRead(BOTON455);

  // altura 50 /

  if (val_50 == HIGH && val_320 == LOW && val_455 == LOW) {
    digitalWrite(LEDD0, HIGH);
    digitalWrite(LEDD1, HIGH);
    digitalWrite(LEDD2, HIGH);
    digitalWrite(LEDD4, HIGH);
    digitalWrite(LEDout, HIGH);
    apaga_codigo_2 ();
  }

  // altura 320 /

  if (val_50 == HIGH && val_320 == HIGH && val_455 == LOW) {
    digitalWrite(LEDD5, HIGH);
    digitalWrite(LEDD6, HIGH);
    digitalWrite(LEDout, HIGH);
    apaga_codigo_1 ();
  }


  // altura 455 /

  if (val_50 == HIGH && val_320 == HIGH && val_455 == HIGH) {
    digitalWrite(LEDD1, HIGH);
    digitalWrite(LEDD2, HIGH);
    digitalWrite(LEDD4, HIGH);
    digitalWrite(LEDD5, HIGH);
    digitalWrite(LEDD6, HIGH);
    digitalWrite(LEDout, HIGH);
  }

  
  // no se sensa altura
  if (val_50 == LOW && val_320 == LOW && val_455 == LOW) {
    apaga_codigo_1 ();
    apaga_codigo_2 ();
    digitalWrite(LEDout, LOW);
  }

}

void apaga_codigo_1 () {
  digitalWrite(LEDD0, LOW);
  digitalWrite(LEDD1, LOW);
  digitalWrite(LEDD2, LOW);
  digitalWrite(LEDD4, LOW);
}

void apaga_codigo_2 () {
  digitalWrite(LEDD5, LOW);
  digitalWrite(LEDD6, LOW);
}

Perfecto mañana lo pruebo
Muchas gracias

Ya lo he probado y funciona genial.
Muchísimas gracias.

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