Go Down

Topic: PUNTERÍA LÁSER (Read 115 times) previous topic - next topic

Bnicol

Estimados,

Tengo desarrollado un juego de tiro al blanco que consta de servomotores que levantan el blanco (90 grados) al iniciar el juego y que al acertar con el puntero láser en el LDR de cada blanco, este ''cae'' a CERO grados (acompañado de sonido) durante un tiempo de 1500 para luego volver a 90 grados y continuar disponible para ser acertado con el láser nuevamente. La duración del juego es de 60000 y al finalizar todos los servos que quedaron ''de pie'' caen a CERO grados. Para resumir, el código que adjunto contiene solamente un LDR/SERVO.

Lo que deseo es que si no se le ha dado en el blanco a un LDR/SERVO durante un tiempo de 3000 y en cualquier momento de los 60000 de duración, este caiga a a CERO grados (sin sonido) y vuelva a 90 grados después de 1500 para estar apto a ser acertado.

Entiendo que hay que hacer esto con varias condiciones IF, acumular MILLIS y actualizarlo. Pero, aquí viene el problema, no se como implementarlo. He buscado muchos ejemplos, documentos y videos, pero mis casi nulos conocimientos en programación, me impiden lograr el resultado deseado.

Solicito la ayuda de ustedes para que me ayuden a completar el código necesario.

Desde ya, gracias por la atención. Espero la ayuda gentil de alguno de ustedes.

Saludos

Code: [Select]

#include <Servo.h>
int sensorPin0 = A0;
int sensor0Value;
byte fin = 0;
int const PLAY=6;
const int BEEP = 11;
const int LEDVERDE = 13;
const int LEDROJO = 12;
Servo myservo2;

void setup() {
myservo2.attach(2);

pinMode(LEDVERDE, OUTPUT);
pinMode(LEDROJO, OUTPUT);
pinMode(PLAY, OUTPUT);
}

void loop() {
   
while (millis() < 60000) {

digitalWrite(LEDVERDE, HIGH);

sensor0Value = analogRead(sensorPin0);
if (sensor0Value < 450){myservo2.write(90); delay(5);
}else {digitalWrite(PLAY,HIGH); delay(5); digitalWrite(PLAY,LOW);
myservo2.write(0); delay(1500);}

  }
  if (!fin) {
    tone(BEEP, 400);
    delay(200);
    noTone(BEEP);
    tone(BEEP, 800);
    delay(200);
    noTone(BEEP);
    tone(BEEP, 3000);
    delay(200);
    noTone(BEEP);
    tone(BEEP, 1500);
    delay(200);
    noTone(BEEP);
    myservo2.write(0);

    digitalWrite(LEDVERDE, LOW);
    digitalWrite(LEDROJO, HIGH);
    delay(15000);
    digitalWrite(LEDROJO, LOW);
    fin = 1;
  }
}


jordi3sk97

Tienes que crear una variable que contenga el tiempo  desde el ultimo acierto.
Al inicio del loop esta variable tiene el valor de milis
En cada loop comparas si su valor + 30000 es superior a milis,
Cuando haya un  acierto tienes que re-asignar a esta variable el valor de milis

surbyte

Primero debes ir a Docuementación => Indice de temas tutoriales => millis() y aprender bien como usarlo.
Hay muchos tutoriales e incluso @victorjam se ha tomado el trabajo de hacer hasta ejercicios y situaciones diversas como la que planteas. Te recomiendo que los leas pero no hagas consultas en un tutorial porque lo desvirtúas.

Cuando domines millis(), vuelve a tu problema.

Go Up