Dificultad con sustituir delay por millis

no consigo sustituir con "millis" los tiempos igual que hago con delay pero se interrumpe la deteccion del sensor laser

Nou-20200512-9_14.ino (3.3 KB)

enum { On = LOW, Off = HIGH };

#define But1    A1
#define But2    A2
#define But3    A3

byte           butPins [] = { But1, But2, But3 };
byte           butSt   [sizeof(butPins)];
unsigned long  butDbnc [sizeof(butPins)] = { };

#define Led1    10
#define Led2    11
#define Led3    12
#define Led4    13

byte ledPins [] = { Led1, Led2, Led3, Led4 };
#define Npins   sizeof(ledPins)

#define Dly1    250

byte           patLed_1 [] = { Led1, Led1, Led1, Led1, Led1, Led1 };
unsigned long  patDly_1 [] = { Dly1, Dly1, Dly1, Dly1, Dly1, Dly1 };
byte           patSt_1  [] = { On,   Off,  On,   Off,  On,   Off };

int            idx = 0;
char           s [80];
unsigned long  msec;

// -----------------------------------------------------------------------------
void
setup (void)
{
    Serial.begin (9600);

    for (unsigned n = 0; n < sizeof(butPins); n++)  {
        pinMode (butPins [n], INPUT_PULLUP);
        butSt [n] = digitalRead (butPins [n]);
    }

    for (unsigned n = 0; n < Npins; n++)  {
        digitalWrite (ledPins [n], Off);
        pinMode (ledPins [n], OUTPUT);
    }
}

// -----------------------------------------------------------------------------
void
pattern (
    byte           *pLed,
    unsigned long  *pDly,
    byte           *pSt,
    int            *pIdx,
    int             size )
{
    if (size <= *pIdx)
        return;

    static unsigned long msecLst = 0;

    if (0 == *pIdx && 0 == msecLst)  {
        msecLst = msec;
        digitalWrite (pLed [*pIdx], pSt [*pIdx]);

#if 0
        sprintf (s, "%s: begin msec %ld, msecLst %ld, idx %d",
            __func__, msec, msecLst, *pIdx);
        Serial.println (s);
#endif
        return;
    }

    if (msec - msecLst > pDly [*pIdx])  {
        msecLst = msec;
        ++*pIdx;
        digitalWrite (pLed [*pIdx], pSt [*pIdx]);

#if 1
        sprintf (s, "%s: begin idx %d, msec %ld", __func__, *pIdx, msec);
        Serial.println (s);
#endif
    }
}

// -------------------------------------
int
getBut (
    int  butIdx )
{
    if (msec < butDbnc [butIdx])
        return Off;

    byte but = digitalRead (butPins [butIdx]);

    if (butSt [butIdx] != but)  {
        butSt [butIdx]   = but;
        butDbnc [butIdx] = msec + 50;

        return (On == but);
    }

    return Off;
}

// -------------------------------------
void
loop (void)
{
    msec    = millis ();

    pattern (patLed_1, patDly_1, patSt_1, &idx, sizeof(patLed_1));

    if (On == getBut (1))
        idx = 0;

    if (On == getBut (0))  {
        sprintf (s, "%s: button press %ld msec", __func__, millis());
        Serial.println (s);
    }
}

: o : smiley-confuso:

dijiste "la detección del sensor láser se interrumpe".

Intenté mostrar cómo se podía lograr la detección de un borde en cualquier momento mientras alternaba las salidas con un patrón arbitrario.

no está claro qué pretende hacer sensorlaser () además de hacer eco de su entrada en una salida

Moderador
Por favor edita tu post inicial agregado el código con etiquetas ya que tienes menos de 9k en el adjunto y debe verse de acuerdo a las normas.
Creo suponer que posteaste en el foro en inglés y te han movido el hilo a este foro, porque los participantes no son foreros que acostumbro ver.
Si posteas en el foro en inglés, debes usar Inglés.
Si usas español, tienes este foro.

Normas del foro