Go Down

Topic: Lanzallamas se queda bloqueado (Read 222 times) previous topic - next topic

PedroPC

Buenos días a tod@s.
Verán he hecho un lanzallamas con un servo y un relay, el tema es que necesito que se encienda el relay, pasen 3 seg. se accione el servo, pasen 2 seg. y se apague el relay, pero que esto se pueda interrumpir en cualquier momento (siga leyendo el código para ver el valor de un botón). He estado leyendo a cerca de millis() pero no consigo entenderlo para adaptarlo a mi código:
Code: [Select]

#include <Servo.h>

Servo myservo;

const int buttonPin = 2;
int buttonState = 0;
const int relay = 9;

void setup()
{
  myservo.attach(5);
  pinMode(buttonPin, INPUT);       
  pinMode(relay, OUTPUT);
}

void loop()
{
  buttonState = digitalRead(buttonPin);
  if (buttonState == HIGH) {     
    digitalWrite(relay, HIGH);
    delay(3000);
    myservo.write(90);
    delay(2000);
    digitalWrite(relay, LOW);
  }
  else {
    myservo.write(0);
    digitalWrite(relay, LOW);
  }
  delay(15);
}

Cualquier ayuda es bienvenida.

Luck_

Hola, voy a intentar echarte una mano, la idea es que el lanzallamas se active la secuencia de segundos al hacer un "click" o mientras mantienes pulsado el "gatillo"?

surbyte

Ve a documentación ¿=> indice de temas tutoriales => millis() y máquinas de estados.

Necesitas de ambos tutoriales para resolver tu problema.
Leelo y luego que lo hagas y confirmes te respondo.

PedroPC

Hola, voy a intentar echarte una mano, la idea es que el lanzallamas se active la secuencia de segundos al hacer un "click" o mientras mantienes pulsado el "gatillo"?
Solo debería funcionar cuando se pulsa el "gatillo"

Luck_

Buenas! A ver.. Soy muy nobel en programación, pero vamos, por lo que me dice sy por lo que leo, el código está bien... Si el objetivo es que cuando este pulsado el botón, haga todo eso, esta OK, y se parará cuando dejes de pulsarlo, no veo necesidad de interrupción, ya que entiendo que es cuando levantas el dedo..


Entonces donde esta el problema, o donde no te estoy entendiendo con exactitud?

Pero yo usaría el "! digitalRead" que ese símbolo significa "negación" o "lo contrario de"
Y metes lo que tienes en el "if" dentro del "else" y lo que hay dentro del "else" en el "if"

En plan, cuando no esté pulsado que haga esto... Y si se pulsa (else) que haga lo que yo quiera..

Pero insisto en que soy nobel.. Igual he dicho algo que este bien.. Pero vamos, que seguro que lo consigues!!

Suerte!

PedroPC

#5
May 21, 2019, 01:45 pm Last Edit: May 22, 2019, 01:00 am by surbyte Reason: No repitas lo que se lee arriba.
El problema es que sí o sí tiene que tragar el delay antes de volver a checkear el botón

Kike_GL

Quote from: PedroPC
El problema es que sí o sí tiene que tragar el delay antes de volver a checkear el botón
No si usas millis().
Saludos, Kike_GL

Luck_

Ahhhh, es verdad, maldito delay!! Es un problema... Entonces coincido (inevitablemente) :D con los compañeros, si el programa quieres hacer funcionar, Millis tendras que usar!

Un saludete!

RIG

#8
May 24, 2019, 07:43 am Last Edit: May 24, 2019, 07:44 am by RIG
Que tal así?
pruebalo esto debe funcionar

Code: [Select]

#include <Servo.h>

Servo myservo;

const byte buttonPin = 2;
bool buttonState, anterior;
const byte relay = 9;
unsigned long t1;
byte estado;

void setup()
{
  myservo.attach(5);
  pinMode(buttonPin, INPUT);       
  pinMode(relay, OUTPUT);
}

void loop()
{
  buttonState = digitalRead(buttonPin);
 
  if (buttonState) {     
      if(!anterior)
        estado=1;
      }

  else
    estado=0;     
anterior=buttonState;
     
        switch (estado) {
            case 1:
             digitalWrite(relay, HIGH);
             t1=millis();
             estado=2;
              break;

            case 2:
            if(millis()-t1 >= 3000UL){
               myservo.write(90);
               estado=3;
               t1=millis();
               }
              break;

             case 3:
              if(millis()-t1>= 2000UL){
              digitalWrite(relay, LOW);
               }
             break;

            default:
            myservo.write(0);
            digitalWrite(relay, LOW);
        }

     


Go Up