User Tag List

Resultados 1 al 4 de 4

Tema: Quiero dejar de usar delay en Arduino

  1. #1

    Fecha de ingreso
    Jul 2006
    Mensajes
    2,929
    Mencionado
    27 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    429
    Agradecer Thanks Received 
    235
    Thanked in
    Agradecido 180 veces en [ARG:2 UNDEFINED] posts

    Quiero dejar de usar delay en Arduino

    Tengo que hacer un código para que se escuche un morse por el buzzer en Arduino, y que al pulsar un botón cambie a otro morse distinto, prácticamente todo lo que veo sobre morse usa la función delay, claro con eso cuando pulso el botón pasa de mí mientras está el delay activo, he visto que la alternativa (y la forma de hacerlo en condiciones) es usar la función millis, pero me lío muchísimo.

    Si alguien se maneja bien a ver si puede echarme una mano, paso un ejemplo del código.
    Spoiler: Ver
    const int buzzerPin = 12; //pin de salida del tono de audio
    const int dotlength = 150; //longitud de un punto en milisegundos
    const int dashlength = dotlength*3; //longitud de una raya en milisegundos
    const int inter = dotlength; //longitud de espaciado entre carácteres
    const int pulsadorpin = 2;
    int pulsador = 1;
    int opcion = 0;
    int freq;

    void setup()
    {
    pinMode(12, OUTPUT);
    pinMode(2, INPUT_PULLUP);
    pinMode(3, INPUT_PULLUP);
    Serial.begin(9600);
    }

    void loop()
    {
    estado_pulsador();
    if (opcion%2==0) prueba();
    if (opcion%2!=0) prueba2();
    }


    void dot(int freq)
    {
    tone(buzzerPin, freq);
    delay(dotlength);
    noTone(buzzerPin);
    delay(inter);
    }

    void dash(int freq)
    {
    tone(buzzerPin, freq);
    delay(dotlength*3);
    noTone(buzzerPin);
    delay(inter);
    }

    void prueba()
    {
    I(150);L(150);E(150);Z(150);L(150);final();
    }

    void prueba2()
    {
    I(90);L(90);E(90);Z(90);L(90);final();
    }

    void estado_pulsador()
    {
    pulsador = digitalRead(2);
    if (pulsador==0) opcion = opcion+1;
    }

    void I(int freq)
    {
    dot(freq);
    dot(freq);
    }

    void L(int freq)
    {
    dot(freq);dash(freq);dot(freq);dot(freq);
    }

    void E(int freq)
    {
    dot(freq);
    }

    void Z(int freq)
    {
    dash(freq);dash(freq);dot(freq);dot(freq);
    }

    void final()
    {
    delay(dashlength*3);
    }


    Mis dotes de programación son menos que mínimos y de hace veinte años, no me echéis las manos al cuello xD
    Tic Tac hijo de poota

  2. #2

    Fecha de ingreso
    Sep 2006
    Ubicación
    Malaga
    Mensajes
    6,298
    Mencionado
    37 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    1,094
    Agradecer Thanks Received 
    1,154
    Thanked in
    Agradecido 801 veces en [ARG:2 UNDEFINED] posts
    Pero solo lees el estado del pulsador en la función estado_pulsador, aunque cambies la función delay hasta que no salga de prueba o prueba2 y pase otra vez por esa función no vas a leer nada.
    No es lo mismo tener diez años de experiencia, que tener un año de experiencia diez veces.

  3. #3

    Fecha de ingreso
    Jul 2006
    Mensajes
    2,929
    Mencionado
    27 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    429
    Agradecer Thanks Received 
    235
    Thanked in
    Agradecido 180 veces en [ARG:2 UNDEFINED] posts
    La leo en Loop, aunque lea el estado en otros sitios, nunca leerá nada mientras esté en modo delay, que es bastante tiempo.
    Tic Tac hijo de poota

  4. #4

    Fecha de ingreso
    Sep 2006
    Ubicación
    Malaga
    Mensajes
    6,298
    Mencionado
    37 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    1,094
    Agradecer Thanks Received 
    1,154
    Thanked in
    Agradecido 801 veces en [ARG:2 UNDEFINED] posts
    ok, lo suyo es que cambies la función Delay por algo así
    Código:
    void wait(uint32_t time)
    {
        // leo el tiempo actual
        uint32_t now = mills();
       // mientras no haya pasado mas de time y no hayas pulsado nada sigo esperando
       // estado_pulsador deberá devolver 0 si no se ha pulsado nada y cualquier otra cosa cuando se pulse el boton
       // de esta forma se cancelara la espera pero se seguirá por los siguientes sonidos, si los quieres cancelar
      // esta función puede devolver 0 si se termina la espera y 1 si se cancela.
        while ( mills() - now < time && !estado_pulsador())
             ;
    }
    No es lo mismo tener diez años de experiencia, que tener un año de experiencia diez veces.

Permisos de publicación

  • No puedes crear nuevos temas
  • No puedes responder temas
  • No puedes subir archivos adjuntos
  • No puedes editar tus mensajes
  •